# rss_item

guid: d0a0bc2227b399bd1f118d056c5024c7e06e733a/everyone_should_learn_some_programming
title: Everyone should learn some programming
url: https://voussoir.net/writing/everyone_should_learn_some_programming
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>Everyone should learn some programming</h1><ol id="table_of_contents">Table of contents<li><a href="#its_easier_than_you_think">It's easier than you think</a></li><li><a href="#why">Why</a><ol><li><a href="#solve_your_own_problems">Solve your own problems</a></li><li><a href="#improve_critical_thinking_problem_solving_and_whatif_skills">Improve critical thinking, problem solving, and what-if skills</a></li><li><a href="#increase_your_tech_literacy">Increase your tech literacy</a></li></ol></li><li><a href="#how_to_start">How to start</a><ol><li><a href="#javascript">Javascript</a></li><li><a href="#python_and_the_command_line">Python and the command line</a></li><li><a href="#autohotkey">AutoHotkey</a></li></ol></li><li><a href="#thats_enough_reading">That's enough reading</a></li></ol>
<h2 id="its_easier_than_you_think">It's easier than you think<a class="header_anchor_link" href="#its_easier_than_you_think"> (§)</a></h2>
<p>When people look at programming, they tend to say "That looks so complicated! I could never do that!". But you can. As long as you can describe how to do something step by step, then you have the ability to write a program. That's because writing programs is basically just writing down the steps to solve the problem, and letting the computer do it for you. You could follow the steps yourself and get the exact same result. You could even hire a bunch of schoolchildren for pennies on the dollar under the guise of "enrichment" to carry out your dastardly dictations... if you trust them to be as exacting as the computer, that is. Did you know that the word "computer" <a href="https://en.wikipedia.org/wiki/Computer_(job_description)">used to refer to people who did computations</a>?</p>
<h2 id="why">Why<a class="header_anchor_link" href="#why"> (§)</a></h2>
<p>I think that everyone should learn some programming, but I don't think that everyone should become a "programmer". This is like knowing how to put gasoline in your car and air in your tires without being a mechanic; or knowing that protein is good for you and sugar is bad for you without being a nutritionist. Computers and digital files are now involved in just about everything we do, so being comfortable with them automatically improves your ability everywhere else. You will find that knowing a little bit of programming will suddenly be helpful in moments where you didn't expect you'd need it.</p>
<p>Don't think that programming is only for programmers. That's like thinking that reading is only for Literature majors. Capability with computers is the new literacy.</p>
<h3 id="solve_your_own_problems">Solve your own problems<a class="header_anchor_link" href="#solve_your_own_problems"> (§)</a></h3>
<p>Most software we use today is designed to be used by hundreds, thousands, or millions of people. The creators of the software will try to solve the most common problems of the most common users. They'll make something that works "good enough" for almost everybody, though it won't be totally perfect for almost anybody. There will be something you want to do that the software doesn't have a button for. That's your problem, and it's up to you to solve it.</p>
<p>If you use computers at all for work, I'm sure you'll find cases where you wish you could improve the tools you have to work with. Recently, at my workplace, I've been writing javascript bookmarklets to add feature improvements to the web-based tools we have to use, so I get things done faster and more easily. And a lot of office jobs will have you working with a slew of document files, making small changes to each or converting them to some other format. This kind of repetitive task is perfect for programming. I recently wrote about <a href="/writing/inkscape_batch_png_pdf">one such example</a>.</p>
<p>If you don't use computers for work, don't think you're off the hook. Programming will help you become disciplined in efficiency and planning ahead, and will give you a new vocabulary to express concepts you've probably already thought of. Vocabulary like latency versus throughput or bandwidth, parallel versus sequential tasks, the batching of similar tasks, and bringing down overhead. You'll notice real-life examples of abstractions and interfaces in the design and engineering of physical objects and structures.</p>
<p>This is not to guarantee that people will congratulate you on automating something, or promote you for doing it. But if you're working at a job you're not satisfied with, programming can turn a boring, rote, why-dont-they-replace-me-with-a-robot task into a fun puzzle that still winds up saving you time in the end. At any rate, I feel that being a strong critical thinker is its own reward while looking for something better.</p>
<p>I'll give some more of these down below.</p>
<h3 id="improve_critical_thinking_problem_solving_and_whatif_skills">Improve critical thinking, problem solving, and what-if skills<a class="header_anchor_link" href="#improve_critical_thinking_problem_solving_and_whatif_skills"> (§)</a></h3>
<p>When you give instructions to a computer, you have to be pretty specific. They don't exactly think by themselves, and they won't try to figure out what you really mean if your instructions are unclear. You can make a program called <code>add</code> that actually subtracts, and the computer won't notice or care. If you feel that computers are becoming smarter than people, and you're worried about a cyberpocalyptic android takeover of Earth, just trick your computer into saying 7+3=4 and everything will seem okay again. For a while.</p>
<p>This means you'll be the one responsible for deciding if the results of your program actually make sense. You'll be the one ensuring that measurements of distance don't become negative, the clock doesn't show a 61<sup>st</sup> minute, and 7+3=10. You will encounter many unexpected problems while programming, and you will have to solve them. You will accidentally save a new version of the program while continuing to run the old one and wonder why your changes aren't making a difference. You will inadvertently swap left/right with up/down and see the world from a new, more horizontal perspective. You will gain practice in double checking not only your own work but the work of others, to figure out the exact step, possibly one of dozens, where an error was made. If you can combine these troubleshooting habits with good communications skills, you've got the makings to become a teacher, trainer, leader, or manager, wherever you are now.</p>
<p>As you spend more time programming, you'll find your ability to ask "what if" questions improving. In fact, it's very similar to arguing with someone and trying to poke holes in everything they say. Look for the weaknesses: This program divides two numbers; what if I type in zeroes? This program asks me for my birth year; what if I type in 9999 or HAHA? This program opens multiple urls as browser tabs; what if I give it a billion of them?</p>
<p>When you're the one writing the program, that means you need to predict the what-ifs that someone else <a class="footnote_link" data-index="1" href="#footnote_text_1" id="footnote_link_1" title="[1] You might think that if you're only writing programs for yourself to use, it doesn't matter because there is no &quot;someone else&quot;. But just know that in six months you will totally forget how you made everything work, and you'll hope for your own sake that you made it idiot-proof.">[1]</a> might try on your code, and armor up. Are you prepared to divide by zero, or deal with time travelers from the tenth millennium? This will be an exercise in recognizing your own assumptions and challenging them. This skillset will extend to your real life in the way you interpret arguments, politics, news stories, opinion pieces, advertising, and more.</p>
<p>This is why I have a hard time writing articles about my opinions. I am forever poised to either debunk my own claims or what-if my own thoughts, or else slather the whole article with enough disclaimers and qualifiers as to make the original point unintelligible. But this article is supposed to make you <em>want</em> to learn programming, so let's move on.</p>
<p><a class="footnote_text" data-index="1" href="#footnote_link_1" id="footnote_text_1">[1]</a> You might think that if you're only writing programs for yourself to use, it doesn't matter because there is no "someone else". But just know that in six months you will totally forget how you made everything work, and you'll hope for your own sake that you made it idiot-proof.</p>
<h3 id="increase_your_tech_literacy">Increase your tech literacy<a class="header_anchor_link" href="#increase_your_tech_literacy"> (§)</a></h3>
<p>Let's talk about literacy a little more. We are in a transitional period of history. When I was younger, everyone seemed to believe that my generation and all future generations would be naturally good with computers because we've grown up with them in our lives. But, in fact, that book is now shutting as fast as it opened. More and more kids are growing up with <em>smartphones</em> in their lives, but not <em>computers</em>. That shouldn't make a difference, because smartphones are just small computers. The thing is that smartphones were invented and developed from start to finish by corporations who have realized how much money there is to be made in an industry of locked-down devices, walled gardens, and advertising-driven-algorithmically-curated experiences. To continue the literacy metaphor, today's children are growing up with nothing but picture books. Desktop computers, on the other hand, are still carrying their heritage from the before days — the days of inspectibility, customizablilty, and programmability — because they were designed as a tool for solving your problems rather than dominating your attention. And when I say carrying their heritage, I mean reluctantly. Microsoft, Apple, and Google would love to drop desktop programmability in favor of locked-down devices if they could get away with it. They can't, though, because of all the existing software in the world relying on existing systems. Smartphones didn't have that burden, and look where they've ended up.</p>
<p>Learning a little bit of programming can be a breakthrough into realizing that the world of computers is not meant to be a theme park that you just wander around in. Computers and software are made by people just like you, and you are on equal ground with them. You can be an active participant in this world and mold your tools to work the way you want. Computers were designed to do work <em>for you</em>, though corporations will gladly continue to take that power away so they can show you more ads and sell you more junk.</p>
<p>It is liberating to say "This program/website doesn't let me do exactly what I'd like, but that's ok, I'll just fix it myself". You'll start to notice the ways software and publishers want to disempower you, and how you can reclaim the upper hand. Oh, you won't let me right-click the image to download it? That's ok, I've got Inspect Element. Won't let me read the whole article? Let's try spoofing googlebot's useragent. This program doesn't let me choose where it gets installed or stores its files? A few filesystem junctions will put that back in its place. No more waiting around for the software gods at the temple of Goog to eventually fix what's wrong, like you have to do on your smartphone, because you can fix it now.</p>
<p>Throughout history, corrupted leaders have used the illiteracy of their constituents to take advantage of them. This will happen to us digitally, too, if we do not cultivate tech literacy. I do rely on the tech leaders, after all. I'm not able to manufacture my own processors or write my own operating systems, so I need your help in defending what we've got from the current trend of eroding control.</p>
<h2 id="how_to_start">How to start<a class="header_anchor_link" href="#how_to_start"> (§)</a></h2>
<p>Many aspects of computing and programming are interlinked, and it won't be possible to fully understand one part before you know many other parts too. That's okay. Become comfortable with the feeling that you don't understand everything that's going on, because it will be happening a lot. The important thing is to keep growing your web of knowledge and you'll discover how each piece links with the others.</p>
<p>In the beginning, don't buy textbooks. Don't enroll in courses or watch an entire video series. Don't look for a tutor. The first step is to develop your interest and a sense of accomplishment that gives you the motivation to continue. Motivation will be very important, and it comes from achievement. Solving real life problems that are relevant to you, no matter how small, are the perfect way of doing this. I guarantee that writing tiny, simple programs will feel amazing when the result is something that's actually useful and important to you. I am not saying to avoid textbooks forever, but they tend to make you do things that don't feel important yet. Save them for after you've found your footing and want to get a more rounded knowledge of programming as a subject.</p>
<p>Any time you find yourself thinking "doing the same thing over and over again is so boring, I wish I could do it all automatically", this is an immediate sign that you can program it.</p>
<ul>
<li>Moving all these jpegs into the jpeg folder is so boring, ...</li>
<li>Copying all these names from emails into spreadsheets is so boring, ...</li>
<li>Refreshing this store page to see when the product goes on sale is so boring, ...</li>
<li>Cross-referencing the deadlines on this page with the details on this other page is so boring, ...</li>
</ul>
<p>But don't forget to have fun. If you find yourself saying "I wish I had a way to..."</p>
<ul>
<li>... count all the swear words in Tarantino's movies.</li>
<li>... put my face on every movie poster I can get my hands on.</li>
<li>... practice typing with my own sample text.</li>
<li>... get an alert whenever a new post is made on this forum / subreddit.</li>
<li>... make all the text on this page look like Runescape's <code>wave</code> or Comic Sans.</li>
</ul>
<p>that's something else you can program for.</p>
<p>As I said earlier, you can write a program for anything <em>as long as you can describe how to do it step by step</em>. That means that whenever you want to write a program, the first thing you have to do is actually walk <em>away</em> from the computer and think about the problem. Talk through the steps, draw them out on paper, practice them physically, or instruct someone else to perform them as if they were your computer. Don't trick yourself into thinking you can make the computer do things that you yourself don't understand or can't describe. If you get into this mindset, you won't be able to live up to your own expectations which will kill your motivation.</p>
<p>As you try to describe the steps of your program, you will have to figure out how to make the computer understand what you want. You will find yourself searching the internet for "how to count words", "how to read webpage text", "how to only count each thing once", "how to save data to file", "difference between strings and ints and floats", "how to play video/audio file". You should never feel bad about looking these things up. Your job is not to become a memorization machine, but to know your problem and where to find the solution.</p>
<p>You will want a good text editor. I use Sublime Text 2, but I have heard good things about Microsoft's <a href="https://code.visualstudio.com/">VS Code</a>.</p>
<p>If you don't have access to a PC, but you do have an Android smartphone, try <a href="https://termux.com/">Termux</a>. Though, I think you'll want to plug in a real keyboard.</p>
<p>Programs are written in a variety of programming languages. If you want to get started with programming, I recommend the following.</p>
<h3 id="javascript">Javascript<a class="header_anchor_link" href="#javascript"> (§)</a></h3>
<p>Javascript is the language that your web browser uses to make the page interactive. There is also HTML which contains the page content, and CSS which controls how it looks.</p>
<p>When you first start programming, it will be difficult to write a program from scratch. Instead, it will be easier to take an existing program, make a little change, and see what happens. Keep doing that over and over again with bigger and bigger changes, and pretty soon you're writing your own program. This is how I started too.</p>
<p>Well, the great thing about Javascript is that every website you visit already has a program that you can modify and play with! Just right click and choose "Inspect Element", or press F12, and check out the elements, console, network, and more.</p>
<p>Try making <a href="https://en.wikipedia.org/wiki/Bookmarklet">bookmarklets</a>, which are pieces of Javascript code that you can save on your browser's bookmark bar, and then you just click them to activate it. The code goes in the place where you'd normally put the URL. For example, <a href="https://git.voussoir.net/voussoir/else/src/branch/master/Javascript/loopplayall.js">this bookmarklet</a> automatically plays any video element on the page, which is great for forums with a lot of webms, and <a href="https://git.voussoir.net/voussoir/else/src/branch/master/Javascript/tab_renamer.js">this one</a> can rename the current tab, which is great when several tabs have the same name.</p>
<p>Also try making .html files on your computer and opening them in your browser. It's like creating a website without actually having to create a website. For example, <a href="https://git.voussoir.net/voussoir/else/src/branch/master/Javascript/reddit_live_new.html">this page I wrote</a> shows new posts on a subreddit when they're made. You'll be amazed how simple it is to create something that could be described as a "web app".</p>
<p>A word of warning, though. The Javascript community has created dozens and dozens of frameworks and libraries and packages that they say you should use. Don't. For the time being, don't download anything, don't import anything, don't <code>require</code> anything. No jQuery, no React, no nothing. The default javascript tools in your browser are enough to do what you want to do. The low barrier of entry to working with javascript is a great boon, but it also means the internet is overflowing with stuff people have made and shared, and it will be too confusing to navigate it all right now. Just have fun writing what achieves your goal. Stick to the standard stuff, and search <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript">MDN</a> for how to use it. For example, here's the page on <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText">element.innerText</a>.</p>
<h3 id="python_and_the_command_line">Python and the command line<a class="header_anchor_link" href="#python_and_the_command_line"> (§)</a></h3>
<p><a href="https://python.org">Python</a> has been my favorite programming language since I discovered it in 2014. I mentioned Javascript first because the accessibility of getting started is so much higher, but Python is where it's at if you need to write anything that isn't web browser based.</p>
<p>The standard library (modules and tools included with Python when you download it) are very capable so, like Javascript, you shouldn't have to worry about downloading other people's stuff to get started with the very basics.</p>
<p>I use Python for just about every facet of file management on my computer, like <a href="https://git.voussoir.net/voussoir/cmd/src/branch/master/brename.py">renaming all files in a folder</a>, <a href="https://git.voussoir.net/voussoir/cmd/src/branch/master/recycle.py">sending files to the recycle bin</a>, <a href="https://git.voussoir.net/voussoir/cmd/src/branch/master/prune_dirs.py">clearing out empty folders</a>, <a href="https://git.voussoir.net/voussoir/cmd/src/branch/master/extension_summary.py">counting file extensions</a>, and putting together <a href="https://git.voussoir.net/voussoir/cmd/src/branch/master/ffstreams.py">ffmpeg commands</a> that I wouldn't want to write by hand. I also <a href="https://git.voussoir.net/voussoir/cmd/src/branch/master/crop.py">crop</a>, <a href="https://git.voussoir.net/voussoir/cmd/src/branch/master/resize.py">resize</a>, and convert images to <a href="https://git.voussoir.net/voussoir/cmd/src/branch/master/grayscale.py">grayscale</a> or the <a href="https://git.voussoir.net/voussoir/cmd/src/branch/master/icoconvert.py">Windows .ico format</a>. I love writing in Python and I hope you will too.</p>
<p>Once again, you can start by downloading somebody else's program and making small tweaks to it to see what happens. I find this more approachable than starting from a blank screen.</p>
<p>Although text editors and IDEs may let you run Python code within the editor, you will need to get comfortable with the command line to be most effective, so take the time to understand it.</p>
<h3 id="autohotkey">AutoHotkey<a class="header_anchor_link" href="#autohotkey"> (§)</a></h3>
<p><a href="https://autohotkey.com">AutoHotkey</a> is in a different category than most programming languages, but I think it's excellent for programming learners to play around with because it's quite exciting to watch your mouse cursor fly around and do things by itself. For example, I once made <a href="https://git.voussoir.net/voussoir/ahk/src/branch/master/clickerheroes.ahk">an AHK script</a> that would automatically click on the bonus items in Clicker Heroes, and a similar one for emptying my entire backpack into a chest in Minecraft.</p>
<p>The ability to create custom hotkeys really puts the Personal in Personal Computer. I have <a href="https://git.voussoir.net/voussoir/ahk/src/branch/master/volumecontrol.ahk">custom volume buttons</a>, custom <a href="https://git.voussoir.net/voussoir/ahk/src/branch/master/custom_hangul.ahk">English/Korean keyboard swap buttons</a>, and a button for keeping the current window <a href="https://git.voussoir.net/voussoir/ahk/src/branch/master/alwaysontop.ahk">always on top</a>, which makes me feel like a wizard.</p>
<p>Also, AHK scripts tend to be short and sweet, so you don't get stuck on a particular project for too long, which is a good thing for learners. You can learn something, enjoy it, and move on.</p>
<p>The AHK syntax is a bit confusing, and I can never remember which of <code>#</code>, <code>^</code>, <code>!</code>, etc. I need to make my hotkey. But that's why there are <a href="https://www.autohotkey.com/docs/Hotkeys.htm#Symbols">docs</a>.</p>
<h2 id="thats_enough_reading">That's enough reading<a class="header_anchor_link" href="#thats_enough_reading"> (§)</a></h2>
<p>Go get started. Have fun.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/everyone_should_learn_some_programming/everyone_should_learn_some_programming.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/3475cb0abf63172e6392487ffaf41755f71a18e3"><time datetime="2023-09-18T21:01:09-07:00">2023-09-18</time> Replace github links with git.voussoir.net.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/8224052c8cc9d79a3acf832f69fcd46a4d045552"><time datetime="2022-04-07T11:37:43-07:00">2022-04-07</time> Move AHK links to my new repository.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/d0a0bc2227b399bd1f118d056c5024c7e06e733a"><time datetime="2020-08-26T16:25:47-07:00">2020-08-26</time> Add everyone_should_learn_some_programming.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: 4e202b8138b100f29aceabdf717f179427635894/mobile_homepage_html
title: Mobile homepage.html
url: https://voussoir.net/writing/mobile_homepage_html
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<p><a class="tag_link" data-qualname="today_i_did_this" href="/writing/tags/today_i_did_this">[today_i_did_this]</a></p>
<h1>Mobile homepage.html</h1>
<p>I'm not satisfied with the new tab page on Android Chrome. So, I put together an html file that I can use as my own homepage. Here's a comparison:</p>
<p><img alt="" loading="lazy" src="/writing/mobile_homepage_html/comparison.png" title="left: new tab page; right: my home page"/></p>
<p>I don't like the new tab page because:</p>
<ul>
<li>You only get eight links.</li>
<li>You can't rename the links.</li>
<li>You can't rearrange the links.</li>
<li>I will never ever ever ever click to view the suggested content.</li>
<li>The web servers I run on my PC are on different ports, but they keep fighting for the same spot on the new tab page.</li>
</ul>
<p>Unfortunately, new tabs still always go to the new tab page and I have to hit the home button. So while it's not as seamless as I'd like, I can live with the one extra tap.</p>
<p>Here's what I did:</p>
<ol>
<li><p>Create the html file, which is as follows:</p>
<div class="highlight html"><pre><span class="cp">&lt;!DOCTYPE html5&gt;</span>
<span class="p">&lt;</span><span class="nt">html</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span><span class="">Homepage</span><span class="p">&lt;</span><span class="p">/</span><span class="nt">title</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">"UTF-8"</span><span class="p">/</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">name</span><span class="o">=</span><span class="s">"viewport"</span> <span class="na">content</span><span class="o">=</span><span class="s">"width=device-width, initial-scale=1.0"</span><span class="p">/</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">style</span><span class="p">&gt;</span>
<span class="nt">body</span>
<span class="p">{</span>
    <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
    <span class="k">flex-direction</span><span class="p">:</span> <span class="kc">column</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">a</span>
<span class="p">{</span>
    <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
    <span class="k">align-items</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
    <span class="k">justify-content</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
    <span class="k">margin</span><span class="p">:</span> <span class="mi">8</span><span class="kt">px</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">width</span><span class="p">:</span> <span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
    <span class="k">height</span><span class="p">:</span> <span class="mi">50</span><span class="kt">px</span><span class="p">;</span>
    <span class="k">background-color</span><span class="p">:</span> <span class="kc">pink</span><span class="p">;</span>
    <span class="k">border-radius</span><span class="p">:</span> <span class="mi">8</span><span class="kt">px</span><span class="p">;</span>
    <span class="k">font-weight</span><span class="p">:</span> <span class="kc">bold</span><span class="p">;</span>
    <span class="k">font-family</span><span class="p">:</span> <span class="kc">sans-serif</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">div</span>
<span class="p">{</span>
    <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span>
    <span class="k">grid-auto-flow</span><span class="p">:</span> <span class="kc">column</span><span class="p">;</span>
    <span class="n">grid-gap</span><span class="p">:</span> <span class="mi">8</span><span class="kt">px</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">&lt;</span><span class="p">/</span><span class="nt">style</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="p">/</span><span class="nt">head</span><span class="p">&gt;</span>

<span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"https://example.com"</span><span class="p">&gt;</span><span class="">Example</span><span class="p">&lt;</span><span class="p">/</span><span class="nt">a</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">div</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"https://example.com"</span><span class="p">&gt;</span><span class="">Example</span><span class="p">&lt;</span><span class="p">/</span><span class="nt">a</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"https://example.com"</span><span class="p">&gt;</span><span class="">Example</span><span class="p">&lt;</span><span class="p">/</span><span class="nt">a</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="p">/</span><span class="nt">div</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">div</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"https://example.com"</span><span class="p">&gt;</span><span class="">Example</span><span class="p">&lt;</span><span class="p">/</span><span class="nt">a</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"https://example.com"</span><span class="p">&gt;</span><span class="">Example</span><span class="p">&lt;</span><span class="p">/</span><span class="nt">a</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"https://example.com"</span><span class="p">&gt;</span><span class="">Example</span><span class="p">&lt;</span><span class="p">/</span><span class="nt">a</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="p">/</span><span class="nt">div</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="p">/</span><span class="nt">body</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="p">/</span><span class="nt">html</span><span class="p">&gt;</span>
</pre></div></li>
<li><p>Sync it between PC and phone with the amazing <a href="https://syncthing.net">Syncthing</a>.</p>
</li>
<li><p>Set it as the homepage using either <code>file:///storage/emulated/0/&lt;path&gt;/homepage.html</code> or <code>file:///mnt/sdcard/&lt;path&gt;/homepage.html</code>. Despite the name <code>/sdcard/</code>, this path should correspond to internal storage.</p>
<p><strong>Note:</strong> With Android 10's new scoped storage permissions, you may get a permission denied error while opening the page. Your first option is to place the file inside the <code>Android/data/com.android.chrome</code> folder. E.g., an absolute path of <code>file:///storage/emulated/0/Android/data/com.android.chrome/homepage.html</code>.</p>
<p>Alternatively, I was able to bypass the scoped storage system altogether with this <a href="https://developer.android.com/studio/command-line/adb">ADB</a> command: <code>adb shell sm set-isolated-storage off</code> which <strong>rebooted the phone immediately</strong> and may have other consequences. I am not sure how it fares on Android 11.</p>
</li>
</ol>
<p>Recently, I have been trying to use Android Firefox more, since it has extension support and thus uBlock. Astonishingly, Mozilla has <a href="https://old.reddit.com/r/firefox/comments/i5nom6/how_to_edit_homepage_on_android/">removed the ability to set a homepage</a>, which I believe occurred as part of the <a href="/writing/mobile_homepage_html/mozilla_2020_08_25.html">2020-08-25 update</a>. And <a href="/writing/mobile_homepage_html/firefox_ntp.png">their new tab page</a> has an even bigger thing that I won't ever ever ever click on. I'm not sure what's going on over there.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/mobile_homepage_html/mobile_homepage_html.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/27775a3c4ccf26499d848f34f9985b475a8d9474"><time datetime="2022-04-07T15:38:05-07:00">2022-04-07</time> Archive mozilla link.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/9cce9f9ef055a5e268a9b913871ff8d0473cf3eb"><time datetime="2021-06-07T19:08:19-07:00">2021-06-07</time> Move S3 images to my domain.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/e2e819427c491d6f70c39259634d170371001f20"><time datetime="2021-03-21T00:19:46-07:00">2021-03-21</time> com.android.chrome folder is safe under scoped storage.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/51a3362ddb81d60f2f01886ca269d9c4df8692df"><time datetime="2021-03-13T08:32:42-08:00">2021-03-13</time> Add scoped storage note and bypass.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/4e202b8138b100f29aceabdf717f179427635894"><time datetime="2020-09-20T21:27:16-07:00">2020-09-20</time> Add mobile_homepage_html.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: f7109f9ceaa3e31a80c01414b853b9ba56a0e3ee/youtubedl_formats
title: Youtube-dl format code cheatsheet
url: https://voussoir.net/writing/youtubedl_formats
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>Youtube-dl format code cheatsheet</h1><ol id="table_of_contents">Table of contents<li><a href="#video_formats">Video formats</a><ol><li><a href="#avc_only">AVC only</a></li><li><a href="#vp9_only">VP9 only</a></li><li><a href="#av1_only">AV1 only</a></li><li><a href="#4320p_only">4320p only</a></li><li><a href="#2160p_only">2160p only</a></li><li><a href="#1440p_only">1440p only</a></li><li><a href="#1080p_only">1080p only</a></li><li><a href="#720p_only">720p only</a></li><li><a href="#480p_only">480p only</a></li><li><a href="#360p_only">360p only</a></li><li><a href="#240p_only">240p only</a></li><li><a href="#144p_only">144p only</a></li><li><a href="#60fps_only">60fps only</a></li><li><a href="#30fps_only">30fps only</a></li></ol></li><li><a href="#audio_formats">Audio formats</a></li><li><a href="#combined_formats">Combined formats</a></li></ol>
<p>Here are all the youtube format codes I'm aware of.
Please let me know if there are more, or if something here is outdated.
contact@voussoir.net</p>
<p>You can pass them to youtube-dl as <code>--format a+b/c+d/e</code>,
where a+b is your preferred video+audio pair, c+d is your second-best
preference, and e is your last resort.
Don't forget the magic words like "bestvideo", "bestaudio" to round out your selection.</p>
<p>See <a href="https://github.com/ytdl-org/youtube-dl/blob/master/README.md#format-selection">https://github.com/ytdl-org/youtube-dl/blob/master/README.md#format-selection</a></p>
<p>There are more formats listed in <a href="https://github.com/ytdl-org/youtube-dl/blob/eb6181759f3a784d7b77ec9d2ec1a65dfd695d92/youtube_dl/extractor/youtube.py#L430">youtube-dl's source code</a>,
but some of them seem to be obsolete and are no longer returned by <code>-F</code>
even when using the example video IDs listed there. I will only include
codes for which I have an example.</p>
<h2 id="video_formats">Video formats<a class="header_anchor_link" href="#video_formats"> (§)</a></h2>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">571</td>
<td style="text-align:right">4320p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">272</td>
<td style="text-align:right">4320p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">337</td>
<td style="text-align:right">2160p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">401</td>
<td style="text-align:right">2160p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">305</td>
<td style="text-align:right">2160p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">315</td>
<td style="text-align:right">2160p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">266</td>
<td style="text-align:right">2160p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">313</td>
<td style="text-align:right">2160p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">336</td>
<td style="text-align:right">1440p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">400</td>
<td style="text-align:right">1440p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">304</td>
<td style="text-align:right">1440p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">308</td>
<td style="text-align:right">1440p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">264</td>
<td style="text-align:right">1440p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">271</td>
<td style="text-align:right">1440p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">335</td>
<td style="text-align:right">1080p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">399</td>
<td style="text-align:right">1080p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">299</td>
<td style="text-align:right">1080p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">303</td>
<td style="text-align:right">1080p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">137</td>
<td style="text-align:right">1080p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">248</td>
<td style="text-align:right">1080p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">334</td>
<td style="text-align:right">720p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">398</td>
<td style="text-align:right">720p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">298</td>
<td style="text-align:right">720p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">302</td>
<td style="text-align:right">720p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">136</td>
<td style="text-align:right">720p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">247</td>
<td style="text-align:right">720p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">333</td>
<td style="text-align:right">480p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">397</td>
<td style="text-align:right">480p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">135</td>
<td style="text-align:right">480p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">244</td>
<td style="text-align:right">480p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">332</td>
<td style="text-align:right">360p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">396</td>
<td style="text-align:right">360p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">134</td>
<td style="text-align:right">360p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">243</td>
<td style="text-align:right">360p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">331</td>
<td style="text-align:right">240p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">395</td>
<td style="text-align:right">240p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">133</td>
<td style="text-align:right">240p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">242</td>
<td style="text-align:right">240p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">330</td>
<td style="text-align:right">144p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">394</td>
<td style="text-align:right">144p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">160</td>
<td style="text-align:right">144p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">278</td>
<td style="text-align:right">144p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
</tbody>
</table>
<h3 id="avc_only">AVC only<a class="header_anchor_link" href="#avc_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">305</td>
<td style="text-align:right">2160p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">266</td>
<td style="text-align:right">2160p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">304</td>
<td style="text-align:right">1440p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">264</td>
<td style="text-align:right">1440p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">299</td>
<td style="text-align:right">1080p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">137</td>
<td style="text-align:right">1080p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">298</td>
<td style="text-align:right">720p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">136</td>
<td style="text-align:right">720p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">135</td>
<td style="text-align:right">480p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">134</td>
<td style="text-align:right">360p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">133</td>
<td style="text-align:right">240p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">160</td>
<td style="text-align:right">144p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
</tbody>
</table>
<h3 id="vp9_only">VP9 only<a class="header_anchor_link" href="#vp9_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">272</td>
<td style="text-align:right">4320p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">337</td>
<td style="text-align:right">2160p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">315</td>
<td style="text-align:right">2160p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">313</td>
<td style="text-align:right">2160p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">336</td>
<td style="text-align:right">1440p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">308</td>
<td style="text-align:right">1440p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">271</td>
<td style="text-align:right">1440p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">335</td>
<td style="text-align:right">1080p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">303</td>
<td style="text-align:right">1080p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">248</td>
<td style="text-align:right">1080p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">334</td>
<td style="text-align:right">720p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">302</td>
<td style="text-align:right">720p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">247</td>
<td style="text-align:right">720p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">333</td>
<td style="text-align:right">480p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">244</td>
<td style="text-align:right">480p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">332</td>
<td style="text-align:right">360p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">243</td>
<td style="text-align:right">360p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">331</td>
<td style="text-align:right">240p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">242</td>
<td style="text-align:right">240p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">330</td>
<td style="text-align:right">144p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">278</td>
<td style="text-align:right">144p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
</tbody>
</table>
<h3 id="av1_only">AV1 only<a class="header_anchor_link" href="#av1_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">571</td>
<td style="text-align:right">4320p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">401</td>
<td style="text-align:right">2160p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">400</td>
<td style="text-align:right">1440p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">399</td>
<td style="text-align:right">1080p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">398</td>
<td style="text-align:right">720p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">397</td>
<td style="text-align:right">480p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">396</td>
<td style="text-align:right">360p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">395</td>
<td style="text-align:right">240p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">394</td>
<td style="text-align:right">144p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
</tbody>
</table>
<h3 id="4320p_only">4320p only<a class="header_anchor_link" href="#4320p_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">571</td>
<td style="text-align:right">4320p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">272</td>
<td style="text-align:right">4320p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F i6fWG4FxDZw</code></td>
</tr>
</tbody>
</table>
<h3 id="2160p_only">2160p only<a class="header_anchor_link" href="#2160p_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">337</td>
<td style="text-align:right">2160p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">305</td>
<td style="text-align:right">2160p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">315</td>
<td style="text-align:right">2160p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">401</td>
<td style="text-align:right">2160p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">266</td>
<td style="text-align:right">2160p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">313</td>
<td style="text-align:right">2160p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
</tbody>
</table>
<h3 id="1440p_only">1440p only<a class="header_anchor_link" href="#1440p_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">336</td>
<td style="text-align:right">1440p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">304</td>
<td style="text-align:right">1440p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">308</td>
<td style="text-align:right">1440p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">400</td>
<td style="text-align:right">1440p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">264</td>
<td style="text-align:right">1440p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">271</td>
<td style="text-align:right">1440p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
</tbody>
</table>
<h3 id="1080p_only">1080p only<a class="header_anchor_link" href="#1080p_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">335</td>
<td style="text-align:right">1080p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">299</td>
<td style="text-align:right">1080p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">303</td>
<td style="text-align:right">1080p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">399</td>
<td style="text-align:right">1080p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">137</td>
<td style="text-align:right">1080p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">248</td>
<td style="text-align:right">1080p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
</tbody>
</table>
<h3 id="720p_only">720p only<a class="header_anchor_link" href="#720p_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">334</td>
<td style="text-align:right">720p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">298</td>
<td style="text-align:right">720p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">302</td>
<td style="text-align:right">720p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">398</td>
<td style="text-align:right">720p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">22</td>
<td style="text-align:right">720p30+128k</td>
<td style="text-align:right">AVC+m4a</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU</code></td>
</tr>
<tr>
<td style="text-align:right">136</td>
<td style="text-align:right">720p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">247</td>
<td style="text-align:right">720p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
</tbody>
</table>
<h3 id="480p_only">480p only<a class="header_anchor_link" href="#480p_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">333</td>
<td style="text-align:right">480p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">135</td>
<td style="text-align:right">480p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">244</td>
<td style="text-align:right">480p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">397</td>
<td style="text-align:right">480p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
</tbody>
</table>
<h3 id="360p_only">360p only<a class="header_anchor_link" href="#360p_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">332</td>
<td style="text-align:right">360p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">18</td>
<td style="text-align:right">360p30+96k</td>
<td style="text-align:right">AVC+m4a</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU</code></td>
</tr>
<tr>
<td style="text-align:right">134</td>
<td style="text-align:right">360p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">243</td>
<td style="text-align:right">360p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">396</td>
<td style="text-align:right">360p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
</tbody>
</table>
<h3 id="240p_only">240p only<a class="header_anchor_link" href="#240p_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">331</td>
<td style="text-align:right">240p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">133</td>
<td style="text-align:right">240p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">242</td>
<td style="text-align:right">240p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">395</td>
<td style="text-align:right">240p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
</tbody>
</table>
<h3 id="144p_only">144p only<a class="header_anchor_link" href="#144p_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">330</td>
<td style="text-align:right">144p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">160</td>
<td style="text-align:right">144p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">278</td>
<td style="text-align:right">144p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">394</td>
<td style="text-align:right">144p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
</tbody>
</table>
<h3 id="60fps_only">60fps only<a class="header_anchor_link" href="#60fps_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">571</td>
<td style="text-align:right">4320p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">337</td>
<td style="text-align:right">2160p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">305</td>
<td style="text-align:right">2160p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">315</td>
<td style="text-align:right">2160p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">401</td>
<td style="text-align:right">2160p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">336</td>
<td style="text-align:right">1440p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">304</td>
<td style="text-align:right">1440p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">308</td>
<td style="text-align:right">1440p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">400</td>
<td style="text-align:right">1440p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">335</td>
<td style="text-align:right">1080p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">299</td>
<td style="text-align:right">1080p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">303</td>
<td style="text-align:right">1080p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">399</td>
<td style="text-align:right">1080p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">334</td>
<td style="text-align:right">720p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">298</td>
<td style="text-align:right">720p60</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">302</td>
<td style="text-align:right">720p60</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ -xNN-bJQ4vI</code></td>
</tr>
<tr>
<td style="text-align:right">398</td>
<td style="text-align:right">720p60</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">333</td>
<td style="text-align:right">480p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">332</td>
<td style="text-align:right">360p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">331</td>
<td style="text-align:right">240p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">330</td>
<td style="text-align:right">144p60 HDR</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F 1La4QzGeaaQ</code></td>
</tr>
</tbody>
</table>
<h3 id="30fps_only">30fps only<a class="header_anchor_link" href="#30fps_only"> (§)</a></h3>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">272</td>
<td style="text-align:right">4320p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">266</td>
<td style="text-align:right">2160p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">313</td>
<td style="text-align:right">2160p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">264</td>
<td style="text-align:right">1440p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">271</td>
<td style="text-align:right">1440p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F kFz9afj8lu0 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">137</td>
<td style="text-align:right">1080p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">248</td>
<td style="text-align:right">1080p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">22</td>
<td style="text-align:right">720p30+128k</td>
<td style="text-align:right">AVC+m4a</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU</code></td>
</tr>
<tr>
<td style="text-align:right">136</td>
<td style="text-align:right">720p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">247</td>
<td style="text-align:right">720p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">135</td>
<td style="text-align:right">480p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">244</td>
<td style="text-align:right">480p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">397</td>
<td style="text-align:right">480p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">18</td>
<td style="text-align:right">360p30+96k</td>
<td style="text-align:right">AVC+m4a</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU</code></td>
</tr>
<tr>
<td style="text-align:right">134</td>
<td style="text-align:right">360p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">243</td>
<td style="text-align:right">360p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">396</td>
<td style="text-align:right">360p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">133</td>
<td style="text-align:right">240p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">242</td>
<td style="text-align:right">240p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">395</td>
<td style="text-align:right">240p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
<tr>
<td style="text-align:right">160</td>
<td style="text-align:right">144p30</td>
<td style="text-align:right">AVC</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">278</td>
<td style="text-align:right">144p30</td>
<td style="text-align:right">VP9</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ -xNN-bJQ4vI i6fWG4FxDZw</code></td>
</tr>
<tr>
<td style="text-align:right">394</td>
<td style="text-align:right">144p30</td>
<td style="text-align:right">AV1</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU 1La4QzGeaaQ</code></td>
</tr>
</tbody>
</table>
<h2 id="audio_formats">Audio formats<a class="header_anchor_link" href="#audio_formats"> (§)</a></h2>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">258</td>
<td style="text-align:right">386k</td>
<td style="text-align:right">m4a</td>
<td style="text-align:left"><code>youtube-dl -F NMANRHz4UAY</code></td>
</tr>
<tr>
<td style="text-align:right">256</td>
<td style="text-align:right">195k</td>
<td style="text-align:right">m4a</td>
<td style="text-align:left"><code>youtube-dl -F NMANRHz4UAY</code></td>
</tr>
<tr>
<td style="text-align:right">251</td>
<td style="text-align:right">160k</td>
<td style="text-align:right">Opus</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU</code></td>
</tr>
<tr>
<td style="text-align:right">140</td>
<td style="text-align:right">128k</td>
<td style="text-align:right">m4a</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU</code></td>
</tr>
<tr>
<td style="text-align:right">250</td>
<td style="text-align:right">70k</td>
<td style="text-align:right">Opus</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU</code></td>
</tr>
<tr>
<td style="text-align:right">249</td>
<td style="text-align:right">50k</td>
<td style="text-align:right">Opus</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU</code></td>
</tr>
</tbody>
</table>
<h2 id="combined_formats">Combined formats<a class="header_anchor_link" href="#combined_formats"> (§)</a></h2>
<table>
<thead><tr>
<th style="text-align:right">id</th>
<th style="text-align:right">quality</th>
<th style="text-align:right">codec</th>
<th style="text-align:left">examples</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">22</td>
<td style="text-align:right">720p30+128k</td>
<td style="text-align:right">AVC+m4a</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU</code></td>
</tr>
<tr>
<td style="text-align:right">18</td>
<td style="text-align:right">360p30+96k</td>
<td style="text-align:right">AVC+m4a</td>
<td style="text-align:left"><code>youtube-dl -F S8Zt6cB_NPU</code></td>
</tr>
</tbody>
</table>
<p>This document is generated <a href="/writing/youtubedl_formats/youtubedl_formats.sql">programmatically</a>.</p>
<pre><code>sqlite3 :memory: ".read youtubedl_formats.sql" &gt; youtubedl_formats.md</code></pre>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/youtubedl_formats/youtubedl_formats.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/07543ba3323ada09807b7614b536912c628011bd"><time datetime="2022-03-25T21:55:49-07:00">2022-03-25</time> Add resolution and fps tables.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/94b0274925fdf1c8d86ec2c14045a32a79e98794"><time datetime="2020-11-06T11:32:17-08:00">2020-11-06</time> Add audio bitrates to 18, 22 quality column.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/afecf692aa9f0ccc430431c4197a5ba9a0fb0137"><time datetime="2020-10-01T10:19:58-07:00">2020-10-01</time> Add more formats, examples, and auto-generate the md table aligners.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/f7109f9ceaa3e31a80c01414b853b9ba56a0e3ee"><time datetime="2020-09-30T19:25:25-07:00">2020-09-30</time> Add youtubedl_formats.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: 6363e0f3ab2c56b5c97bacd6541e70c2fef412f7/download_podcasts
title: Download your podcasts
url: https://voussoir.net/writing/download_podcasts
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>Download your podcasts</h1><ol id="table_of_contents">Table of contents<li><a href="#introduction">Introduction</a></li><li><a href="#downloading">Downloading</a></li><li><a href="#tagging">Tagging</a></li><li><a href="#cutting_ads">Cutting ads</a></li><li><a href="#listen_enjoy">Listen &amp; enjoy</a></li></ol>
<h2 id="introduction">Introduction<a class="header_anchor_link" href="#introduction"> (§)</a></h2>
<p>Over the past year or two, more and more podcasts have been moving to Spotify and pulling their material from their other outlets. This is because Spotify wants to pump up their subscriber counts and is offering cash incentives to podcasters for exclusivity. The only situation in which this can possibly be interpreted as a benefit for the listener is when the exclusivity deal literally saves the podcast from going bust, and even this has caveats. Any other messaging that depicts Spotify-exclusivity in a positive light is pure spin and marketing, as the deal invariably removes control and choice from the listener. You can ignore the "oh, but Spotify's not that bad" crowd, because that's not the point. The point is that <em>being corralled into Spotify</em> is bad, and the same would apply to any other exclusive distribution point no matter how technically good it is.</p>
<p>Not to mention, as with any other material on the Internet, every day that passes is a day your favorite show might disappear for any number of reasons. You should also download your favorite Youtube videos and forum threads, too, but let's save that for another article.</p>
<p>Podcasts are often distributed as 128 kbps mp3 or thereabouts. At this bitrate, you can fit 100 hours of audio in 5.5 GiB. Just do it.</p>
<h2 id="downloading">Downloading<a class="header_anchor_link" href="#downloading"> (§)</a></h2>
<p>I am actually a bad ambassador for this kind of thing, because I like writing my own scrapers and downloaders, which most people won't want to do.</p>
<p>Let's start here: the podcast culture has traditionally used RSS for publishing episodes. Until recently, I never had a use for RSS, but now I see it as an important open format in the fight to keep data out of walled gardens like Spotify.</p>
<p>At this point, you can either search the Internet for "RSS podcast downloader" and find a pre-existing software solution to this problem, or you can continue reading and see how I do it. As you'll find, the nature of RSS does often require getting dirty and putting in some extra labor.</p>
<p>With no background experience in RSS readers, I tried <a href="https://quiterss.org/">QuiteRSS</a> and have been happy with it. QuiteRSS uses SQLite to store the feeds and news items. With a tool like <a href="https://github.com/sqlitebrowser/sqlitebrowser/releases">sqlitebrowser</a>, or just the <a href="https://www.sqlite.org/download.html">command line sqlite3</a>, it's then trivial to get the <code>published</code> date and <code>enclosure_url</code> fields which I then throw into my own <a href="https://git.voussoir.net/voussoir/cmd/src/branch/master/threaded_dl.py"><code>threaded_dl.py</code></a> by preparing a file that looks like:</p>
<pre><code>https://example.com/episode1.mp3 Podcastname 2015-10-31.mp3
https://example.com/episode2.mp3 Podcastname 2016-12-25.mp3
https://example.com/episode3.mp3 Podcastname 2017-04-01.mp3
https://example.com/episode4.mp3 Podcastname 2018-05-05.mp3</code></pre>
<p>and calling <code>threaded_dl links.txt 3</code>.</p>
<p><img alt="" loading="lazy" src="/writing/download_podcasts/quiterss_feeds_db1.png" title="QuiteRSS db containing feeds."/></p>
<p><img alt="" loading="lazy" src="/writing/download_podcasts/quiterss_feeds_db2.png" title="QuiteRSS db sql query to isolate dates and urls."/></p>
<p><img alt="" loading="lazy" src="/writing/download_podcasts/quiterss_feeds_db3.png" title="QuiteRSS db copying results of query."/></p>
<p><img alt="" loading="lazy" src="/writing/download_podcasts/quiterss_feeds_db4.png" title="QuiteRSS db pasting results into text editor for further manipulation."/></p>
<p>To be clear, I only do this for the initial download of the historical posts. After that, when new episodes are released, I just right-click &amp; save file.</p>
<p>However, you'll find that many or most RSS feeds don't contain the entire history of the show. Squarespace, for example, only publishes the 300 most recent items in an RSS feed. Why? Because that's the number <a href="https://support.squarespace.com/hc/en-us/articles/205814338-Podcasting-with-Squarespace-overview#:~:text=Squarespace%20podcast%20feeds%20display%20up,episodes%20that%20Apple%20Podcasts%20supports.">Apple uses</a> and apparently it's easier to follow Apple's lead than to realize that RSS is an open format for a variety of consumers. I have seen other feeds that show only 10 items, which surely must be a result of poor configuration <a class="footnote_link" data-index="1" href="#footnote_text_1" id="footnote_link_1" title='[1] Looks like the market has an opening for an "RSS rebroadcasting service" that archives feeds and gives clients the whole history every time.'>[1]</a>.</p>
<p>One thing you can try is searching the <a href="https://web.archive.org/">Wayback machine</a> for the RSS url. If you're lucky, it will have been scraped in the past often enough so as to contain the entire history, though perhaps in piecemeal. You could download the snapshots, combine them into a single xml file, serve it out of a <a href="https://git.voussoir.net/voussoir/else/src/branch/master/SimpleServer">webserver</a>, and temporarily point your RSS client at localhost so it ingests all those historical posts before pointing it back at the real url. Convoluted, perhaps, but I'd rather do this than inject the posts into the db myself. Then, you can pull the enclosures out of QuiteRSS's database (or from the xml file you just made).</p>
<p><img alt="" loading="lazy" src="/writing/download_podcasts/wayback_archives.png" title="Finding archived RSS feeds on Wayback"/></p>
<p><img alt="" loading="lazy" src="/writing/download_podcasts/wayback_crossreference.png" title="Cross-referencing the last item on the web feed (right) with more items on the wayback archive (left) to construct a single xml file with all items."/></p>
<p><img alt="" loading="lazy" src="/writing/download_podcasts/wayback_timetravel1.png" title="Serving the xml file out of a local webserver and configuring QuiteRSS to pull the localhost url."/></p>
<p><img alt="" loading="lazy" src="/writing/download_podcasts/wayback_timetravel2.png" title="QuiteRSS pulled the local xml file and now has 149 items instead of 100."/></p>
<p>But, in the worst case scenario, you'll find that Wayback doesn't have archives of the feed you want. At this point I write a web scraper in Python to find all the episode dates and links, or I just hit the CTRL+C, CTRL+V gym for twenty minutes, copying each link from the website manually. You may also try <a href="http://home.snafu.de/tilman/xenulink.html">Xenu's Link Sleuth</a> or <a href="https://www.httrack.com/">HTTrack</a> to see if they can find all of the MP3 urls automatically. I figure it's an effort I'll only have to do once as long as RSS keeps getting new posts after that.</p>
<p>If the podcaster has already taken the Faustian bargain, you can try using <a href="https://spotifeed.timdorr.com/">spotifeed.timdorr.com</a> to pull Spotify as RSS, but this will give very limited history and only serves to stem the bleeding.</p>
<p><a class="footnote_text" data-index="1" href="#footnote_link_1" id="footnote_text_1">[1]</a> Looks like the market has an opening for an "RSS rebroadcasting service" that archives feeds and gives clients the whole history every time.</p>
<h2 id="tagging">Tagging<a class="header_anchor_link" href="#tagging"> (§)</a></h2>
<p>Some podcasters add metadata to their distribution files, others don't. Most don't. At least not to my tastes. I recommend <a href="https://mp3tag.de/en/">MP3Tag</a> for tagging and renaming the files.</p>
<p>Tagging podcasts is a little different than tagging music. Firstly, podcasters sometimes release "bonus episodes" or "0.5" episodes, which cause track numbers to deviate from the episode number as listed in the title. Secondly, music files can usually be named <code>artist - album - track.mp3</code> without much issue, but podcast titles are often much longer and contain unsafe characters like <code>:</code>, <code>?</code>, <code>/</code>, etc. So, to keep things simple, I just use <code>podcastname - releasedate.mp3</code> as the filename.</p>
<p>If the mp3 files don't have the <code>ALBUM</code> or <code>YEAR</code> field set, you can use MP3Tag's "filename to tag" feature to fix that.</p>
<p><img alt="" loading="lazy" src="/writing/download_podcasts/filename_to_tag.png" title="filename to tag: album - year"/></p>
<p>MP3Tag is great for batch renaming. In your MP3Tag actions, create a <code>Format value</code> action with the parameters Field=<code>_FILENAME</code>, Format string=<code>%album% - %year%</code>.</p>
<p><img alt="" loading="lazy" src="/writing/download_podcasts/mp3tag_rename_action.png" title="MP3Tag rename action."/></p>
<p>Clean up all the files' tags to your heart's content, then select them and run your rename action.</p>
<h2 id="cutting_ads">Cutting ads<a class="header_anchor_link" href="#cutting_ads"> (§)</a></h2>
<p>I don't listen to <a href="/writing/advertixing">ads</a>. I recommend <a href="https://mpesch3.de/">mp3DirectCut</a> for cutting them out. If you're going to listen to the podcasts on your PC anyway, you can kill two birds with one stone by listening to the entire podcast within mp3DC and cutting the ads as you go. If you just want to kill one bird at a time, you can skim through the file with the arrow keys and page up / page down. Most people speak differently when they read an ad, or record the ad in a separate take. You can hear these difference as you skim even when jumping 10-30 seconds at a time. Listen for differences in intonation, room noise, or long segments of a single speaker instead of the show's usual back-and-forth dialogue. You will get faster as you get familiar with the podcaster's ad spacing and speech habits.</p>
<p>It is important to use a tool that does lossless copying, which means it doesn't re-encode the audio when saving the new file. If you use Audacity, for example, you are loading the mp3 into a wave in memory at the beginning, then encoding that wave back to mp3 at the end. Re-encoding will cause a slight loss in quality, though I admit it will not usually be noticeable. mp3DC copies the mp3 data directly. This comes with the limitation that you can only cut at frame boundaries, but that's ok because mp3 frames are usually <a href="https://stackoverflow.com/a/12650386">~26ms</a> long, unlike video formats where keyframes might be many seconds apart.</p>
<p><img alt="" loading="lazy" src="/writing/download_podcasts/mp3dc_demo.png" title="Turning the clock back to 2006 with this expertly annotated MSPaint job demonstrating the key features of mp3dc."/></p>
<h2 id="listen_enjoy">Listen &amp; enjoy<a class="header_anchor_link" href="#listen_enjoy"> (§)</a></h2>
<p>The final step is to rest easy in the knowledge that no one can take the show away from you at this point. You can take as much time as you need to listen through it, and it'll always be right where you left it. As it should be.</p>
<p>If you do not have the tools or resources to perform these steps, I wouldn't mind doing it for you once or twice. Send me an email via writing@voussoir.net.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/download_podcasts/download_podcasts.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/3475cb0abf63172e6392487ffaf41755f71a18e3"><time datetime="2023-09-18T21:01:09-07:00">2023-09-18</time> Replace github links with git.voussoir.net.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/aa6f5dfae739d2b628a4916660fecc790aaaf856"><time datetime="2022-03-15T18:00:09-07:00">2022-03-15</time> Add advertixing.md.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/9cce9f9ef055a5e268a9b913871ff8d0473cf3eb"><time datetime="2021-06-07T19:08:19-07:00">2021-06-07</time> Move S3 images to my domain.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/e9529b73c644660c91a8f197e33de6aaffd785c1"><time datetime="2020-12-08T15:35:21-08:00">2020-12-08</time> Add links to Xenu, HTTrack; improve QuiteRSS db screenshots.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/6363e0f3ab2c56b5c97bacd6541e70c2fef412f7"><time datetime="2020-10-27T01:57:05-07:00">2020-10-27</time> Add download_podcasts.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: d5356b0b0779ebb81b15783069c05d4c6646fa8c/multireddit_rss
title: RSS from private multireddits
url: https://voussoir.net/writing/multireddit_rss
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>RSS from private multireddits</h1>
<p>The RSS URL for a multireddit is <code>https://www.reddit.com/user/username/m/multiname/new.rss</code>. But, putting this into your RSS client without making the multi public will yield a 404.</p>
<p>On <a href="https://old.reddit.com/prefs/feeds/">reddit.com/prefs/feeds</a> you'll find some RSS links that use a static token in the URL to act as the authentication, so you don't have to provide login credentials in your client. It turns out, the token is the same for all of the feeds, and you can use it on the multireddit feed too.</p>
<p>Just use <code>https://www.reddit.com/user/username/m/multiname/new.rss?feed=XXXXXXX&amp;user=username</code> and you're good to go.</p>
<p>Since a single multireddit can aggregate up to 100 subreddits, you can save yourself and reddit up to 99 web requests per refresh by doing it this way.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/multireddit_rss/multireddit_rss.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/e4501b37c56c5baf27921fca9e1cd6dc2d4fbfe9"><time datetime="2020-11-11T15:27:42-08:00">2020-11-11</time> Explain why multireddits are better than separate rss feeds.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/d5356b0b0779ebb81b15783069c05d4c6646fa8c"><time datetime="2020-11-01T00:01:56-07:00">2020-11-01</time> Add multireddit_rss.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: 9fa4a251759f049e1fe5e09dd7948f9872c71b2e/master_of_my_domain
title: Master of my domain
url: https://voussoir.net/writing/master_of_my_domain
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>Master of my domain</h1><ol id="table_of_contents">Table of contents<li><a href="#introduction">Introduction</a></li><li><a href="#prefer_portable_over_installers">Prefer portable over installers</a></li><li><a href="#with_installers_always_choose_your_directory">With installers, always choose your directory</a></li><li><a href="#separate_subdirectories_for_each_version">Separate subdirectories for each version</a></li><li><a href="#use_latest_junctions_for_program_shortcuts">Use 'latest' junctions for program shortcuts</a></li><li><a href="#reserve_path_for_nobility_only">Reserve PATH for nobility only</a></li><li><a href="#use_junctions_to_reign_in_appdata">Use junctions to reign in appdata</a></li><li><a href="#back_up_your_software">Back up your software</a></li><li><a href="#dealing_with_uncooperative_software">Dealing with uncooperative software</a></li></ol>
<h2 id="introduction">Introduction<a class="header_anchor_link" href="#introduction"> (§)</a></h2>
<p>This article is about how I manage the software on my computer to stay organized and in control. I've developed these habits over years of dealing with software installations that each want to behave a little differently and go their own way. But I'm the master of my domain — queen of my castle, if you will — and I run the show around here. So here's how I put software in its place:</p>
<h2 id="prefer_portable_over_installers">Prefer portable over installers<a class="header_anchor_link" href="#prefer_portable_over_installers"> (§)</a></h2>
<p>If a software download page offers a choice between "portable"/.zip/.7z downloads and "setup"/.exe/.msi downloads, always pick the portable option. The reason they're called portable is because you can unzip them to a flash drive and just run the .exe on any computer you plug it in to, so that you don't have to actually install the program on every computer you use.</p>
<p>As a result, a well-behaved portable program will:</p>
<ul>
<li>Store configuration files in the same folder as the .exe, instead of the computer's central registry or other paths.</li>
<li>Not rely on files outside of the program's folder — the whole thing is self-contained.</li>
<li>Not leave much, or anything, behind on the main computer — usually just some log files in appdata.</li>
</ul>
<p>These properties are what I want from <em>all</em> software! The benefits even for non-portable use are many. Portable software makes it easy to:</p>
<ul>
<li>find and modify config files by hand — no hunting for registry keys or configuration paths.</li>
<li>uninstall — just delete the folder.</li>
<li>run multiple simultaneous instances of the program, even of different versions or with different configurations.</li>
<li>sync with <a href="https://syncthing.net/">Syncthing</a>.</li>
<li>back up and restore — just zip the folder. No need to worry about important files hiding anywhere else.</li>
</ul>
<p>There is even a website, <a href="https://portableapps.com/apps">portableapps.com</a>, dedicated to promoting portable software and preparing portable-ized versions of software that isn't normally available as portable. In the second case, however, you rely on portableapps being trustworthy.</p>
<p>Ostensibly, the benefits of installers over portables is they can set file associations, integrate with the right-click menu, and so forth. Well, I can handle file associations myself (<code>HKCR\.ext\shell\open\command\(Default)</code>), and even the most well-meaning context menu items really just contribute to an ever-growing list of junk so I'd rather not have those anyway. I can write those myself, too, if I really need them (<code>HKCR\.ext\shell\mycommandname\command\(Default)</code>). Then I'll know exactly where they're defined should I ever decide to remove them. This is in contrast to properties set by installers which are always in crazy places and mapped through GUIDs and whatnot.</p>
<h2 id="with_installers_always_choose_your_directory">With installers, always choose your directory<a class="header_anchor_link" href="#with_installers_always_choose_your_directory"> (§)</a></h2>
<p>Some software isn't available as a portable download, so you've got to suffer through the installer. If it gives you the opportunity to change the install directory, always take that chance. Software installers on Windows have a nasty habit of scattering themselves throughout <code>C:\Program Files</code>, <code>C:\Program Files (x86)</code>, <code>C:\ProgramData</code>, and <code>%appdata%</code>. I'm king of this county and I hereby declare that I'm not gonna go on a wild goose chase looking for <strong>my</strong> software on <strong>my</strong> computer — they'll go where I tell them to go.</p>
<p>If I have to install a program from an installer, I'll usually try to zip up the resulting folder and keep that as my own portable copy for later. A lot of installers are nothing more than extractors, so as long as the program doesn't rely on some system changes during install, keeping the portable copy works fine (besides, system changes are often anti-user anyway). And I really don't need an installer acting as a glorified file extractor, I can do that myself from a zip. Unfortunately, some software doesn't work after re-extracting it, and I do have to keep the installer.</p>
<p>Some software authors take this <a href="https://en.wikipedia.org/wiki/L%C3%A8se-majest%C3%A9">Lèse-majesté</a> a step further by not even offering a chance to change the install directory. There is no justifiable reason for this. I operate on a two or three strikes policy depending on how important the software is: I expect simply moving the installed folder, possibly leaving a junction in its place, to work properly. But now that the program is on my bad side it takes a lot less for me to uninstall.</p>
<p>The worst offenders are the likes of Adobe. A search on my computer right now shows:</p>
<pre><code>C:\Program Files\Adobe
C:\Program Files\Common Files\Adobe
C:\Program Files (x86)\Adobe
C:\Program Files (x86)\Common Files\Adobe
C:\ProgramData\Adobe
C:\Users\All Users\Adobe
C:\Users\voussoir\AppData\Local\Adobe
C:\Users\voussoir\AppData\LocalLow\Adobe
C:\Users\voussoir\AppData\Roaming\Adobe
C:\Users\voussoir\AppData\Roaming\Adobe\Adobe
C:\Users\voussoir\Documents\Adobe
C:\Users\Public\Documents\Adobe</code></pre>
<p>You're not the lord of this manor, Adobe!</p>
<h2 id="separate_subdirectories_for_each_version">Separate subdirectories for each version<a class="header_anchor_link" href="#separate_subdirectories_for_each_version"> (§)</a></h2>
<p>My Software folder looks like this, with a subdirectory for each version of every program:</p>
<pre><code>D:\Software\Git\2.25.0
D:\Software\Inkscape\0.92.3
D:\Software\QuiteRSS\0.19.4
D:\Software\WinSCP\5.17.8</code></pre>
<p>This way, I can maintain multiple versions of the software at the same time, which makes updating totally stress-free because I can stick with the old version as long as I want if the update has a regression. Contrast that with an in-place updater where you might regret the update after finding a new bug. My Android phone has several apps that I simply don't bother to update because I don't want to deal with reverting the .apks by hand through adb should I regret the update <a class="footnote_link" data-index="1" href="#footnote_text_1" id="footnote_link_1" title="[1] F-Droid offers historical apks for download so I've got no concern there, but Google doesn't. Raccoon can help you download present-day apks from Google for your future benefit, though.">[1]</a>.</p>
<p>The only problem occurs when multiple versions expect <code>%appdata%\Program</code> to belong to themselves alone. If there is no commandline switch to change the appdata directory, I am somewhat out of luck on that point. One thing I had never though of until now is modifying the environment variables before running the program to manipulate <code>%appdata%</code> to a separate directory, similar to <a href="https://superuser.com/q/424001">this SE thread</a>. However, that solution didn't work for me, but I'll keep an eye out for something similar. This seems fragile since the program might (wrongfully) construct appdata from <code>%userprofile%\appdata\roaming</code>, or cache the value of <code>%appdata%</code> during install to a registry key, etc.</p>
<p><a class="footnote_text" data-index="1" href="#footnote_link_1" id="footnote_text_1">[1]</a> <a href="https://f-droid.org/">F-Droid</a> offers historical apks for download so I've got no concern there, but Google doesn't. <a href="https://raccoon.onyxbits.de/">Raccoon</a> can help you download present-day apks from Google for your future benefit, though.</p>
<h2 id="use_latest_junctions_for_program_shortcuts">Use 'latest' junctions for program shortcuts<a class="header_anchor_link" href="#use_latest_junctions_for_program_shortcuts"> (§)</a></h2>
<p>Here's a fantastic trick I started using just recently. Since all my software is separated by version number, when I download the newest version of a program, all of my shortcuts or scripts which call that program will still be using the old path, and I'd have to update them manually. I came up with this solution: just <code>mklink /j __latest X.Y.Z</code> inside the program folder, and have all your shortcuts point to the exe inside <code>__latest</code>. Since it's a filesystem junction, it will behave transparently to any calling program. In the past I had tried to achieve this by making a single shorcut and pointing any future shortcuts to that one, but that didn't work because when you assign a shortcut to a shortcut it resolves to the real path and saves that path forever instead of folowing the link every time.</p>
<p>When I download a new version of a program, I just delete that junction and make it again with the new version number, and all linked paths work as normal, as long as the name of the .exe itself hasn't changed.</p>
<p>I don't like filling up my desktop or start menu with shortcuts, so I wrote <a href="https://git.voussoir.net/voussoir/cmd/src/branch/master/PGUI.pyw">PGUI</a> which acts as a launcher for any .lnk files located inside my PGUI folder. Each of these shortcuts actually point to the <code>__latest\program.exe</code> path. As a bonus, my PGUI folder is one of the few folders to enjoy the honor of being on my PATH, which means I can just start them from the command line or Win+R — that's all possible without a gui launcher of course, but it's a great symbiosis.</p>
<p><img alt="" loading="lazy" src="/writing/master_of_my_domain/latest_junction_1.png"/></p>
<p><img alt="" loading="lazy" src="/writing/master_of_my_domain/latest_junction_2.png"/></p>
<h2 id="reserve_path_for_nobility_only">Reserve PATH for nobility only<a class="header_anchor_link" href="#reserve_path_for_nobility_only"> (§)</a></h2>
<p>The entire contents of my PATH are:</p>
<pre><code>C:\Windows
C:\Windows\system32
D:\cmd
D:\git\cmd
D:\git\cmd\PGUI</code></pre>
<p>Two folders for system executables, and three folders owned by <strong>me</strong>, because this is a monarchy and I'll appoint whoever I want. No application, under any circumstance, gets to put its own install directory on the PATH. If I need global commandline access to that program, I'll put an .lnk or symlink in \cmd.</p>
<p>At one point, I had some issues with programs that I wanted to subprocess from Python. <code>subprocess.run(shutil.which('ffmpeg'))</code> was breaking because <code>subprocess.run</code> wants to receive executable files and of course the only thing on my path was an .lnk. So, I wrote <a href="https://git.voussoir.net/voussoir/voussoirkit/src/branch/master/voussoirkit/winwhich.py">winwhich.py</a> and now that problem is solved. The software bends to my will, not the other way around.</p>
<h2 id="use_junctions_to_reign_in_appdata">Use junctions to reign in appdata<a class="header_anchor_link" href="#use_junctions_to_reign_in_appdata"> (§)</a></h2>
<p>I've mentioned that even portable software has a tendency to leave a few traces in <code>%appdata%</code>. Sometimes it's inconsequential stuff like log files, but sometimes it's config, and that I want to keep in the program folder.</p>
<p>The solution here is in three steps:</p>
<ol>
<li>Move <code>%appdata%\Program</code> into <code>D:\Software\Program</code>.</li>
<li>Rename that folder to e.g. "appdata" so you don't have Program\Program like some kind of Adobe.</li>
<li><code>mklink /j "%appdata%\Program" appdata</code>.</li>
</ol>
<p>Now you are closer to portable enlightenment and can zip up the program folder without losing your appdata files.</p>
<h2 id="back_up_your_software">Back up your software<a class="header_anchor_link" href="#back_up_your_software"> (§)</a></h2>
<p>Although I run regular backups, I don't include my whole Software folder in the backup routine because I already keep all the portable zips and installers backed up separately. The only items of value in the install directory are config files, most of which are not highly personalized and I don't mind losing either.</p>
<p>But, there are a few programs which I've heavily configured and I'd hate to start from scratch with them. Sublime, Putty, and WinSCP for example. For those I wrote a wrapper around WinRAR, <a href="https://git.voussoir.net/voussoir/cmd/src/branch/master/rarpar.py">rarpar.py</a>, which I use to create highly compressed archives with a datestamp in the filename. Because the <code>__latest</code> files will be included in duplicate, you might think it'd waste a lot of space, but with a Solid archive and a very high dictionary size, that duplication causes no extra disk usage.</p>
<h2 id="dealing_with_uncooperative_software">Dealing with uncooperative software<a class="header_anchor_link" href="#dealing_with_uncooperative_software"> (§)</a></h2>
<p>If you find that one of your programs isn't cooperating with the above techniques, consider these more delicate approaches:</p>
<ul>
<li>Say in a loud, commanding, and controlled voice, "<strong><em>YOU WORK FOR ME</em></strong>" (requires microphone).</li>
<li>Spawn several child processes. Kill them.</li>
<li>Reduce process priority to Below Normal and insist, "You can have your cycles back after you've cleaned up your act".</li>
</ul>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/master_of_my_domain/master_of_my_domain.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/3475cb0abf63172e6392487ffaf41755f71a18e3"><time datetime="2023-09-18T21:01:09-07:00">2023-09-18</time> Replace github links with git.voussoir.net.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/0f40c9dce17921ce4d8143f72ab16230254a9408"><time datetime="2021-10-12T19:06:40-07:00">2021-10-12</time> Replace allcaps with bold, remove backup_folder.py link.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/7aef0a00716f251e4025944778ae2fb727f5d5ef"><time datetime="2021-10-01T23:12:14-07:00">2021-10-01</time> Simplify wording of bulleted list.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/0ec6a69e432caf2b24c5a79563548dd53379df1e"><time datetime="2021-08-07T17:49:41-07:00">2021-08-07</time> Replace "back up with confidence" with "back up and restore".</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/9cce9f9ef055a5e268a9b913871ff8d0473cf3eb"><time datetime="2021-06-07T19:08:19-07:00">2021-06-07</time> Move S3 images to my domain.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/fc9aaf092fa367968b206069620bdcc6e91adc92"><time datetime="2021-01-02T23:40:13-08:00">2021-01-02</time> Fix typo "instead of computer's".</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/9fa4a251759f049e1fe5e09dd7948f9872c71b2e"><time datetime="2020-12-02T00:15:01-08:00">2020-12-02</time> Add master_of_my_domain.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: 3946a09872ee8b40ea8420b5587e35ccb3da9556/shebangs
title: #!shebangs
url: https://voussoir.net/writing/shebangs
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>#!shebangs</h1><ol id="table_of_contents">Table of contents<li><a href="#introduction">Introduction</a><ol><li><a href="#windows_file_extensions">Windows file extensions</a></li><li><a href="#unix_shebangs">Unix shebangs</a></li></ol></li><li><a href="#i_dont_like_shebangs">I don't like shebangs</a><ol><li><a href="#developer_over_user_or_else_byebye_checksums">Developer over user (or else bye-bye checksums)</a></li><li><a href="#antiwindows_dogmatism">Anti-Windows dogmatism</a></li><li><a href="#pathext">PATHEXT</a></li></ol></li><li><a href="#hedges">Hedges</a><ol><li><a href="#the_registry">The registry</a></li><li><a href="#mp3exe">.mp3.exe</a></li></ol></li><li><a href="#conclusion">Conclusion</a></li></ol>
<h2 id="introduction">Introduction<a class="header_anchor_link" href="#introduction"> (§)</a></h2>
<h3 id="windows_file_extensions">Windows file extensions<a class="header_anchor_link" href="#windows_file_extensions"> (§)</a></h3>
<p>On Windows, the file extension of a filename is used to automatically determine how the file should be opened when you double-click on it or run it on the command line. .exe are the kings, because they are Windows's native executables. For other extensions, the shell checks the registry to find the exe associated with the extension, and runs that program with your file as the first argument, plus the rest of your arguments. For example:</p>
<ul>
<li><code>&gt; ipconfig.exe</code> → runs directly</li>
<li><code>&gt; whatsmyip.py</code> → <code>python.exe whatsmyip.py</code></li>
<li><code>&gt; dns.py www.example.com</code> → <code>python.exe dns.py www.example.com</code></li>
<li><code>&gt; clock.pyw</code> → <code>pythonw.exe clock.pyw</code></li>
<li><code>&gt; report.doc</code> → <code>winword.exe report.doc</code></li>
</ul>
<p>If you remove the .exe extension from an executable file's name, the shell won't know what to do with it (but deeper APIs can still invoke it (<a href="https://stackoverflow.com/questions/12655314/open-an-executable-file-without-an-exe-extension-with-shellexecute">one</a>, <a href="https://old.reddit.com/r/explainlikeimfive/comments/3iyn9a/eli5_how_do_computer_extensions_work_exe_inf_iso/culk1z9/">two</a>)). That is to say, Windows does not inspect the content of files to determine their type for the purpose of double-click launching. Every file is either an exe or has an extension which maps to an exe, or has no extension and can't be associated to a program. <a class="footnote_link" data-index="1" href="#footnote_text_1" id="footnote_link_1" title="[1] There is also .com, a legacy executable format which is natively executable, yet has a passthrough HKCR entry anyway, presumably because the shell is programmed to consult HKCR for anything that's not .exe. HKCR\comfile\shell\open\command\(Default)=&quot;%1&quot; %*">[1]</a></p>
<p>At no time does this prevent you from using any other executable to open a file. You can always <code>pythonw.exe dns.py</code> or <code>winword.exe clock.pyw</code>. Extensions are not restrictions, they are just shortcuts to launching your executable of choice.</p>
<p><a class="footnote_text" data-index="1" href="#footnote_link_1" id="footnote_text_1">[1]</a> There is also .com, a <a href="https://en.wikipedia.org/wiki/COM_file">legacy executable format</a> which is natively executable, yet has a passthrough HKCR entry anyway, presumably because the shell is programmed to consult HKCR for anything that's not .exe. <code>HKCR\comfile\shell\open\command\(Default)="%1" %*</code></p>
<h3 id="unix_shebangs">Unix shebangs<a class="header_anchor_link" href="#unix_shebangs"> (§)</a></h3>
<p>On Unix operating systems, the extension is not used to help execute the file. Instead,</p>
<ol>
<li>The file must have the <code>x</code> permission, aka "executable bit", enabled by <code>chmod +x filename</code>.</li>
<li>If the file is a native executable, it will run directly. Otherwise, the system will look for the shebang. The system reads the first few bytes of the file to figure this out.</li>
</ol>
<p>The <a href="https://en.wikipedia.org/wiki/Shebang_(Unix)">shebang</a> is a line which must be at the very top of the file and must start with <code>#!</code>. Then, a path to an executable is given, which will actually interpret and run the remainder of the file. A Python file with a shebang might look like this:</p>
<div class="highlight python"><pre><span class="ch">#!/usr/bin/env python</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="nb">print</span><span class="p">(</span><span class="n">sys</span><span class="n">.</span><span class="n">executable</span><span class="p">,</span> <span class="n">sys</span><span class="n">.</span><span class="n">argv</span><span class="p">)</span>
</pre></div><p>You can save this file using any extension you want, or no extension at all, and run it by calling <code>chmod +x ./filename</code> and then <code>./filename</code>. As always, you're welcome to pass the file as an argument to any other executable if you need to use a different interpreter.</p>
<p>One of the principles here is that executables become abstractions, black boxes. The idea is that as a user, when you run some <code>program</code> on the command line, you shouldn't need to know or care whether <code>program</code> is a shell builtin, or an alias, or an executable on the PATH; and you shouldn't need to care what language it's written in. You could swap out a <code>dns</code> program written in bash with one written in Python, and your callers won't know the difference.</p>
<p>But...</p>
<h2 id="i_dont_like_shebangs">I don't like shebangs<a class="header_anchor_link" href="#i_dont_like_shebangs"> (§)</a></h2>
<p>And you won't find a shebang on any of the code I write.</p>
<p>For these arguments, suppose that the file in question is checked into version control (e.g. git), or is seeding on IPFS, or is otherwise being hash-validated, or is restored to factory condition on every software/OS update, such that "just change the shebang" is not an appropriate solution. The file is handcuffed to the interpreter specified by the shebang.</p>
<p>My dislike for shebangs is part principle and part practical. Principles like:</p>
<ul>
<li><p>As a user, why should I be expected to agree with the developer's choice of interpreter and pathing (<code>/bin/x</code> vs <code>/usr/bin/x</code> vs <code>/usr/bin/env x</code> ...)? You can search stackoverflow and find <a href="https://stackoverflow.com/questions/16365130/what-is-the-difference-between-usr-bin-env-bash-and-usr-bin-bash">plenty</a> of <a href="https://unix.stackexchange.com/questions/29608/why-is-it-better-to-use-usr-bin-env-name-instead-of-path-to-name-as-my">discussions</a> about the pros and cons of each technique. But I'm the user and I'll do what I want, stop subjecting me to your chosen set of pros and cons when I'm the one running the program.</p>
</li>
<li><p>As a developer, why should I add this boilerplate to every file I write? Why should I be encoding "this is how you run my program" in the file, when the user can simply configure their system to do it however they like best?</p>
</li>
</ul>
<p>And practicals like:</p>
<ul>
<li><p>My <code>python</code> is really not the same as your <code>python</code>, so stop assuming <code>/usr/bin/env python</code> is the right thing.</p>
</li>
<li><p>The shebang handcuffs also apply to hardlinks / symlinks which I might intentionally want to behave differently.</p>
</li>
</ul>
<p>I will continue to use Python as the example language for this argument because that's what I'm most familiar with, but you may extend these issues to any case where there are alternative interpreters — even if the alternatives haven't been invented yet!</p>
<h3 id="developer_over_user_or_else_byebye_checksums">Developer over user (or else bye-bye checksums)<a class="header_anchor_link" href="#developer_over_user_or_else_byebye_checksums"> (§)</a></h3>
<p>Back in the day, Python code was written in Python 2, and it was fair to assume that the executable named <code>python</code> on the PATH was the Python 2 interpreter, so people wrote shebangs pointing to <code>python</code> expecting P2. Now, code is written in Python 3 and systems are shipping with <code>python</code> referring to P3, but some P2 tools are still around and in use. So now their shebang is wrong, and will be wrong for the rest of time, and the user will always need to explicitly call <code>python2 program.py</code> for as long as they hang on to that file. Great, thanks.</p>
<p>On an extension-based system, the solution is easy. Although the <code>program.py</code> file might be checked into version control, there's nothing stopping me from creating a symlink or hardlink on my PATH called <code>program.py2</code> that points to the file, and an extension mapping from <code>.py2</code> to <code>python2.exe</code>. This requires no changes to the file content itself, so it won't interfere with the file's hash.</p>
<p>To be clear, the file layout I would use for maintaining a Python2 and Python3 program simultaneously is:</p>
<pre><code>D:\
├───cmd\ on the PATH
│   ├───a_program.py2 =&gt; D:\software\a_program\a_program.py
│   └───b_program.py =&gt; D:\software\b_program\b_program.py
└───software\
    ├───a_program\
    │   └───a_program.py
    └───b_program\
        └───b_program.py</code></pre>
<p>So even if <code>a_program.py</code> was written when <code>.py</code> implied Python2 instead of Python3, it doesn't matter because the names I actually execute are those in \cmd on my PATH. I can name my links any way I want to take advantage of the file extension mapping, while the real software is not affected whatsoever. See <a href="/writing/master_of_my_domain">Master of my domain</a> for more about my software management practices.</p>
<p>Sure, you can say that nobody should be using P2 programs any more, but that's moving the goalposts. Let's say someone wants to run some particular set of Python scripts through <a href="https://www.pypy.org/">PyPy</a> or <a href="https://www.python.org/download/alternatives/">any other implementation</a>. What then? To give one non-Python example, here is an SO thread about <a href="https://stackoverflow.com/questions/10376206/what-is-the-preferred-bash-shebang">the right shebang for bash</a>. To my eyes it's a disaster:</p>
<ul>
<li>Some people use <code>/bin/sh</code> under the assumption that all people have that symlinked to bash, which is wrong.</li>
<li><code>/bin/bash</code> or <code>/usr/bin/bash</code> might be ok, but there's no guarantee that's the path for <code>bash</code>.</li>
<li><code>/usr/bin/env bash</code> is probably most common, but there's <em>still</em> no guarantee that's the path for <code>env</code>!</li>
</ul>
<p>On a shebang-based system, the choices are:</p>
<ul>
<li>Edit the shebang in the file, thus changing its hash.</li>
<li>Create a symlink for the interpreter executable that matches the developer's shebang but actually points to the the user's preferred interpreter. E.g. the program expects <code>/usr/bin/python</code> so I create a symlink <code>/usr/bin/python =&gt; /.../python3</code></li>
<li>Create a separate launcher script, a one-liner shell file that calls the preferred interpreter with the script as an argument — essentially a handwritten symlink. This option is most similar to the extension-based solution, except that if the preferred interpreter changes you've got to update all of the launcher files manually.</li>
</ul>
<h3 id="antiwindows_dogmatism">Anti-Windows dogmatism<a class="header_anchor_link" href="#antiwindows_dogmatism"> (§)</a></h3>
<p>I don't like shebangs, but it's not such a big deal — all I have to do is not use them and that's that. They pose no restrictions upon me as long as I call the interpreter myself.</p>
<p>What actually bothers me are the Unix elitists who in a single breath will mock Windows users as being stupid, helpless <a href="https://en.wikipedia.org/wiki/Luser">lusers</a>, pushed around by the Big Bad File Extension Who Dictates How Files Are Executed... then write a shebang that handcuffs their file to the name of the anticipated interpreter executable. A .rose by any other extension would smell as sweet.</p>
<p>To demonstrate this isn't a strawman, here are some actual quotes gathered from around the 'net:</p>
<blockquote><p>I know that files are identified by an identifier on their first line, which is why Linux files don't have file endings. But I liked file endings a lot. Isn't it nice to be able to tell what a file is/does without having to open it? In Windows I could open up a folder and immediately have a lot of information about the folder and the files within it, just from the file endings.</p>
<blockquote><p>If you're asking if there's some kind of setting that will "show" file extensions on system files, no, that is not a thing.
You seem really hung up on the idea that filename extensions are a superior method of associating type information with files. Most Linux applications just don't use this method, but have other ways of determining that information. Your question is based on the assumption that this is some kind of feature which has been disabled and can be re-enabled, which is fundamentally untrue.</p>
</blockquote>
</blockquote>
<blockquote><p>I will not: I will not allow the ignorance that spews from Redmond to infect my software.</p>
<p>I will not: I will not cater to users with a broken OS.</p>
<p>I will not: I will not bother because it represents the minimal technical hurdle for Windows users.</p>
</blockquote>
<blockquote><p>[A developer renames his <code>readme</code> to <code>readme.txt</code>]</p>
<blockquote><p>While it may make logical sense to some people, the ultimate implication when you see a .txt file is that the developer uses Windows. I'm not sure a lot of developers are comfortable with that.</p>
</blockquote>
<blockquote><p>No. File extensions are stupid and broken.</p>
<blockquote><p>Why? What's wrong with encoding metadata about the content in the filename?</p>
<blockquote><p>Because it then prevents me from changing the filename the way I want to. Because legacy garbage.</p>
</blockquote>
</blockquote>
</blockquote>
<blockquote><p>Interesting... most commenters here (so far) seem to be against the extension. Can someone explain why? "README" doesn't tell me if it's text, or markdown, or HTML, or anything. Having ".txt" lets me know the format without opening it first to see.</p>
<blockquote><p>I hate them because they're an abstraction leak. The type of a file's content is different from the application that I want to use to manipulate it, which both are in turn different from the name I chose to give the file. That current file systems and the GUI representations on top of them are so badly designed as to confuse three unrelated concepts is a failing of software and as clear an indication as you could ask for of the triumph of Worse Is Better.</p>
</blockquote>
</blockquote>
</blockquote>
<p>These two in particular point out a problem that's already solved on Windows:</p>
<blockquote><p>You should not use an extension for executables, as they they are not interchangeable. Imagine that you have a shell script a.sh, then re-write in python a.py, you now have to change every program that calls your script, you have leaked an implementation detail.</p>
</blockquote>
<blockquote><p>If you give a shell script a .sh extension, you'll have to type that .sh as part of the command name when starting it. That's the main reason why I don't like putting that extension in.</p>
</blockquote>
<p>We need to talk about PATHEXT.</p>
<h3 id="pathext">PATHEXT<a class="header_anchor_link" href="#pathext"> (§)</a></h3>
<p>On Windows, there is an environment variable called PATHEXT. It contains a semicolon-separated list of file extensions that you <strong>don't</strong> have to type when running programs on the command line. For example, if .py is on PATHEXT, then you can just ask for <code>dns</code> on the commandline and <code>dns.py</code> will be a valid candidate. On the other hand, if PATHEXT is blank, then you must type the file extension for every executable, even .exe. At that point, the shell builtins will be the only extensionless commands you can run.</p>
<p>The order of extensions on PATHEXT indicates the order of preference for candidate files.</p>
<pre><code>C:\anywhere&gt;set PATH=C:\cmd;C:\Windows\System32
C:\anywhere&gt;set PATHEXT=.py;.bat;.exe
C:\anywhere&gt;where dns
C:\cmd\dns.bat
C:\cmd\dns.exe
C:\cmd\dns.py
C:\anywhere&gt;dns
You ran dns.py!</code></pre>
<pre><code>C:\anywhere&gt;set PATHEXT=.bat;.py;.exe
C:\anywhere&gt;dns
You ran dns.bat!</code></pre>
<pre><code>C:\anywhere&gt;set PATHEXT=.exe;.bat;.py
C:\anywhere&gt;dns
You ran dns.exe!</code></pre>
<pre><code>C:\anywhere&gt;set PATHEXT=.py
C:\anywhere&gt;where.exe dns
C:\cmd\dns.py
C:\anywhere&gt;where.exe dns.bat
C:\cmd\dns.bat
C:\anywhere&gt;dns
You ran dns.py!</code></pre>
<p>Notice I am now calling <code>where.exe</code>, since .exe is no longer on PATHEXT, thus <code>where</code> no longer matches <code>C:\Windows\System32\where.exe</code>.</p>
<pre><code>C:\anywhere&gt;set PATHEXT=
C:\anywhere&gt;where.exe dns
INFO: Could not find files for the given pattern(s).
C:\anywhere&gt;where.exe dns.py
C:\cmd\dns.py
C:\anywhere&gt;dns.py
You ran dns.py!</code></pre>
<p>Regardless of the value of PATHEXT, you are always allowed to specify the full name of the file, like <code>dns.py</code>. Even if <code>.py</code> is not on PATHEXT, <code>dns.py</code> itself is still on the PATH. PATHEXT only affects the evaluation of the bare name, <code>dns</code>.</p>
<p>And just like that, we've achieved the black box principle of executables. You can rewrite a .bat program in .py, or you can supercede a System32 exe with a script of your own. The only thing you can't do is supercede the shell builtins — <code>dir</code> always does <code>dir</code> even if you have a candidate in the cwd or on the PATH — you'll have to call those files by their extensioned names.</p>
<p>Between my public <a href="https://git.voussoir.net/voussoir/cmd">cmd</a> repository and my non-public cmd folder, I've got more than 180 .py and .bat files making up my command line toolkit. Of course I'm not specifying the extensions when I run them, guys.</p>
<h2 id="hedges">Hedges<a class="header_anchor_link" href="#hedges"> (§)</a></h2>
<p>It's time for me to bat for the other team and explain why Windows's solution is also bad.</p>
<h3 id="the_registry">The registry<a class="header_anchor_link" href="#the_registry"> (§)</a></h3>
<p>The Windows registry is not a beautiful place, and the mapping of extensions to executables is not as easy as one would hope. With Windows 10, Microsoft has introduced some new APIs for dealing with extension associations, mostly because with the old APIs, inconsiderate software developers would non-optionally dive into the registry and set their program as the default for a bunch of filetypes during install, leaving the average user without a clear understanding of how to revert. However, I haven't learned these new systems because Windows refers to them as "default apps" and I have a vendetta against the word "app" so I avoid that whole interface at all costs. When I need to edit extensions, I always just open the registry and do it myself.</p>
<p>The most straightforward technique that I'm familiar with is to create a key <code>HKEY_CLASSES_ROOT\.ext</code>. You can give it a <code>(Default)</code> value containing the name of another HKCR key, and this will act as a redirect for the remainder of the process. Then, beneath either the <code>.ext</code> or the redirect destination, you create <code>shell\open\command\(Default)="C:\myprogram.exe" "%L" %*</code> for the most simple invocation.</p>
<p>Beyond that, it's all a little confusing with keys like OpenWithList, OpenWithProgids, and values like Content Type and PerceivedType (do they do anything for files without an explicit <code>shell\open\command</code>?), and if you want to make two extensions that run the same program but have different icons (.txt, .srt, .css → text editor) you wind up duplicating the whole shell command for each of them because you can't do multiple-inheritance style mappings. Unless I'm missing something, which is also likely.</p>
<p>Also, there are <em>even more</em> keys in <code>HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext\UserChoice</code>. When dealing with extensions that I didn't make myself, NirSoft's <a href="https://www.nirsoft.net/utils/file_types_manager.html">filetypesman</a> helps me locate their hodgepodge of keys.</p>
<p>The point is that while I prefer extension-executable systems over shebang systems, that does not mean I'm praising the registry as it exists today.</p>
<h3 id="mp3exe">.mp3.exe<a class="header_anchor_link" href="#mp3exe"> (§)</a></h3>
<p>A common criticism of Windows is that non-savvy users can be tricked into downloading some file called "Hotel California.mp3.exe" and running it because they think it's an mp3 file. This is made 1,000 times worse by the unfathomable, unforgiveable, bone-headed decision by Microsoft to hide file extensions of "known file types" by default, hiding the <code>.exe</code> but leaving the <code>.mp3</code>. It boggles the mind and stupefies the senses that this default is still in place after all these years, but it is.</p>
<p>On Unix, the downloaded file would not be executable until you <code>chmod +x</code>, which is something you can't trick most people into doing. On Windows, the .exe requires no activation and is ready to detonate as soon as you double-click on it.</p>
<p>That's why UAC was added to Windows, but users will Accept any dialog box that stands between them and their mp3 without reading it, so that hasn't changed much.</p>
<h2 id="conclusion">Conclusion<a class="header_anchor_link" href="#conclusion"> (§)</a></h2>
<p>Let me re-quote two of the comments I shared above:</p>
<blockquote><p>Because it then prevents me from changing the filename the way I want to.</p>
</blockquote>
<blockquote><p>The type of a file's content is different from the application that I want to use to manipulate it, which both are in turn different from the name I chose to give the file</p>
</blockquote>
<p>These comments make a good point, that it would be nice to have the ability to associate files to programs without having to name them a certain way. Computing is still a relatively young field, and I wouldn't mind seeing new ways of solving this problem. I mentioned that I'd like to see some multiple-inheritance, which would simplify icon management, default programs, and human-friendly type names. But, by my insistence on maintaining file hashes, you can infer that I'd like a solution out-of-band from the file content itself. Current implementations of <a href="https://en.wikipedia.org/wiki/NTFS#Alternate_data_streams_(ADS)">alternate data streams</a> are not ready to steal this stage because they aren't transmitted when sharing the file over the internet, for better and worse.</p>
<p>For now, I am satisfied with file extensions (as long as I wrangle the registry myself), and I want the Unix elitists to see how I use them in my favor; that they impose no friction on my workflow at all. inb4 Stockholm syndrome.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/shebangs/shebangs.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/3475cb0abf63172e6392487ffaf41755f71a18e3"><time datetime="2023-09-18T21:01:09-07:00">2023-09-18</time> Replace github links with git.voussoir.net.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/3946a09872ee8b40ea8420b5587e35ccb3da9556"><time datetime="2020-12-08T18:35:08-08:00">2020-12-08</time> Add shebangs.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: 92ac67ca61ba835938eae05c8e7aa37dd6691eec/sqlite_what_a_hunk
title: SQLite, what a hunk!
url: https://voussoir.net/writing/sqlite_what_a_hunk
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>SQLite, what a hunk!</h1>
<p>Oh. My. God. Systers. Listen up. See that database in that corner there with the cute leather-bound journal? Don't stare! Yeah, that's SQLite. SQLite! You know!! Well, he's <em>oooonly</em> the handsomest, hunkiest piece of OSS in pretty much the <em>whole world</em>.</p>
<p>SQLite's got, like, billions and billions of installs. I mean there's basically more SQLite installs than people. I bet you've got a dozen in your purse right now and you don't even realize it, that's how installed he is. And he hardly even flaunts it. He's written in C, right, so he's like the most cross-platform thing you've ever seen besides blinking LEDs.</p>
<p>Girls, we gotta talk testing. You know how most libraries just moan and whine <em>awwwwww, do I have to? do I have to do testing? I don't waaaannaaa</em> and they just ship without it, right? Such babies. What a turn off. It's just so typical. I mean, like, you only spent hundreds of hours on that program, <em>surely</em> you don't wanna make sure it actually <strong>works</strong>, do you? Then <em>oops</em>! it's full of bugs! Like duh!! Or — or — they'll import the latest hotshot testing library they saw on Twitter and pack it to the lid with mocks faker than their designer jeans and fixtures that wouldn't even fit in their SF studio apartment. Is that what passes for testing these days? Talk about posers. Then there's SQLite and, just listen to this: "The reliability and robustness of SQLite is achieved in part by thorough and careful testing". Understatement. of. the. YEAR! SQLite's got <strong>six-hundred-and-forty</strong> times more test code than actual library code. No! I'm not joking! And these are honest-to-god full branch coverage tests we're talking here. SQLite's got more tests than you've got self-respect and then he's got self-respect on top of that.</p>
<p>Okay, now see that other repository by the bar? The one who's always posting selfies on Medium and Show HN? Yeah, he's got like three monthly pageviews and ten GitHub stars <em>total</em> and <em>still</em> has the gall to license himself under a restrictive license. Pffffft! yeah!! right!!! <strong>As if</strong> anyone's gonna wanna steal <strong>that</strong>. Gross!! Get real. Meanwhile SQLite is literally in the <strong>public domain</strong>. Not even the Linux kernel is willing to go there. God that's so hardcore. Can you believe it? SQLite's like "you wanna copy me? sure thing". Go ahead and find one other piece of software with THAT much confidence. I'll be waiting. So don't waste my time telling me about your dates with <em>""humanitarians""</em> because the most devoted, generous, and well-indexed humanitarian <em>I've</em> ever seen is sitting right. over. there.</p>
<p>He's not the kind of open source that says "if you found a problem, just make a pull request". No way. If you do that, SQLite literally won't even use it. He'll rewrite the whole thing from scratch without breaking a sweat. Well, because it's the right thing to do! To maintain the purity of the public domain and everything. You can scrape Stack Overflow alllllll you like and you won't find a single line that's been copied into the SQLite source. That's for children, and children don't know how to run a business with projections to 2050 the way SQLite does.</p>
<p>And the docs. Wow the docs. I'll text you the link later, you've <strong>got</strong> to check them out. Not only are the docs backed by an SQLite instance on a shared VM with twenty-three others that STILL maintains a system load below 0.1 — because SQLite is a gentleman and that's what gentlemen do — but the tone throughout the whole thing is just dripping with confidence but, like, also humility. Is that an oxymoron or something? Who cares. Like there's a whole section telling you when NOT to use SQLite and, turns out, SQLite is still pretty much always awesome. Not like those desperate, insecure modules that gotta sound like they're made of pixie unicorn dust just to get your attention. Or even worse is when they're backed by a proprietary web service. Um, no thanks! Don't you know you're competing with an in-process database here? You can literally even download the support forum to read through it offline, that's how independent SQLite is. And just check the page source when you're reading the docs. First time I did I was like "whaaaat! where's all the javascript!! isn't this the modern web!!" you know what I mean? No way. SQLite's old school. I bet he gets his B-Trees properly tailored and everything. Mmmm, how I'd like to see that! So lean but still <em>sooo</em> powerful. What a hunk. Oh and those properly SVGed railroad graphs, the ones that even work with ctrl+f? Now those have saved my bacon more times I'd care to admit. Speaking of old school, take a look at the comments inside the amalgamation sometime. I mean of course they're exemplary, but notice anything about the punctuation? Wow, what a throwback.</p>
<p>Now, it's been a long time since one-liners were in fashion. I mean it's so eighties. Like leg warmers. Most of the time, I hear a one-liner, and I'm like, <em>come on Schwarzenegger stop it already</em>. But SQLite just pulls it off somehow. "Small. Fast. Reliable. Choose any three." Now THAT'S a timeless line. If every program was even 5% of what SQLite is, the world'd be a better place. Oh! Shhh! He's coming this way!</p>
<p><em>swoon, faint</em></p>
<p>SQLite makes me feel inadequate.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/sqlite_what_a_hunk/sqlite_what_a_hunk.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/3433563101e8e2b20dbbcf42ff5fe352463e1c6e"><time datetime="2021-01-25T03:11:50-08:00">2021-01-25</time> Fix typo "gentlemen" -&gt; "gentleman".</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/92ac67ca61ba835938eae05c8e7aa37dd6691eec"><time datetime="2021-01-01T15:48:49-08:00">2021-01-01</time> Add sqlite_what_a_hunk.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: ae109e02ea0fa11ca5b7b44f139b8c9797dfb3f0/cancel_this_album
title: Cancel This Album!
url: https://voussoir.net/writing/cancel_this_album
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>Cancel This Album!</h1>
<p>According to Google Trends, the term <a href="https://trends.google.com/trends/explore?date=today%205-y&amp;geo=US&amp;q=cancel%20culture">cancel culture</a> started to appear in late 2019 and had its big heyday in mid-2020, so in internet years I'm rather late. I think the concept of cancel culture is plain stupid: a bunch of people who have willingly centralized themselves under a privately-owned social media site whose primary / only source of revenue is advertisements act surprised and indignant when they're kicked out because they're harming the company's image.</p>
<p><img alt="" loading="lazy" src="/writing/cancel_this_album/pikachu.jpg"/></p>
<p>For the past couple of months, every time I've seen an article about cancel culture or someone getting "cancelled", I've gotten a spur of inspiration to write something about it, but I've always decided against it because my conclusion is just so trivial. Stupid games. Stupid prizes. That's about it. Maybe someday people will learn to stop investing their lives into social media giants. Right after they learn that fire is hot.</p>
<p>But, with the recent suspension of Donald Trump's Twitter account, I'm going ahead and posting this one because maybe he'll read it and I can help enact some real change around here.</p>
<blockquote><p><strong>Did you know?</strong></p>
<p>You can make your own website, and you can say whatever you want there!</p>
</blockquote>
<p>It's true! Just head on over to w-w-w-dot-icann-dot-org to learn all about how owning your own domain works, and watch <a href="https://www.youtube.com/watch?v=mfMrVKnGzwg" title="All Right Here at Your Fingertips! (1997)">this helpful guide</a> to learn how to navigate the internet.</p>
<p>Let's use an analogy: if you go inside someone else's house, and say something they don't like, they can kick you out. You might think their rules are totally lame, and may even be cramping your style,  harshing your vibe, or throwing off your groove! But that's the way it goes when you're in someone else's pad, man. It's okay though, because when you go back to your own house, you can do anything you want. You can even listen to Nickelback. The same is true on the internet. Go make your own website and you won't have to consult anyone regarding what you post.</p>
<p>If, by chance, your web host does decide to stop hosting your pages, all you have to do is pick a different one and restore from a backup, because of course you're making regular backups of the things you care about and not just expecting the internet to keep everything for you forever. With the standardization of web protocols, every web host is functionally the same! It's totally commoditized, dudes!</p>
<p><img alt="" loading="lazy" src="/writing/cancel_this_album/guitar.jpg" title="Most excellent!"/></p>
<p>For the videographically inclined among you, I'm sure you're thinking "But how would I ever host my videos without Youtube? I can't afford to do it myself!". Congratulations on discovering that hosting and distributing video is stinking expensive! People don't seem to have any trouble understanding that mansions are expensive, and that getting kicked out of one doesn't automatically grant you access to another. Sorry you got comfortable.</p>
<blockquote><p><strong>Did you know?</strong></p>
<p>Your readers can use RSS to see when you make a post, without all the hassle and fuss of intermediaries!</p>
</blockquote>
<p>Let's talk supply chains. Every supply chain manager knows that you want to keep the number of middle men low, because middle men always find a way to take their cut. If the words "chronological newsfeed" ring any painful bells for you, you already know what kinds of cuts these middle men take, and that's just the beginning.</p>
<p>Luckily, Mr. Berners-Lee did a real bang-up job on the whole web thing. He made it so you can send information directly between yourself and another person. What a cool guy. And when you use encryption, you can be sure the signal comes through loud and clear even as it passes through your ISP's lines. You know how much I love these standardized protocols. Just set up your RSS feed, and your readers can interact with it however they'd like! The opportunity for self-sufficiency is right under your nose!</p>
<p>You might find that building an audience around your own domain is quite difficult. Weaning off the teats of the internet megaphones and their algorithms can take some time, and you might feel the urge to go crawling back. But it's live by the tweet die by the tweet over there. You want longevity and independence, you put in the extra work. That is, if you believe that what you publish is worth anything.</p>
<blockquote><p><strong>Did you know?</strong></p>
<p>Putting all your eggs in one basket has been considered bad practice ever since eggs were invented! Or was it the chicken...</p>
</blockquote>
<p>Stop by any local accounting office and they'll all tell you the same thing: diversify! diversify! diversify! Here on the internet we love to think we're pioneering new things at every corner, but in fact the concept of risk management is very old! If you're relying on a single party with whom you have no real contract to maintain your entire internet presence on an account you got for the low price of $0.00, you're just asking for trouble! I don't know why this is so hard for you!</p>
<p>The difference is that the baskets of today are different from the baskets of a hundred years ago. You know they just don't make 'em like they used to. See, these baskets have a real vested interest in getting you to put all your eggs there. They'll tempt you like the devil himself, promising <em>likes, followers, and views</em>. You've got to resist. Just do what I do, and write articles that nobody ever sees.</p>
<p>It's okay to have a Twitter account, and a Youtube account, and a reddit account. Some may even say it's okay to have a Facebook account! But if you don't have a contingency plan for when you lose that account, for a good reason or bad, you're simply not prepared!</p>
<p><img alt="" loading="lazy" src="/writing/cancel_this_album/stonks.jpg"/></p>
<hr/>
<p>None of this is to say that if a platform does something you disagree with, you should never speak up. You can let them know that you think what they did is wrong. Just remember that your right to free speech doesn't trump their right to ignore you! Social media didn't come down to us from on high, it's made by people and they can do what they want.</p>
<p>Donald, you're in a great position to help both of us out here. Start telling people about the decentralized web, independent publishing, Net Neutrality, and RSS, and you'll be doing the internet a favor the likes of which we haven't seen in years. You're always making a show of your dissatisfaction towards mainstream publishing, so this should be right up your alley! We get renewed interest in open protocols, and you get a place to put any old thing you want with nobody to stop you! It's a win-win!</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/cancel_this_album/cancel_this_album.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/9cce9f9ef055a5e268a9b913871ff8d0473cf3eb"><time datetime="2021-06-07T19:08:19-07:00">2021-06-07</time> Move S3 images to my domain.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/ae109e02ea0fa11ca5b7b44f139b8c9797dfb3f0"><time datetime="2021-01-10T00:32:06-08:00">2021-01-10</time> Add cancel_this_album.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: 478305b8fea13280b8ec70e5536682fc740c08c4/android_notification_orthogonality
title: Android and the curious case of notification orthogonality
url: https://voussoir.net/writing/android_notification_orthogonality
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>Android and the curious case of notification orthogonality</h1><ol id="table_of_contents">Table of contents<li><a href="#the_situation">The situation</a></li><li><a href="#what_a_mess">What a mess!</a></li><li><a href="#proposed_solution">Proposed solution</a></li></ol>
<h2 id="the_situation">The situation<a class="header_anchor_link" href="#the_situation"> (§)</a></h2>
<p>On modern Android, applications can register multiple channels / categories through which they'll send notifications, so that you can configure different types of notifications to behave differently. It's a great concept, but the actual configuration UI leaves something to be desired.</p>
<p>Here's what it looks like to configure an app's notification channel:</p>
<p><img alt="" loading="lazy" src="/writing/android_notification_orthogonality/ankidroid.png"/></p>
<p>For Medium and Low importance, notifications appear under a "Silent notifications" header on the dropdown:</p>
<p><img alt="" loading="lazy" src="/writing/android_notification_orthogonality/silenced_levels.png"/></p>
<p>And although the channel menu has an on/off switch for badges, there is a totally separate menu for choosing whether badges are numbers or just dots, because this option applies system-wide:</p>
<p><img alt="" loading="lazy" src="/writing/android_notification_orthogonality/badges.png"/></p>
<p>Similarly, if you want to disable status bar icons entirely, that's listed somewhere else:</p>
<p><img alt="" loading="lazy" src="/writing/android_notification_orthogonality/status_bar_toggle.png"/></p>
<p>And finally, there is another option that only applies to incoming phone calls that gives you ringing and vibration together.</p>
<p><img alt="" loading="lazy" src="/writing/android_notification_orthogonality/ring_with_vibrate.png"/></p>
<p>So, if you want to modify all of the available options related to notifications, you'll have to make a Vernian journey through the operating system and hope you get it done in less than eighty days:</p>
<ul>
<li><p>Notifications menu to enable status bar.</p>
</li>
<li><p>App &amp; channel menu to enable the channel.</p>
</li>
<li><p>Channel importance submenu:</p>
</li>
</ul>
<table>
<thead><tr>
<th style="text-align:left">Level</th>
<th style="text-align:left">Status bar icon</th>
<th style="text-align:left">Dropdown area</th>
<th style="text-align:left">Sound/vibrate</th>
<th style="text-align:left">Pop up</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Urgent</td>
<td style="text-align:left">Yes</td>
<td style="text-align:left">Primary</td>
<td style="text-align:left">Yes</td>
<td style="text-align:left">Yes</td>
</tr>
<tr>
<td style="text-align:left">High</td>
<td style="text-align:left">Yes</td>
<td style="text-align:left">Primary</td>
<td style="text-align:left">Yes</td>
<td style="text-align:left">No</td>
</tr>
<tr>
<td style="text-align:left">Medium</td>
<td style="text-align:left">Yes</td>
<td style="text-align:left">Silenced</td>
<td style="text-align:left">No</td>
<td style="text-align:left">No</td>
</tr>
<tr>
<td style="text-align:left">Low</td>
<td style="text-align:left">No</td>
<td style="text-align:left">Silenced</td>
<td style="text-align:left">No</td>
<td style="text-align:left">No</td>
</tr>
</tbody>
</table>
<ul>
<li><p>Badge menu to choose numbers or dots.</p>
</li>
<li><p>Sound menu to choose phone call ring with vibrate, because phone calls are special.</p>
</li>
</ul>
<p>Additionally, I think some properties are controlled by the app itself, such as whether to wake the screen or not. During my experiments with AnkiDroid, the synchronization notification never woke the screen even when the channel was set to Urgent.</p>
<p>My phone happens to be an LG, and their firmware has some bonus options that only apply to the lock screen, which is located in, you guessed it, a separate menu:</p>
<p><img alt="" loading="lazy" src="/writing/android_notification_orthogonality/lg_special.png"/></p>
<h2 id="what_a_mess">What a mess!<a class="header_anchor_link" href="#what_a_mess"> (§)</a></h2>
<p>There are two main problems that afflict me every time I want to change something:</p>
<p>1. <strong>Mental translation steps</strong>: Before I even open the Settings, I've already decided what I want to achieve. For example, "keep this app's icon on the status bar, but disable its sound and vibration". The problem with Android's UI is I have to translate my goal into its terminology of importance levels, so that it can translate that back into the actual outcomes.</p>
<p>In my <em>head</em>, I'm thinking "keep icon, disable vibration", but on my <em>screen</em> I'm seeing "Urgent, High, Medium, Low". Well I don't want sound so I can rule out Urgent and High. Low... hmm, wait, is the status bar considered an interruption? I don't really think of it as an interruption. Not like the popups anyway. Oh, popups only apply to Urgent so I guess Low must disable the status bar. So that means I want Medium. Ok. That's a lot more work than "keep icon, disable vibration".</p>
<p>This wording is unnecessarily opinionated. I would say that having an icon on the status bar but no sound is quite low importance, but Android thinks that's a medium. The labeling sounds like it's catered towards people who have so many apps installed that they don't even know where their notifications are coming from, so to even appear on the status bar is a medium-level honor. And I would expect a notification marked as Urgent to ring many times so it's impossible to miss, because, well, it's urgent! But that's not the case. Why doesn't the UI just present me with facts instead of these subjective names? Then we could skip all this translation.</p>
<p>I'd also like you to notice that the wording switches from the affirmative voice, "Make sound", to the negative voice, "No sound". Instead of expressing their own outcomes, Medium and Low express how their outcomes contrast with Urgent and High, requiring me to cross-reference everything before deciding. None of the options even mention the status bar, it must be deduced from the contrast between "do pop up" and "no visual interruption".</p>
<p>And this is the simple case where the solution is entirely within the Importance menu. To configure incoming calls, or use LG's bonus settings, I have to figure out which menus I need to visit to satisfy each part of my request, and hit them up one by one.</p>
<p>2. <strong>Impossible combos</strong>: I'm starting to get confused with all these menus so maybe I'm missing something, but it seems to me that certain combinations of options are not possible through the UI. For example, to get popups I have to use Urgent, but this also implies sound/vibrate. What if I want an app's notifications to pop up silently, without setting my whole phone to silent because I still want texts to buzz? Some apps have this kind of choice built inside the app itself, which controls a parameter to its notification channel. And once again, I don't think lockscreen wake is an option exposed to the user, it seems to be the app's own choice.</p>
<p>As you saw, incoming phone calls have the option to ring and vibrate, but regular app notifications don't seem to have this option. With importance levels Urgent and High, I get a sound if my phone is in sound mode, or a buzz if my phone is in vibrate mode. From what I can tell, I can't get both. Maybe some manufacturers add this option to the firmware. But why is it like this?</p>
<h2 id="proposed_solution">Proposed solution<a class="header_anchor_link" href="#proposed_solution"> (§)</a></h2>
<p>Notifications either pop up, or don't. That's a binary choice. They make sound, or don't. They buzz or don't. Wake the screen or don't. All binary choices. Compare these two sample UIs:</p>
<blockquote><p><strong>Notification UI #1</strong></p>
<p><input name="notificationator" type="radio"/> No sound or vibrate, don't pop up</p>
<p><input name="notificationator" type="radio"/> Vibrate only, don't pop up</p>
<p><input name="notificationator" type="radio"/> Sound only, don't pop up</p>
<p><input name="notificationator" type="radio"/> Sound and vibrate, don't pop up</p>
<p><input name="notificationator" type="radio"/> No sound or vibrate, pop up</p>
<p><input name="notificationator" type="radio"/> Vibrate only, pop up</p>
<p><input name="notificationator" type="radio"/> Sound only, pop up</p>
<p><input name="notificationator" type="radio"/> Sound and vibrate, pop up</p>
</blockquote>
<blockquote><p><strong>Notification UI #2</strong></p>
<p><input name="notificationator" type="checkbox"/> Vibrate</p>
<p><input name="notificationator" type="checkbox"/> Sound</p>
<p><input name="notificationator" type="checkbox"/> Pop up</p>
</blockquote>
<p>For these three behavioral options, UI #1 has 2<sup>3</sup> = 8 presented choices because each choice is packing a full three-bit state. UI #2 only needs the three checkboxes because they each represent 1 bit, a single binary choice. If you add in screen wake, UI #1 will have 2<sup>4</sup> = 16 options to pick from, while UI #2 will just have 4. Not to mention, #1 takes ages to read and understand.</p>
<p>With all of the different notification behaviors to control, you can imagine that 2<sup>n</sup> would quickly become an unnavigable mess. That's why the Importance menu lumps things together — the Urgent level enables popups, but also implies the use of sound.</p>
<p>Android's UI is a weird hybrid that uses style #1 for its Importance menu, with the lumping of behaviors to reduce the option count, but <strong>also</strong> uses style #2 for the badge, which is presented as a standalone on/off switch!</p>
<p><strong>Orthogonality</strong> means you can change one thing without changing anything else. The badge switch is on or off, and doesn't affect any other behaviors. It gets an orthogonal seal of approval and a handshake from the governor of Orthogon. The Importance menu has certain behaviors implying others, and makes some combinations of behaviors impossible. It gets a disappointed frown.</p>
<p><img alt="" loading="lazy" src="/writing/android_notification_orthogonality/giveemwhattheywant.png"/></p>
<p>To me, it is clear that the UI should make much, much heavier use of checkboxes / toggle switches:</p>
<blockquote><p><strong>Notification Channel</strong></p>
<p><input checked="True" name="notificationator" type="checkbox"/> Enabled</p>
<p><input name="notificationator" type="checkbox"/> Vibrate</p>
<p><input name="notificationator" type="checkbox"/> Sound</p>
<p><input name="notificationator" type="checkbox"/> Status bar</p>
<p><input name="notificationator" type="checkbox"/> Popup</p>
<p>Badge:</p>
<blockquote><p><input name="notificationator" type="radio"/> No badge</p>
<p><input name="notificationator" type="radio"/> Dot badge</p>
<p><input name="notificationator" type="radio"/> Number badge</p>
</blockquote>
<p><input name="notificationator" type="checkbox"/> Wake screen</p>
<p><input name="notificationator" type="checkbox"/> Blink LED</p>
<p><input name="notificationator" type="checkbox"/> LG Bubble</p>
<p><input name="notificationator" type="checkbox"/> LG Sidelight</p>
<p>et cetera</p>
</blockquote>
<p>Some notes:</p>
<ul>
<li>I think it's unlikely that you'd want popups but no status bar icon. I also think it's unlikely you'd want sound with no visual. But the whole point of this exercise is to show that the Android developers' decisions of what I'm likely to want were not good enough, and I'd be foolish to make the same mistakes in my own suggested fix!</li>
<li>The global badge style setting is unnecessary: if an app has one channel set to number badges, and another channel set to dot badges, numbers should take precedence when rendering.</li>
<li>The system volume level always wins. The sound checkbox would do nothing when you're in vibrate mode, and so forth.</li>
</ul>
<p>Now, you'd probably want to have a page for configuring the default settings to apply to new and unconfigured apps. Then, perhaps, each of these checkboxes would be replaced with a choice of explicit yes, explicit no, and follow default. The UI should also remind you what your default is set to, so you don't have to cross-reference it.</p>
<p>And that's it. All you need is one menu for setting the default configuration, and one menu for configuring real channels. No more of this scatterbrained, ten screens of goose chase UI. Just let me control my device!</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/android_notification_orthogonality/android_notification_orthogonality.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/9cce9f9ef055a5e268a9b913871ff8d0473cf3eb"><time datetime="2021-06-07T19:08:19-07:00">2021-06-07</time> Move S3 images to my domain.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/478305b8fea13280b8ec70e5536682fc740c08c4"><time datetime="2021-01-14T22:38:25-08:00">2021-01-14</time> Add android_notification_orthogonality.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: c105505cb447284e332587d56667af60f805078e/september_10000
title: Saturday, September 10000, 1993
url: https://voussoir.net/writing/september_10000
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>Saturday, September 10000, 1993</h1>
<p>In September 1993, AOL brought Usenet access to the general public. Previously, Usenet was mainly available in institutions like universities, and saw waves of new users every September as freshmen got online.</p>
<p>New users have been coming online ever since, and that September never ended.</p>
<p><a href="https://en.wikipedia.org/wiki/Eternal_September">https://en.wikipedia.org/wiki/Eternal_September</a></p>
<p><a href="https://voussoir.net/eternalseptember">https://voussoir.net/eternalseptember</a></p>
<p>Happy 10,000.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/september_10000/september_10000.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/c105505cb447284e332587d56667af60f805078e"><time datetime="2021-01-16T00:03:05-08:00">2021-01-16</time> Add september_10000.md</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: 0e9d6fc438128231cdbe1d5fcbab9d009fabc3a2/termux_ftp
title: How to run an SSH, SFTP server from Termux
url: https://voussoir.net/writing/termux_ftp
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>How to run an SSH, SFTP server from Termux</h1><ol id="table_of_contents">Table of contents<li><a href="#almost_all">"Almost all"</a></li><li><a href="#initial_setup">Initial setup</a></li><li><a href="#password_auth">Password auth</a></li><li><a href="#keyfile_auth">Keyfile auth</a></li><li><a href="#homescreen_shortcut">Homescreen shortcut</a></li></ol>
<p>With <a href="https://f-droid.org/en/packages/com.nutomic.syncthingandroid/">Syncthing</a> in one hand and <a href="https://f-droid.org/en/packages/com.termux/">Termux</a> in the other, you can do almost all of your pc-phone file transfer wirelessly. Here's how to serve SSH and SFTP from Android.</p>
<h2 id="almost_all">"Almost all"<a class="header_anchor_link" href="#almost_all"> (§)</a></h2>
<p>I have an LG K10 running Android 7 with an SD card inserted. I find that Termux isn't able to write to the SD card. The GitHub issues say that you can write to <a href="https://github.com/termux/termux-app/issues/20">one directory</a>, but you can't get general access. You'll have to stick to writing to the internal storage.</p>
<h2 id="initial_setup">Initial setup<a class="header_anchor_link" href="#initial_setup"> (§)</a></h2>
<ol>
<li><p>Download and install <a href="https://f-droid.org/en/packages/com.termux/">Termux</a>.</p>
</li>
<li><p>Run <code>termux-setup-storage</code>, grant it permission, then reboot Termux. You can type <code>exit</code> or pull down the notification and press the Exit button.</p>
</li>
<li><p>You will find a new folder <code>~/storage</code> which contains some symlinks to various directories on the phone. Personally, I prefer to remove this with <code>rm -rf ~/storage</code> and then <code>ln -s /storage/emulated/0 ~/internal</code>, but this is not required.</p>
</li>
<li><p>Run <code>pkg install openssh</code>.</p>
</li>
<li><p>You will probably also want <code>pkg install vim</code>.</p>
</li>
</ol>
<h2 id="password_auth">Password auth<a class="header_anchor_link" href="#password_auth"> (§)</a></h2>
<p>At this point I am following the official Termux Wiki page on <a href="https://wiki.termux.com/wiki/Remote_Access">Remote Access</a>, but I'll simplify the presentation:</p>
<ol>
<li><p>Run <code>cat /data/data/com.termux/files/usr/etc/ssh/sshd_config</code> to confirm that the contents match the default as seen on the wiki:</p>
<pre><code>PrintMotd yes
PasswordAuthentication yes
Subsystem sftp /data/data/com.termux/files/usr/libexec/sftp-server</code></pre>
</li>
<li><p>Run <code>passwd</code> to pick a password. I'll be switching to key-based authentication in a minute so I'm just going to pick <code>1</code> as my password. Of course, this password doesn't apply to your whole phone, just the termux emulator.</p>
</li>
<li><p>Run <code>sshd</code> to start the server.</p>
</li>
<li><p>You can run <code>ifconfig</code> within Termux to find your phone's local IP address, or, depending on your home router, you might be able to assign the phone a hostname from the admin panel.</p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/lan_ip.png"/></p>
</li>
<li><p>Open an SSH client on your PC. I'll be using <a href="https://www.putty.org/">Putty</a>.</p>
</li>
<li><p>Enter the phone's hostname or IP address, and choose 8022 for the port, and start the session.</p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/putty_session.png"/></p>
</li>
<li><p>Putty may warn you that it has never seen the server's fingerprint before, which is expected and you can accept it.</p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/unfamiliar_fingerprint.png"/></p>
</li>
<li><p>In Putty, the server will prompt you for a username. You may type anything your want, or even leave it blank and just hit Enter. Then it will ask you for the password you chose earlier.</p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/ssh_success.png"/></p>
</li>
<li><p>Congratulations! Try running a command like <code>ls</code>.</p>
</li>
<li><p>Open an FTP client on your PC. I'll be using <a href="https://winscp.net/eng/download.php">WinSCP</a>.</p>
</li>
<li><p>Enter the phone's hostname/IP and port. When I typed 8022 into the port field, WinSCP automatically changed the protocol selection from SFTP to WebDAV, so change it back to SFTP. You may enter anything you want for the username, but if you leave it blank then WinSCP will prompt you during the login process, so maybe you'd like to make something up. Also enter your password, then log in.</p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/winscp_session.png"/></p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/ftp_success.png"/></p>
</li>
<li><p>Congratulations! Try uploading some files to the phone.</p>
</li>
</ol>
<h2 id="keyfile_auth">Keyfile auth<a class="header_anchor_link" href="#keyfile_auth"> (§)</a></h2>
<p>I assume you won't be leaving your phone's server on very long, or giving it an internet-facing port, so you can leave it in password auth mode if you want. But this is a great chance to get some practice with SSH keyfiles anyway, so keep reading.</p>
<ol>
<li><p>When you downloaded Putty, you should have also gotten <code>puttygen.exe</code>. Open that program.</p>
</li>
<li><p>Leave the key type as RSA and press the Generate button to make a public/private keypair. You can use the comment field to give it a memorable name.</p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/puttygen.png"/></p>
</li>
<li><p>You may give the keypair a password, but you'll have to type this password every time you log in with Putty/WinSCP, which you may not want to do. So you can leave it blank. In a 'real-life' SSH situation, you can use a passworded keyfile to double your security; someone would have to steal your keyfile and know your password to log into your servers.</p>
</li>
<li><p>Use the "Save public key" and "Save private key" buttons to write your keyfiles to disk. You can pick any kind of name and file extension you want. I use a name like <code>voussoir.ssh.public</code> and <code>voussoir.ssh.private</code>. Do not close puttygen yet.</p>
</li>
<li><p>We need to teach the server to trust the public key we've created. In Putty, use vim to create a file called <code>~/.ssh/authorized_keys</code>.</p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/authorized_keys1.png"/></p>
</li>
<li><p>In the puttygen UI, the text box at the top has the text that needs to go into this file. You'll notice that the format of this text is <code>&lt;key type&gt; &lt;base64&gt; &lt;comment&gt;</code> where the key type is <code>ssh-rsa</code>, the base64 is the content of the publickey file you saved, and the comment is what you wrote earlier. To paste into vim over putty you may need to press Shift+Insert.</p>
</li>
<li><p>Save and quit with Esc + <code>:wq</code>.</p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/authorized_keys2.png"/></p>
</li>
<li><p>Also modify the <code>sshd_config</code> file to disable password authentication. <code>vim /data/data/com.termux/files/usr/etc/ssh/sshd_config</code></p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/sshd_config.png"/></p>
</li>
<li><p>Close Putty and WinSCP. Stop the server with <code>pkill sshd</code> and run it again with <code>sshd</code>.</p>
</li>
<li><p>Open Putty again, and enter the hostname and port.</p>
</li>
<li><p>On the left menu, choose Connection &gt; Data and put something in the username box so you won't get prompted during login.</p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/putty_data.png"/></p>
</li>
<li><p>Then choose Connection &gt; SSH &gt; Auth and browse for your private keyfile.</p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/putty_auth.png"/></p>
</li>
<li><p>Before pressing the Open button, you may want to go back to the main Session screen and click the Save button to store the configuration. Then click Open.</p>
</li>
<li><p>Congratulations!</p>
</li>
<li><p>Open WinSCP again, and enter the hostname and port and select SFTP. Put something in the username box.</p>
</li>
<li><p>Click the Advanced button and select SSH &gt; Authentication. Browse for your private keyfile.</p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/winscp_auth.png"/></p>
</li>
<li><p>You may want to save the session configuration. Then click Login.</p>
</li>
<li><p>Congratulations!</p>
</li>
</ol>
<h2 id="homescreen_shortcut">Homescreen shortcut<a class="header_anchor_link" href="#homescreen_shortcut"> (§)</a></h2>
<p>Now we'll put a shortcut on the homescreen to launch the server in a single tap.</p>
<ol>
<li><p>Download and install <a href="https://f-droid.org/en/packages/com.termux.widget">Termux:Widget</a>.</p>
</li>
<li><p>Using the shell or WinSCP, create the folder <code>~/.shortcuts</code> and create an <code>.sh</code> file inside there. I'll call it <code>sshd_widget.sh</code>.</p>
</li>
<li><p>Here is the content of my script file:</p>
<pre><code>sshd
echo SSH server running.
echo press Enter to terminate.
read continue
pkill sshd</code></pre>
</li>
<li><p>On your phone's homescreen, create a new shortcut widget from the Termux:Widget section. It will show you the files inside <code>~/.shortcuts</code>.</p>
<p><img alt="" loading="lazy" src="/writing/termux_ftp/widget.png"/></p>
</li>
<li><p>Congratulations!</p>
</li>
</ol>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/termux_ftp/termux_ftp.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/9cce9f9ef055a5e268a9b913871ff8d0473cf3eb"><time datetime="2021-06-07T19:08:19-07:00">2021-06-07</time> Move S3 images to my domain.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/0e9d6fc438128231cdbe1d5fcbab9d009fabc3a2"><time datetime="2021-03-15T09:55:14-07:00">2021-03-15</time> Add termux_ftp.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: 6a2aa792ec18a42e039ca3eb51710ae33fc88a6f/professionally_written_article
title: A professionally written article
url: https://voussoir.net/writing/professionally_written_article
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<style>
.dropcap
{
    font-size: 18em;
    font-weight: bold;
    line-height: 0.8em
}
.fakelink
{
    color: var(--color_link);
    text-decoration: underline;
}
.pullquote
{
    position: relative;
    text-align: center;
    font-size: 3em;
}
.pullquote:before, .pullquote:after
{
    content: "";
    position: absolute;
    opacity: 0.15;
    font-size: 4em;
    line-height: 0.75;
    width: 64px;
    aspect-ratio: 64/50;
    background-size: contain;
    background-repeat: no-repeat;
}
.pullquote:before
{
    background-image: url("quote_open.png");
    top: 4px;
    left: 16px;
}
.pullquote:after
{
    background-image: url("quote_close.png");
    bottom: 4px;
    right: 16px;
}
</style><p><img alt="" loading="lazy" src="/writing/professionally_written_article/hero.jpg" title="I was told I needed a hero"/></p>
<p><a class="tag_link" data-qualname="journalism" href="/writing/tags/journalism">[journalism]</a></p>
<h1>A professionally written article</h1>
<p>By voussoir | April 24 2021 some time in the afternoon | 538 words | 505 spaces | 70 punctuation | 8 legs | 10 minute read for slow readers | 5 minute read for fast readers | 1 minute read for really fast readers | 0 minute read for readers who skip straight to the comments</p>
<p>Share this article on <a class="fakelink">Facebook</a>, <a class="fakelink">Twitter</a>, <a class="fakelink">Reddit</a>, <a class="fakelink">Hacker News</a>, <a class="fakelink">TikTok</a>, <a class="fakelink">Tumblr</a>, <a class="fakelink">Vine</a>, <a class="fakelink">Instagram</a>, <a class="fakelink">Email</a>, <a class="fakelink">Medium</a>, <a class="fakelink">GitHub</a>, <a class="fakelink">The Pirate Bay</a>, <a class="fakelink">Steam Community</a>, <a class="fakelink">Bodybuilding.com</a>, <a class="fakelink">4chan</a>, <a class="fakelink">Text message</a>, <a class="fakelink">OpenStreetMap</a>, <a class="fakelink">Thesaurus.com</a>, <a class="fakelink">StackExchange</a>, <a class="fakelink">YouTube</a>, <a class="fakelink">Facebook</a>, <a class="fakelink">Facebook</a>, <a class="fakelink">Facebook</a>, <a class="fakelink">Please I'm begging you to share it on Facebook</a></p>
<hr/>
<p>"<span class="dropcap">W</span>hat America needs today," said America's prime minister Mr. Minister McMinisterface," is more professionally written articles," he continued, in an interview last Thursday. "The kind with great," he went on, "big pull quotes and," he shared exclusively with a voussoir.net journalist who was also there on Thursday, "enough share buttons," he uttered with much conviction, "for our childrens'" he almost concluded on Thursday, "children", he concluded, overwhelmed with emotion.</p>
<ul>
<li><a class="fakelink">How to finish an article instead of getting distracted after the first paragraph</a></li>
<li><a class="fakelink">Scientists warn sun moving closer to Earth, clock ticking to get beach bod in shape</a></li>
<li><a class="fakelink">Five year old entrepreneur invents cure for cancer, and it's delicious</a></li>
</ul>
<p>This professional gentleman, to whom we now refer with a different pronoun so that we can catch search queries for "is Minister McMinisterface a professional gentleman?" (yes, Minister McMinisterface is a professional gentleman), says he feels very strongly about the issue.</p>
<ul>
<li><a class="fakelink">Click here to share this article</a></li>
</ul>
<p>But not everyone has the same opinion.</p>
<p>Some people have different opinions.</p>
<blockquote class="pullquote">What America needs today is more professionally written articles. The kind with great big pull quotes and enough share buttons for our childrens' children.</blockquote><p>The interview, which took place last Thursday and was held exclusively with voussoir.net reporters because our reporters are the best, took place last Thursday and involved much incoherent rambling with the occasional useful sound bite.</p>
<p>Mr. Governor, the governor of Governmentown said he felt differently.</p>
<ul>
<li><a class="fakelink">Ever Given is back for round 2, and this time he's not giving up so easy</a></li>
<li><a class="fakelink">Politician not concerned with tax spending "Not my money"</a></li>
<li><a class="fakelink">Terrorism</a></li>
</ul>
<blockquote class="pullquote">I feel differently.</blockquote><p>But voussoir.net's top journalists are not sure if he was responding to McMinisterface's remarks or simply commenting on the potency of the drugs he was smoking at the time.</p>
<ul>
<li><a class="fakelink">Game of hide-and-seek ends after 89 years in world record, both parties previously presumed dead</a></li>
<li><a class="fakelink">How to finish an article instead of getting distracted halfway through</a></li>
<li><a class="fakelink">Labrador retriever arrested in bank heist scheme carrying Desert Eagle</a></li>
</ul>
<p>The interview took place on Thursday after a long public debate earlier that Thursday between many members of the press regarding the quality of news and journalism in America.</p>
<blockquote class="pullquote">Most news outlets don't use enough pull quotes.</blockquote><p>McMinisterface and Mr. Governor were both involved in the debate, along with key executives from Fox, CNN, Disney, Comcast, YouTube, Little Debbie, the FCC, the Department of Defense, and the United States Air Force, whose involvement was initially unclear.</p>
<ul>
<li><a class="fakelink">Click here to share this article</a></li>
</ul>
<p>During the debate on Thursday, the prevailing opinion of those involved was that American media has room for improvement and there is nothing funny going on in Area 51 we'd like to make that perfectly clear.</p>
<p>It was noted that American media is still doing pretty well despite a few shortcomings.</p>
<blockquote class="pullquote">Nothing funny going on in Area 51.</blockquote><p>Among the shortcomings, McMinisterface said that most news outlets don't use enough pull quotes. He feels that pull quotes tell the reader the important bits so they can hurry up and get this whole reading thing over with. He repeated this sentiment to us during our exclusive interview on Thursday.</p>
<p>"The situation is not looking very good", remarked CNN staff on Thursday.</p>
<p>"We'd like to work more closely with advertisers," said YouTube's marketing department. "So far, sleeping with them hasn't proven to be close enough, and we're determined to get closer. It's all about making money. Can you erase that? I meant delighting the viewers".</p>
<ul>
<li><a class="fakelink">Click here to share this article</a></li>
</ul>
<p>Fox described American media's shortcomings as "everybody should be watching Fox why isn't everybody watching Fox just watch Fox", but was not willing to take part in the exclusive interview with voussoir.net journalists on Thursday because they were too busy watching Fox.</p>
<p>Little Debbie assured the public she would continue to produce baked goods and that there's nothing funny going on in Area 51.</p>
<blockquote class="pullquote">The situation is [...] looking very good.</blockquote><ul>
<li><a class="fakelink">Mountain Dew begins production of verification cans</a></li>
<li><a class="fakelink">Terrorism</a></li>
<li><a class="fakelink">"Why aren't you returning my calls?" How to deal with a hung process</a></li>
</ul>
<p>But our anonymous sources tell us otherwise.</p>
<p>Just before the end of the debate, the CEO of YouTube was awarded the world's first "Free Expression Award" after a unanimous decision by a committee consisting of just the CEO.</p>
<p><a href="/writing/professionally_written_article/photo_large.jpg" title="Click to see full-size image"><img alt="" loading="lazy" src="/writing/professionally_written_article/photo_small.jpg"/></a></p>
<p>The rest of the interview was not very interesting so don't worry about it.</p>
<p>See also:</p>
<ul>
<li><a class="fakelink">Chicken farmer learns his animals being used in manufacture of chicken nuggets, horrified</a></li>
<li><a class="fakelink">Congress forced to pat selves on back, no one else will do it for them</a></li>
<li><a class="fakelink">Drinking coffee every morning is good for your health</a></li>
<li><a class="fakelink">Drinking coffee every morning is bad for your health</a></li>
</ul>
<center><img loading="lazy" src="/writing/professionally_written_article/guilt.png"> <img loading="lazy" src="/writing/professionally_written_article/guilt.png"> <img loading="lazy" src="/writing/professionally_written_article/guilt.png"/></img></img></center>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/professionally_written_article/professionally_written_article.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/0e766e936e3bd47b5bf9d7fd3014c4e7633c5c31"><time datetime="2023-07-31T21:50:37-07:00">2023-07-31</time> Add tag journalism.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/be46b6d2f2b821f570018ebd6cae7af2b29f3066"><time datetime="2022-09-27T18:35:30-07:00">2022-09-27</time> Improve "to whom we now refer with a different pronoun".</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/fb42eae5b341e6072dcf158e359182ffb23011cd"><time datetime="2022-04-07T16:11:47-07:00">2022-04-07</time> Increase professionalism.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/21bb20c320a76b986b82f03f87d0bded8a447689"><time datetime="2021-11-28T14:56:48-08:00">2021-11-28</time> Fix transposed whitespace.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/9cce9f9ef055a5e268a9b913871ff8d0473cf3eb"><time datetime="2021-06-07T19:08:19-07:00">2021-06-07</time> Move S3 images to my domain.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/6a2aa792ec18a42e039ca3eb51710ae33fc88a6f"><time datetime="2021-04-24T15:12:07-07:00">2021-04-24</time> Add professionally_written_article.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: 7ed9280032617b4be9b2f8d4cf9ec05c22ed2b52/kb_nearer
title: Assembling the Nearer keyboard
url: https://voussoir.net/writing/kb_nearer
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<p><a class="tag_link" data-qualname="electronics" href="/writing/tags/electronics">[electronics]</a></p>
<h1>Assembling the Nearer keyboard</h1><ol id="table_of_contents">Table of contents<li><a href="#glamour_shots">Glamour shots</a></li><li><a href="#introduction">Introduction</a></li><li><a href="#quick_links">Quick links</a></li><li><a href="#designing_the_layout">Designing the layout</a></li><li><a href="#switches_caps">Switches &amp; caps</a></li><li><a href="#microcontroller">Microcontroller</a></li><li><a href="#designing_the_switchplate">Designing the switchplate</a></li><li><a href="#designing_the_wiring_matrix">Designing the wiring matrix</a></li><li><a href="#building_the_firmware">Building the firmware</a></li><li><a href="#arrival_of_the_switchplate">Arrival of the switchplate</a></li><li><a href="#hot_glue_crimes_against_humanity">Hot glue crimes against humanity</a></li><li><a href="#wiring">Wiring</a><ol><li><a href="#columns">Columns</a></li><li><a href="#diodes">Diodes</a></li><li><a href="#rows">Rows</a></li><li><a href="#controller">Controller</a></li></ol></li><li><a href="#the_base">The base</a></li><li><a href="#stabilizers">Stabilizers</a></li><li><a href="#conclusion">Conclusion</a><ol><li><a href="#price_breakdown">Price breakdown</a></li><li><a href="#what_id_do_differently">What I'd do differently</a></li></ol></li></ol>
<h2 id="glamour_shots">Glamour shots<a class="header_anchor_link" href="#glamour_shots"> (§)</a></h2>
<p><a href="/writing/kb_nearer/glamour_1.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/glamour_1.jpg"/></a></p>
<p><a href="/writing/kb_nearer/glamour_2.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/glamour_2.jpg"/></a></p>
<p><a href="/writing/kb_nearer/glamour_3.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/glamour_3.jpg"/></a></p>
<p><a href="/writing/kb_nearer/glamour_4.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/glamour_4.jpg"/></a></p>
<p>
<center>
<iframe allow="encrypted-media" allowfullscreen="" frameborder="0" height="400" src="https://www.youtube.com/embed/cZAqB7i1tpg" width="711"></iframe>
</center>
</p>
<h2 id="introduction">Introduction<a class="header_anchor_link" href="#introduction"> (§)</a></h2>
<p>I've wanted a mechanical keyboard for a long time, but have never been happy with the options available to purchase. The main reason, as trivial as it will sound, is that I prefer the Home/End block of keys to be arranged vertically. The standard arrangement is horizontal, and I've never seen a mechanical keyboard with the vertical arrangement.</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/home_end.png"/></p>
<p>This alone was enough to get me interested in building my own keyboard, but I put it off for a long time because I knew it would be expensive. Finally, I've gotten around to it. The solution to price anxiety is to start buying some of the parts before calculating the total cost of the project so that you can tell yourself "Well, I can't stop now!".</p>
<p>The result is not perfect, but it's nearer.</p>
<p>I find myself leaning towards the word "assembling" rather than "building" for this project. I have been continuously amazed at how much work the keyboard community has put into the resources and tooling that make assembling a keyboard honestly very easy. Everyone has coordinated around the keyboard-layout-editor data format which makes the transition between each tool at each step of the process totally seamless. Really, I feel like I didn't do a whole lot except for the soldering. But we'll get to that in a bit.</p>
<p>The only actual hard part is making the choices — switch type, plate material, base material, layout, keycaps. You'll see people talk about the sound, feel, and resonance of each part, but it's hard to tell the difference on their videos.</p>
<p>This article will be a mixture of build log, diary, and tutorial. It's a bit long-winded and over-detailed, but that's because I have a new keyboard I need to break in so I want to type a lot. Maybe you'll find something here that other build logs omit. I hope it is useful to somebody.</p>
<h2 id="quick_links">Quick links<a class="header_anchor_link" href="#quick_links"> (§)</a></h2>
<ol>
<li><a href="http://www.keyboard-layout-editor.com">http://www.keyboard-layout-editor.com</a> (<a href="https://github.com/ijprest/keyboard-layout-editor">github</a>)</li>
<li><a href="http://builder.swillkb.com">http://builder.swillkb.com</a> (<a href="https://github.com/swill/kad">github</a>)</li>
<li><a href="https://kbfirmware.com">https://kbfirmware.com</a> (<a href="https://github.com/ruiqimao/qmkbuilder">github</a>)</li>
<li><a href="https://github.com/qmk/qmk_toolbox/releases">https://github.com/qmk/qmk_toolbox/releases</a></li>
</ol>
<h2 id="designing_the_layout">Designing the layout<a class="header_anchor_link" href="#designing_the_layout"> (§)</a></h2>
<p>The layout was designed with <a href="http://www.keyboard-layout-editor.com">keyboard-layout-editor.com</a>.</p>
<p>This is the final layout of Nearer:</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/layout_final.png"/></p>
<pre><code>[{x:1.5,a:7},"F13","F14","F15","F16",{x:0.5},"F17","F18","F19","F20",{x:0.5},"F21","F22","F23","F24",{x:0.25,sm:"cherry"},"Scroll Lock","Num Lock"],
[{x:0.25},"Esc",{x:0.25},"F1","F2","F3","F4",{x:0.5},"F5","F6","F7","F8",{x:0.5},"F9","F10","F11","F12",{x:0.25},"Print Screen","Pause Break",{x:0.25},"A/한","한자"],
[{y:0.25,x:0.5},"~","1","2","3","4","5","6","7","8","9","0","-",{w:2},"Back",{x:0.25},"Home","End",{x:0.25},"Back","/","*","-"],
[{w:1.5},"Tab","Q","W","E","R","T","Y","U","I","O","P","[","]","\\",{x:0.25},"Insert","PgUp",{x:0.25},"7","8","9",{h:2},"+"],
[{w:1.5},"Caps Lock","A","S","D",{n:true},"F","G","H",{n:true},"J","K","L",{a:5},":\n;","\"\n'",{a:7,w:2},"Enter",{x:0.25},"Delete","PgDn",{x:0.25},"4",{n:true},"5","6"],
[{w:1.5},"Shift","Z","X","C","V","B","N","M",{a:5},"&lt;\n,","&gt;\n.","?\n/",{a:7,w:2},"Shift","=",{x:2.5},"1","2","3",{h:2},"Enter"],
[{y:-0.75,x:14.75},"↑"],
[{y:-0.25,w:1.5},"Ctrl","Win","Alt",{w:6},"Space","Alt","Menu",{w:1.5},"Ctrl",{x:4,w:2},"0","."],
[{y:-0.75,x:13.75},"←","↓","→"]</code></pre>
<p>Here's how the layout evolved. I started by drawing my previous keyboard, a Logitech Classic Keyboard 200. It's just a regular $10 office keyboard, but it's the one responsible for my obsession with vertical Home/End.</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/layout_0.png"/></p>
<p><strong>F13-24</strong></p>
<p>The whole reason I started this project was so that I could have my vertical home/end block, but I felt I should come up with some more customization ideas to justify the time and money. Well... I wouldn't mind having a dozen more F keys to bind, so let's go with that.</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/layout_1.png"/></p>
<p><strong>Ortholinear</strong></p>
<p>I wasn't originally interested in ortholinear keyboards, but I saw <a href="https://www.youtube.com/watch?v=Ho_CFfdsmc8" title="Are Ortholinear Keyboards Better Than Staggered?">this video</a> by Ben Vallack and was convinced to try it out. Watching this video is like watching the mask come off a Scooby Doo villain. It would be one thing if the traditional QWERTY stagger matched the natural curvature of the hands or something, but the stagger leans in the same direction for both hands. There's just no excuse. So while I'm not ready to commit to a true ergo layout with staggered columns or split halves, I'm willing to make the ortho switch. I'll admit, despite all the time I've spent typing, I'm still really bad at reliably hitting numbers on the number row. Ortho should make that easier once I know that 4 and 7 are above F and J.</p>
<p><strong>KP-Backspace</strong></p>
<p>I always hate when I'm reaching for End or numpad-slash and accidentally hit Num Lock, so I knew from the beginning I'd be moving Num Lock and putting a backspace in its place. That meant putting Num Lock up with Scroll Lock, which makes for a nice 2×2 arrangement. The best part is that Print Screen and Pause/Break are the only ones I plan on pressing regularly <a class="footnote_link" data-index="1" href="#footnote_text_1" id="footnote_link_1" title="[1] Pause is used to pause commandline applications, and Ctrl+Break is used to kill commandline applications that aren't terminating on Ctrl+C.">[1]</a>, so it's nice to not have Scroll Lock in between them.</p>
<p><strong>A/한</strong></p>
<p>I gave myself a dedicated English/한글 toggle key so I could stop relying on my <a href="https://git.voussoir.net/voussoir/ahk/src/branch/master/custom_hangul.ahk">Alt+Menu AHK script</a>. The AHK solution works perfectly fine, but I would occasionally blunder the Menu keypress and be left navigating the toolbar of the current application thanks to the Alt press. I put it next to Right Shift because why is that key so long in the first place.</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/layout_2.png"/></p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/layout_3.png"/></p>
<p><strong>Shift-equals</strong></p>
<p>I was having a hard time fitting the Equals button between Minus and Backspace without reducing Backspace to 1u or taking 1 and Q out of alignment, which I wasn't willing to do. I decided to put it next to shift, and while I knew it would take some time to get used to, it's not unreasonable. That's right, I'd rather break my muscle memory on the equals key than on the home/end block. That's how dedicated I am.</p>
<p>This meant moving A/한 above the numpad. The downside is that this is a much farther reach, but the upside is I have plenty of room up there for a 한자 key too, which I wouldn't have included otherwise. Realistically, I could just map Ctrl+A한 to 한자, so if I ever come up with another need for that key that's what I'll do. You know, after I use up all 24 F keys.</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/layout_4.png"/></p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/layout_5.png"/></p>
<p>Although I liked the idea of the 1.25u Ctrl giving the left edge of the board a sort of curvature, I found during prototyping that pressing hotkeys is much easier with a 1.5u Ctrl because I tend to strike the leftmost edge of the Ctrl key, especially now that A and Z are physically closer to the left edge of the board — the hand posture for Ctrl+Z is much tighter on this layout compared to the original.</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/layout_final.png"/></p>
<p>Speaking of hand posture, let's compare the ortholinear layout with the traditional stagger more closely:</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/stagger_translucent.png"/></p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/stagger.gif"/></p>
<p>By far the biggest letter changes are on the Z row, with each key moving 0.5u to the left. You can see how much Ctrl hotkeys have changed now that the 0.75u horizontal gap is completely gone. For the first few weeks of using this keyboard, I was constantly overshooting my copy-pastes.</p>
<p>The Q row feels almost identical, and I'm happy to report that the 1u backslash is not giving me any trouble. The number row is almost a full 1u farther to the right now, which is mostly not a problem since I don't feel like I ever really internalized the old stagger anyway. However, underscore did give me a hard time since it's almost a full 1u to the right from where it used to be, and now neighbors backspace. Equal has definitely taken some getting used to, but I've got the muscle memory for it now.</p>
<p><a class="footnote_text" data-index="1" href="#footnote_link_1" id="footnote_text_1">[1]</a> Pause is used to pause commandline applications, and Ctrl+Break is used to kill commandline applications that aren't terminating on Ctrl+C.</p>
<h2 id="switches_caps">Switches &amp; caps<a class="header_anchor_link" href="#switches_caps"> (§)</a></h2>
<p>The layout has 118 keys, and I knew I wanted a few spares of each size. I went with 140×<a href="https://kbdfans.com/products/switches-70">Gateron Yellow from KBDFans</a> and 129×<a href="https://www.aliexpress.com/item/32850729893.html">blank black PBT caps from NPKC</a>.</p>
<p><a href="/writing/kb_nearer/switches.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/switches.jpg"/></a></p>
<p>For as long as I've been thinking about buying a mechanical keyboard, I've always imagined I would choose Blues for the clicky sound. But, I read various forum threads about clicky vs linear and saw that a lot of clicky users find them to be a nuisance after a while, or felt that actuation pressure should be learned by muscle memory instead of pushing through the click. Some day I'm sure I'll do another keyboard and I'd like to try clickies eventually, but I decided to do linear Yellows this time. Although typing on the linears isn't exactly quiet, you certainly can press keys silently if you need to. The typing experience is perfectly pleasant, and after only a few days of using the Nearer I found my rubber dome keyboard terrible in comparison.</p>
<p>Ordering the caps was kind of weird. The AliExpress page has product variant buttons for "100 pcs", "200 pcs", etc., but the seller has their own pricing scheme outlined in the product description. You're supposed to tell them what keys you need and they'll calculate a price by considering 2u keys to be 2× the price of 1u keys, and so forth, and that's how many "pieces" you need. Well that's not what AliExpress's variant ordering system is designed for, so I'm really not sure how this was supposed to go down. I just chose the variant that was close to, although a little bit less than the value that I calculated, and they accepted the payment without question. So I guess I got a discount. Your results may vary if you need pieces that aren't close to any of the variants.</p>
<p>Another thing I didn't expect is that the homing keys don't have raised bumps on them. Instead, the surface of the key has a deeper indent than the rest. Visually, it's very hard to distinguish, but in practice I'm not having any trouble with them.</p>
<p><a href="/writing/kb_nearer/keycaps.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/keycaps.jpg"/></a></p>
<p>I've got 22 switches left over, either to use as repairs or just to play around with. I also made sure to buy at least two extra of each cap size.</p>
<h2 id="microcontroller">Microcontroller<a class="header_anchor_link" href="#microcontroller"> (§)</a></h2>
<p>For the controller I chose the 24-pin <a href="https://keeb.io/products/elite-c-low-profile-version-usb-c-pro-micro-replacement-atmega32u4">Elite-C V4</a> because I wanted to use USB-C. That's pretty much the only reason.</p>
<p><a href="/writing/kb_nearer/controller_1.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/controller_1.jpg"/></a></p>
<p><a href="/writing/kb_nearer/controller_2.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/controller_2.jpg"/></a></p>
<h2 id="designing_the_switchplate">Designing the switchplate<a class="header_anchor_link" href="#designing_the_switchplate"> (§)</a></h2>
<p>The switchplate is made by taking the output of keyboard-layout-editor and pasting it into <a href="http://builder.swillkb.com">builder.swillkb</a>. I chose an 8mm edge padding, 8mm edge radius, and a couple of 2.1mm holes so I can use 2M screws.</p>
<p>If I were to do this again, I'd give myself a little more padding between the screw holes and the edge of the plate, and I'd add more intermediate screw holes. My switchplate has a very slight bend to it and I don't have any means of making it perfectly flat, so a few extra screws would help me get the plate to sit more flush against the base.</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/switchplate.svg"/></p>
<p>Because this layout would be totally new to me, I knew I needed to be comfortable with the design before having it cut in metal. I bought a foam posterboard, printed the layout on paper, and spent about four hours across a couple of <a href="/writing/download_podcasts">podcast-listening</a> sessions to cut out each switch hole with a craft knife.</p>
<p><a href="/writing/kb_nearer/prototype_01.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/prototype_01.jpg"/></a></p>
<p><a href="/writing/kb_nearer/prototype_02.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/prototype_02.jpg"/></a></p>
<p><a href="/writing/kb_nearer/prototype_03.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/prototype_03.jpg"/></a></p>
<p><a href="/writing/kb_nearer/prototype_04.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/prototype_04.jpg"/></a></p>
<p><a href="/writing/kb_nearer/prototype_05.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/prototype_05.jpg"/></a></p>
<p><a href="/writing/kb_nearer/prototype_06.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/prototype_06.jpg"/></a></p>
<p><a href="/writing/kb_nearer/prototype_07.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/prototype_07.jpg"/></a></p>
<p><a href="/writing/kb_nearer/prototype_08.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/prototype_08.jpg"/></a></p>
<p><a href="/writing/kb_nearer/prototype_09.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/prototype_09.jpg"/></a></p>
<p>I'm sure you're wondering about the gray spacebar. This was in fact the result of spontaneous inspiration, an experience not much different from true enlightenment, which came to me after an intense bout of deeply personal meditation and was fully crystalized when the keycap vendor said "We don't have 6u space in black, only in gray".</p>
<p><a href="/writing/kb_nearer/prototype_10.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/prototype_10.jpg"/></a></p>
<p>This prototype was definitely worth the time, because this is the point where I changed Ctrl from 1.25u to 1.5u. If I hadn't bought extra 1.5u caps, that wouldn't have been possible.</p>
<p>After generating the final switchplate on swillkb, I had it cut through LaserBoost. Swillkb has a partnership with LaserGist, but I found that LaserGist's price <em>before</em> shipping was about $20 higher than LaserBoost's price <em>after</em> shipping. I tried comparing a few other options, but most either don't have instant price quoting or the prices weren't any better than LB.</p>
<p>Switchplates should be 1.5mm thick for Cherry-style switches, which includes the Gaterons.</p>
<h2 id="designing_the_wiring_matrix">Designing the wiring matrix<a class="header_anchor_link" href="#designing_the_wiring_matrix"> (§)</a></h2>
<p>While the plate was still in the mail, I started working on the wiring matrix. This was the first time I had ever put together a piece of electronics and it was a great learning experience.</p>
<p>Each key switch has two posts on the underside. Keyboards are wired with one post connected to a "column" wire and the other connected to a "row" wire. The controller sends signals out via the column wires, one column at a time, and listens to the row wires to see where the signal comes back. In effect, every key has an X, Y coordinate which the firmware then maps to letters / keycodes.</p>
<p>A simple matrix for my keyboard would look like this:</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/wiring_singleplex.svg"/></p>
<p>But, there's a problem. Each of these wires needs to be soldered onto a separate pin of the controller, which means the controller must have at least <code>rows+columns</code> available pins. That means I'd need 27 pins, but the Elite-C only has 24.</p>
<p>The solution is what's called a duplex layout, where two physical columns are wired together as a single virtual column. Here's mine:</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/wiring_duplex.svg"/></p>
<p>The duplex layout halves the number of columns in exchange for doubling the number of rows. That brings me to 10+14=24 exactly. This does mean I have no pins left for Caps Lock or Num Lock LEDs. Instead, Caps Lock is indicated by pushing a button and seeing a capital letter come out.</p>
<p>If you're willing to sacrifice your sanity to achieve maximum keyboarditude, the maximum number of keys you can address is <code>(pins/2)²</code> — a 12×12 matrix with 144 keys in this case. You might have to do some gymnastics with your wires, since the physical layout would be far removed from the virtual layout, but it would be possible. Keep in mind that the controller doesn't know or care about the physical positions of the switches, as long as each one has a unique X, Y coordinate via the row and column wires.</p>
<p>Anyway, here's the wiring diagram as seen from the underside, which is how we'll actually work on it, and in more realistic detail:</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/wiring_bottom.svg"/></p>
<p>And the wires join up to the controller like this:</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/controller.svg"/></p>
<p>You're seeing the final versions of these images, but make no mistake — this took several iterations to get right. In fact, while I was soldering the wires I realized that I had imagined it differently and just changed the design right then. You can optimize your controller pin mapping to reduce the length and overlaps of your wires, but it's not a big deal. Whatever happens, you can adjust the firmware to match whatever you put together.</p>
<p>If you've seen other keyboard builds, you'll know that the wiring matrix requires diodes. I bought <a href="https://www.ebay.com/itm/303201293688">these 1N4148 diodes</a>.</p>
<p><a href="/writing/kb_nearer/diodes.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/diodes.jpg"/></a></p>
<p>I know what diodes do — they allow electricity to only flow in one direction — but it took me a bit of studying to figure out how that applies to keyboards. I put together this drawing to illustrate my findings. In this picture, the black keys are the ones being pressed. Remember that the controller sends a signal out through one column at a time and listens to the rows, so here's C7 being lit up:</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/why_diodes.svg"/></p>
<p>The signal from the column wire is transfered through the switch and diode to the row wire, telling the controller the row coordinate of the pressed keys in the C7 column. The controller sees R11 and R14, so the pressed keys are C7+R11 and C7+R14, 7 and 0.</p>
<p>If your keyboard doesn't have diodes, certain combinations of keypresses can carry the signal to places that trick the controller into believing some other keys are being pressed when they actually aren't. Notice how the signal is flowing through the 9 key in the wrong direction, from a row to a column, which lights up the C9 column. Even though 6's actual coordinate is C9+R12, the controller only knows that it sent a signal on C7 and got a response back on R12, so it thinks C7+R12 is pressed, which is 4.</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/why_diodes_anim.gif"/></p>
<h2 id="building_the_firmware">Building the firmware<a class="header_anchor_link" href="#building_the_firmware"> (§)</a></h2>
<p>The plate was still in the mail at this point, and I felt confident about the wiring design, so I began doing the firmware on <a href="https://kbfirmware.com">kbfirmware.com</a>. Once again, the keyboard community has done all the hard work. All I'm doing is plugging in my information.</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/firmware_1.png"/></p>
<p>Not so fast, kbfirmware. Don't you know we're doing a duplex layout?</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/firmware_2.png"/></p>
<p>Yeah, that's right, that's just how I like my duplex layouts.</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/firmware_3.png"/></p>
<p>As it happens, kbfirmware uses the exact opposite red/blue color scheme that I chose, but you can see how those diagonal jumps represent the long bridges I drew, connecting two physical columns into a single virtual column.</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/firmware_4.png"/></p>
<p>I drew my controller diagram with row and column numbers starting from 1, but on kbfirmware they start from 0. Filling in this table is a good workout for your looking-back-and-forth muscles, often underrepresented in other workout routines.</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/firmware_5.png"/></p>
<p>After downloading the firmware as a .hex file, it is loaded onto the controller using <a href="https://github.com/qmk/qmk_toolbox/releases">QMK Toolbox</a>. It did everything perfectly on the first try. Just turn on auto-flash, and use a paperclip or piece of wire to short RESET to GROUND twice to reset the microcontroller.</p>
<p><img alt="" loading="lazy" src="/writing/kb_nearer/firmware_6.png"/></p>
<p><a href="/writing/kb_nearer/firmware_7.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/firmware_7.jpg"/></a></p>
<p>Then, you can simulate keypresses by shorting a column pin to a row pin. And you can just end the whole project here, really. The rest of the keyboard is basically just decoration. It's functional as is.</p>
<p><a href="/writing/kb_nearer/firmware_8.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/firmware_8.jpg"/></a></p>
<p><a href="/writing/kb_nearer/firmware_9.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/firmware_9.jpg"/></a></p>
<h2 id="arrival_of_the_switchplate">Arrival of the switchplate<a class="header_anchor_link" href="#arrival_of_the_switchplate"> (§)</a></h2>
<p>The switchplate came in the mail:</p>
<p><a href="/writing/kb_nearer/prototype_to_plate.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/prototype_to_plate.jpg"/></a></p>
<p>But something must have been wrong with the laser that day, because the plate had some alignment defects to the tune of 1mm in a couple of places. Normally I'm not one to complain to support, but this was expensive and beyond their stated tolerances. I took some pictures demonstrating the alignment with a ruler and some MS Paint annotations:</p>
<p><a href="/writing/kb_nearer/laserboost_wrong_1.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/laserboost_wrong_1.jpg"/></a></p>
<p><a href="/writing/kb_nearer/laserboost_wrong_2.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/laserboost_wrong_2.jpg"/></a></p>
<p>LaserBoost immediately offered to express-mail a replacement for free. So in the end everything turned out fine.</p>
<p><a href="/writing/kb_nearer/metal_plate.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/metal_plate.jpg"/></a></p>
<p>I wouldn't want to miss this opportunity to show off how I transfered the switches from the first plate to the new plate. The cap- and switch-pullers I ordered in the mail wouldn't arrive for at least another month.</p>
<p><a href="/writing/kb_nearer/puller_1.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/puller_1.jpg"/></a></p>
<p><a href="/writing/kb_nearer/puller_2.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/puller_2.jpg"/></a></p>
<p><a href="/writing/kb_nearer/puller_3.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/puller_3.jpg"/></a></p>
<p>That's right, everyone. When you buy cap- and switch-pullers for $1.00 on ebay, you're giving in to Big Puller's brainwashing. Paperclips and tweezers were all you needed all along.</p>
<h2 id="hot_glue_crimes_against_humanity">Hot glue crimes against humanity<a class="header_anchor_link" href="#hot_glue_crimes_against_humanity"> (§)</a></h2>
<p>When you press the switches into the plate, they make an audible click. The plastic body of the switch is shaped so that it grips the plate from below. But I couldn't shake the feeling that someday I'd be pulling a cap off of a switch and have the whole switch rip out of the plate, bringing a spaghetti dish of wires along with it. As fun as it was to put this together, I really, <strong>really</strong> don't want to have to do any repairs. I decided, for better or worse, to reinforce the switches with a whole bunch of hot glue.</p>
<p><strong>WARNING</strong>: You're supposed to put your stabilizers in the plate before your switches! My stabilizers were in transit for more than a month by this point, so I just went ahead without them. I was able to add them retroactively but it wasn't ideal. See <a href="#Stabilizers">#Stabilizers</a>.</p>
<p>Speaking of firsts, this was my first time working with hot glue. It's interesting stuff. I think if you use it once you'll either instantly hate it for its awful, stringy messiness; or you'll instantly love it for its versatility and speed.</p>
<p>In the following photos, you should be able to identify three distinct stages of how it went:</p>
<ol>
<li>I'm doing terrible at this.</li>
<li>I'm doing great at this!!</li>
<li>I need to do a little less great or I'm going to run out of hot glue.</li>
</ol>
<p><a href="/writing/kb_nearer/hotglue_1.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/hotglue_1.jpg"/></a></p>
<p><a href="/writing/kb_nearer/hotglue_2.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/hotglue_2.jpg"/></a></p>
<p><a href="/writing/kb_nearer/hotglue_3.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/hotglue_3.jpg"/></a></p>
<p><a href="/writing/kb_nearer/hotglue_4.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/hotglue_4.jpg"/></a></p>
<p>I ran out of hot glue. But, this dark period of my life was short-lived. I bought more glue and got back to work making angels cry:</p>
<p><a href="/writing/kb_nearer/hotglue_5.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/hotglue_5.jpg"/></a></p>
<h2 id="wiring">Wiring<a class="header_anchor_link" href="#wiring"> (§)</a></h2>
<p>Finally, with the plate ready and switches set, it was time to begin wiring.</p>
<h3 id="columns">Columns<a class="header_anchor_link" href="#columns"> (§)</a></h3>
<p>I began with the columns. I was hoping I could use a single strand of wire to connect the whole column, stripping off little gaps in the wire near the posts for soldering, but at this time I couldn't figure out a good way to do that. So, the linkage between each switch was done individually. I wound a bit of wire around each post, and in fact did a dry fit of the whole board before soldering anything.</p>
<p>This took a long time.</p>
<p><a href="/writing/kb_nearer/wiring_columns_01.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_columns_01.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_columns_02.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_columns_02.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_columns_03.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_columns_03.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_columns_04.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_columns_04.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_columns_05.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_columns_05.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_columns_06.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_columns_06.jpg"/></a></p>
<p>I linked the duplexed columns, and held them down with tape since these long wires tend not to want to sit still.</p>
<p><a href="/writing/kb_nearer/wiring_columns_07.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_columns_07.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_columns_08.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_columns_08.jpg"/></a></p>
<p>Then I began soldering. This was my first time soldering, and I think I did pretty alright.</p>
<p><a href="/writing/kb_nearer/wiring_columns_09.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_columns_09.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_columns_10.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_columns_10.jpg"/></a></p>
<h3 id="diodes">Diodes<a class="header_anchor_link" href="#diodes"> (§)</a></h3>
<p>Next, I did the diodes. As you can see from the diagram, the diodes are soldered to the other post and reach down to the row wire. The black ring around the diode indicates the front, and should point away from the switch towards the row wire.</p>
<p>I found that using the plate itself as a bending guide for the diode tails was perfect for helping me wrap them around the posts.</p>
<p><a href="/writing/kb_nearer/wiring_diodes_1.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_diodes_1.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_diodes_2.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_diodes_2.jpg"/></a></p>
<p>Unlike the column wires, I didn't dry-fit the whole board, because the other tail of each diode reaches down to the next one. So, I did dry fits and solders for each row, bottom to top.</p>
<p>This took a long time.</p>
<p><a href="/writing/kb_nearer/wiring_diodes_3.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_diodes_3.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_diodes_4.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_diodes_4.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_diodes_5.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_diodes_5.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_diodes_6.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_diodes_6.jpg"/></a></p>
<h3 id="rows">Rows<a class="header_anchor_link" href="#rows"> (§)</a></h3>
<p>Next up was the rows. Remember how I wanted to strip the middles of the wires when I was doing the columns? Well now I was extra motivated to find a solution, because doing individual wires for the rows would mean three-way joins between each row segment and the accompanying diode, and I didn't want to deal with that.</p>
<p>I found that I could use the soldering iron to melt away the insulation from the wire. This was very effective, but in retrospect was a BAD IDEA because it made the tip very dirty and difficult to solder with afterwards. More crimes against humanity. Sorry. I was able to clean the tip by repeatedly burning solder onto it and wiping it off, which burned away the rubber residue.</p>
<p>This took a long time.</p>
<p><a href="/writing/kb_nearer/wiring_rows_01.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_rows_01.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_rows_02.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_rows_02.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_rows_03.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_rows_03.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_rows_04.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_rows_04.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_rows_05.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_rows_05.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_rows_06.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_rows_06.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_rows_07.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_rows_07.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_rows_08.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_rows_08.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_rows_09.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_rows_09.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_rows_10.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_rows_10.jpg"/></a></p>
<p>The downside of the duplex layout is that R1-R7 need to reach <em>allll</em> the way over to the controller, so I tried to route the wires between the keys and keep it looking nice.</p>
<p><a href="/writing/kb_nearer/wiring_rows_11.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_rows_11.jpg"/></a></p>
<p>The underlying ocean of hot glue proved its worth by helping me seat some discarded pieces of diode tails, which I used as guides to stop the wires from flying around all over the place. Seriously, it's impossible to totally straighten a wire like this, so they always fling themselves to one side at every chance they get.</p>
<p><a href="/writing/kb_nearer/wiring_rows_12.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_rows_12.jpg"/></a></p>
<h3 id="controller">Controller<a class="header_anchor_link" href="#controller"> (§)</a></h3>
<p>I hope you're ready for more hot glue crime because I've got more hot glue crime.</p>
<p>I didn't want to glue the controller directly to the plate for two reasons. First, if for any reason I ever need to remove the controller, I don't want to be prying it off the metal and breaking anything. And second, I want the plug to be approximately centered along the backside of the keyboard base — not pressed directly up against the top. So, I did a little bit of manual 3D printing with everyone's favorite polymer.</p>
<p><a href="/writing/kb_nearer/wiring_controller_01.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_controller_01.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_controller_02.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_controller_02.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_controller_03.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_controller_03.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_controller_04.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_controller_04.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_controller_05.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_controller_05.jpg"/></a></p>
<p>And finally, I could make the last solder joins, from all the rows and columns to the controller.</p>
<p><a href="/writing/kb_nearer/wiring_controller_06.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_controller_06.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_controller_07.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_controller_07.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_controller_08.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_controller_08.jpg"/></a></p>
<p>I had been trying to keep the wires nice and pretty up to this point, but some of these final linkages just required inconvenient wire paths. R7 had to get over and across the controller, and C1-C6 had to come down at an angle. Oh well.</p>
<p><a href="/writing/kb_nearer/wiring_controller_09.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_controller_09.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_controller_10.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_controller_10.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_controller_11.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_controller_11.jpg"/></a></p>
<p><a href="/writing/kb_nearer/wiring_controller_12.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/wiring_controller_12.jpg"/></a></p>
<p>It works! I made some firmware changes to accommodate the change I made during wiring, and also fixed some keycodes that I had chosen incorrectly (the <code>`/~</code> key should be KC_GRAVE, because KC_TILDE always types <code>~</code> even without shift, etc.)</p>
<h2 id="the_base">The base<a class="header_anchor_link" href="#the_base"> (§)</a></h2>
<p>I wanted to make the base out of a dark piece of wood, or at least wood stained dark. My grandfather has a workshop, and in fact he's the one who built my desk, so I went over to his house and we put something together.</p>
<p><a href="/writing/kb_nearer/base_01.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/base_01.jpg"/></a></p>
<p><a href="/writing/kb_nearer/base_02.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/base_02.jpg"/></a></p>
<p><a href="/writing/kb_nearer/base_03.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/base_03.jpg"/></a></p>
<p>On my own time, I brought the height of the base down, drilled the screw holes, and added a hardware reset button to facilitate easier experimentation with the firmware. The plug and reset button holes required a couple rounds of adjustment, and as a result don't look very good, but I'll consider it a learning experience. The piece of wood which goes over the plug hole is dangerously thin as it is, so I can't experiment with the shape any more. There's nothing stopping me from unscrewing the plate and making a whole new base if I choose to. Except for the fact that this one was made with my grandfather and will someday be a family heirloom.</p>
<p><a href="/writing/kb_nearer/base_04.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/base_04.jpg"/></a></p>
<p><a href="/writing/kb_nearer/base_05.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/base_05.jpg"/></a></p>
<p><a href="/writing/kb_nearer/base_06.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/base_06.jpg"/></a></p>
<p>Then I did the stain and other finishing touches, and screwed the plate down.</p>
<p><a href="/writing/kb_nearer/base_07.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/base_07.jpg"/></a></p>
<p><a href="/writing/kb_nearer/base_08.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/base_08.jpg"/></a></p>
<p><a href="/writing/kb_nearer/base_09.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/base_09.jpg"/></a></p>
<p><a href="/writing/kb_nearer/base_10.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/base_10.jpg"/></a></p>
<h2 id="stabilizers">Stabilizers<a class="header_anchor_link" href="#stabilizers"> (§)</a></h2>
<p>This section shouldn't be last, but it is.</p>
<p>My keyboard uses a 6u space, which is uncommon. The standard size is 6.25, which of course would not fit in the ortholinear design. There are fewer vendors selling 6u space stabilizers, and they are all in China / Taiwan. I found a set on ebay, ordered them, and waited. And waited. And waited. UPS had lost them, and they simply never arrived.</p>
<p>After a month of waiting, that's when I put the rest of the keyboard together and figured I'd put the stabs in if they ever arrived. My family asked me "did you get a refund from the company?", and I just said "it's not really a company, it's just some dude in Taiwan, and it was UPS's fault...". I felt bad losing the money, but would also have felt bad taking the money back in case UPS eventually found it and sent it over. I should have been less timid, but oh well.</p>
<p>For six months, I used the Nearer with a 1.5u key as my spacebar and no stabs under Shift, Enter, etc. It worked perfectly fine, and I adapted very well to a 1.5u space, but it was embarrassing to look at and I knew I couldn't publish this article without proper stabs. So I ordered <a href="https://www.ebay.com/itm/313372624687">another set</a> on ebay and they arrived about two weeks later.</p>
<p>With a 6.25u space.</p>
<p><a href="/writing/kb_nearer/stab_wrong.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/stab_wrong.jpg"/></a></p>
<p>I argued with the vendor over the course of nine!! emails that a 6u stab should be 95mm instead of 100mm, and he eventually sent a replacement.</p>
<p><a href="/writing/kb_nearer/stab_right.jpg"><img alt="" loading="lazy" src="/writing/kb_nearer/thumbs/stab_right.jpg"/></a></p>
<p>On my previous, rubber dome keyboard, the stabilizer bars were fully accessible after simply removing the keycaps, so it didn't occur to me that Cherry stabilizers actually go underneath the plate, and are supposed to be installed before the switches are in place. But, I was able to add them retroactively, which I described in a video. This required cutting away some of my beautiful hot glue with a craft knife to make way for the bar.</p>
<p>
<center>
<iframe allow="encrypted-media" allowfullscreen="" frameborder="0" height="400" src="https://www.youtube.com/embed/nBLXsKbxWAo" width="711"></iframe>
</center>
</p>
<h2 id="conclusion">Conclusion<a class="header_anchor_link" href="#conclusion"> (§)</a></h2>
<h3 id="price_breakdown">Price breakdown<a class="header_anchor_link" href="#price_breakdown"> (§)</a></h3>
<p>If I had known these numbers before starting, I probably would have put the project off yet longer. But my technique of getting started before planning everything so I couldn't back down worked great.</p>
<p>Prices are expressed as <code>$item+fees</code> in USD, since shipping / tax will be different everywhere.</p>
<table>
<thead><tr>
<th style="text-align:left">item</th>
<th style="text-align:right">price</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><a href="https://kbdfans.com/products/switches-70">140×Gateron Yellow</a></td>
<td style="text-align:right">$29+18</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://www.aliexpress.com/item/32850729893.html">129×keycaps</a></td>
<td style="text-align:right">$40+9</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://www.ebay.com/itm/303201293688">150×1N4148 diodes</a></td>
<td style="text-align:right">$12+1</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://www.laserboost.com/">Switchplate</a></td>
<td style="text-align:right">$60+20</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://www.ebay.com/itm/313372624687">6u + 7×2u Stabilizers</a></td>
<td style="text-align:right">$16+4</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://keeb.io/products/elite-c-low-profile-version-usb-c-pro-micro-replacement-atmega32u4">Elite-C controller</a></td>
<td style="text-align:right">$18+5</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://www.monoprice.com/product?c_id=301&amp;cp_id=30107&amp;cs_id=3010701&amp;p_id=27930&amp;seq=1&amp;format=2">USB-A to -C cable</a></td>
<td style="text-align:right">$6</td>
</tr>
<tr>
<td style="text-align:left">Odds and ends (hot glue)</td>
<td style="text-align:right">a bit</td>
</tr>
</tbody>
</table>
<p>Coming in at around or just under $250.</p>
<p>And it would be wrong of me to ignore the benefit of materials I already had or borrowed from my family: Soldering iron, wire, hot glue gun, wood &amp; woodworking tools, wood stain, sandpaper.</p>
<p>My mom kept asking me "are you going to make and sell these?", but with $250 material cost and at least 24 hours of labor, I don't think I'd find many takers.</p>
<h3 id="what_id_do_differently">What I'd do differently<a class="header_anchor_link" href="#what_id_do_differently"> (§)</a></h3>
<ul>
<li>Bring screw holes farther from the edge of the plate.</li>
<li>Add more screw holes to deal with non-flat plate.</li>
<li>Improve accuracy of base shape to fit more flush with the edges of the plate.</li>
<li>Improve accuracy of drilled screw holes in the base, as some of the screws are not totally plumb.</li>
<li>Improve shape of USB and reset button holes.</li>
<li>Use something other than hot glue. I do want to protect against switches coming out of the plate, but hot glue actually doesn't adhere that well to the metal. My firmware reset button has come loose, and I taped a piece of felt to the inside of the case to give it a friction fit so I can still push it securely.</li>
</ul>
<p>Overall, I am satisfied. Typing on the Nearer feels cool, and I'm glad to have a unique piece of equipment that I put together myself.</p>
<p>Thank you for reading.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/kb_nearer/kb_nearer.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/3475cb0abf63172e6392487ffaf41755f71a18e3"><time datetime="2023-09-18T21:01:09-07:00">2023-09-18</time> Replace github links with git.voussoir.net.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/3fbf053cd70d073d7660243e16e7572b7a2b87c3"><time datetime="2022-04-12T21:52:42-07:00">2022-04-12</time> Replace demo video with a new 4k60 version.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/48a82e34ef672c81ba423dc657c2b99e2b8b4972"><time datetime="2022-03-26T11:02:31-07:00">2022-03-26</time> Fix typo "spantaneous", improve diode explanation.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/9bd35010ddaa118d8f24383742655bfc7ebd7524"><time datetime="2021-11-07T19:37:35-08:00">2021-11-07</time> Remove excessive and repetitive glamour shots.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/2dca1f73291d134cfe51b107cb4aa3af3f0e78fb"><time datetime="2021-10-22T00:16:30-07:00">2021-10-22</time> Add tag electronics.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/807f87a29cd2d034aca36e28c0b8effadfd86774"><time datetime="2021-06-13T23:24:01-07:00">2021-06-13</time> Replace youtube links with embeds.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/2aa9b67000d5b1353aeed7f9a40813a6481f332f"><time datetime="2021-05-29T11:44:23-07:00">2021-05-29</time> Fix typo "over to the controller".</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/7ed9280032617b4be9b2f8d4cf9ec05c22ed2b52"><time datetime="2021-05-28T17:11:19-07:00">2021-05-28</time> Add kb_nearer.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: fc809226b3f6a3399be70575fcd6a7d027e38dc1/ipfs_misconceptions
title: IPFS misconceptions
url: https://voussoir.net/writing/ipfs_misconceptions
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>IPFS misconceptions</h1><ol id="table_of_contents">Table of contents<li><a href="#introduction">Introduction</a></li><li><a href="#ipfs_is_not_a_place_you_upload_to_its_a_network_youre_a_part_of">IPFS is not a place you upload to, it's a network you're a part of</a></li><li><a href="#ipfs_does_not_force_others_to_host_your_files">IPFS does not force others to host your files</a></li><li><a href="#ipfs_is_not_anonymous_or_dark_web">IPFS is not anonymous or "dark web"</a></li><li><a href="#ipfss_copywriting_is_bad">IPFS's copywriting is bad</a></li></ol>
<h2 id="introduction">Introduction<a class="header_anchor_link" href="#introduction"> (§)</a></h2>
<p>I am interested in <a href="https://ipfs.io/">IPFS</a>. I don't run a node, but I look forward to seeing the technology grow. I like peer-to-peer networks and hope they make a strong resurgence.</p>
<p>However, IPFS has marketing problems. I am subscribed to <a href="https://old.reddit.com/r/ipfs">/r/ipfs</a> which is inundated daily with posts by people who have clearly gotten the wrong idea about what IPFS is and isn't, and the IPFS homepage hasn't exactly stepped up to clarify the misunderstandings.</p>
<h2 id="ipfs_is_not_a_place_you_upload_to_its_a_network_youre_a_part_of">IPFS is not a place you upload to, it's a network you're a part of<a class="header_anchor_link" href="#ipfs_is_not_a_place_you_upload_to_its_a_network_youre_a_part_of"> (§)</a></h2>
<p>All of the quotes in this article are real posts from <a href="https://old.reddit.com/r/ipfs">/r/ipfs</a> or other forums:</p>
<blockquote><p>Won't there be hard drive capacity isssues if everyone used IPFS?</p>
<p>The way I understand it is everyone who opts in to be an IPFS server will download all the content on the web that I browse to, and host it.</p>
</blockquote>
<blockquote><p>Would it be a good idea to make an ipfs mobile app</p>
<p>They have made a web browser plug-in but I'm wondering if it would be a good idea to somehow make an app for your mobile device that works with ipfs maybe something you could use to sync your contacts but then again to run into the same problem you would need somebody to run the gateway node for you I mean I have 64 gigabytes of storage on my phone but I don't think it is enough to run and ipfs Gateway on there lol I had a computer with a 2 terabyte hard drive and it managed to fill that thing up in less than a week I Can Only Imagine how fast it could fill up 64GB</p>
</blockquote>
<blockquote><p>Any way to get an mp4 to loop infinitely when uploading to IPFS?</p>
</blockquote>
<blockquote><p>After uploading content on the IPFS network and having its relative CID address available, that content and address will never be more removable or editable, correct?</p>
</blockquote>
<blockquote><p>IPFS Soundcloud. How would one upload an audio file to IPFS through the browser?</p>
<p>I am new to IPFS and javascript programming in general. I am trying to build the barebones beginnings of a "Soundcloud" clone that can live and stream entirely from IPFS.</p>
<p>I was able to get the streaming working but even after reading documentation, I'm having trouble figuring out how to implement uploading. I know there's a method to ipfs-add a file.</p>
</blockquote>
<blockquote><p>I thought when you upload something on IPFS it is stored across all nodes on the network. What makes it different from centralized services? How to know who are using IPFS that is global and won't get down?</p>
</blockquote>
<blockquote><p>Is it a good idea to store avatars for my project on IPFS?</p>
<p>I want to use the least amount of money for my project as a challenge so I was wondering if it was possible and is a good idea to store avatars (around 2-8mb) on IPFS and use an API to access them later.</p>
</blockquote>
<blockquote><p>How does ipfs avoid spam and bad actors?</p>
<p>What if I would try to upload several petabytes of data, what would prevent me doing that to overload the current network?</p>
</blockquote>
<blockquote><p>I heard that any node will host also a bit of other random ones, what can have illegal things. Am I totally safe for using IPFS?</p>
</blockquote>
<blockquote><p>Hey guys I decided to spin up own IPFS node.</p>
<p>Works perfect in docker 24/7.</p>
<p>Some questions:</p>
<p>How permanent are IPFS uploads?</p>
</blockquote>
<p>The number one problem with IPFS's public perception is that a huge, huge number of people think that IPFS is a place you just "upload" to, and it'll hold your files forever. People see the word "decentralized" or "distributed" and assume that IPFS distributes your files for you, for free, everywhere.</p>
<p>IPFS is a peer-to-peer system, comparable to <a href="https://en.wikipedia.org/wiki/BitTorrent">bittorrent</a>. You are a peer, and you host files so that other peers can download them from you. When you use the "import file" button in the IPFS client GUI, or the <code>ipfs add</code> command on the CLI, you are simply telling the rest of the world that you have a file you'd like to share. It doesn't actually get uploaded anywhere until another person asks you for it. That's because IPFS is not a place you upload to, it's a network you're a part of.</p>
<p>Most end users are not accustomed to being an equal, active participant in the great glowing mass we call the internet. We feel that 'the internet' is this big thing that is separate from ourselves, managed by far away entities with billions of dollars. We are accustomed to interactions between service providers: Google, Apple, Facebook; and service users: us. We upload photos to Facebook and then leave. We upload videos to YouTube and then leave. The internet just runs 24/7 and I don't have to do anything about it.</p>
<p>Proportionally, the number of people who have ever hosted a web server or game server for their friends, or transferred files between two devices in their home via LAN IP is dwindling all the time. Instead we rely on web hosting companies or "official" game servers and we forget that this power was ever within our grasp. Recently I explained to someone that a modem connects your house to the internet and your router connects your devices to each other — and they asked me why you'd want to do that. The word "internet" means "between networks", and necessarily postdates the smaller institutional- and home-level networks we started with.</p>
<p>You can be a part of the World Wide Web even if you don't own a domain name: just run an http server program, open your ports, and give your friends your IP. You're live. Welcome to the internet. It's made by people, and you're a people too. You can even run a website <a href="/writing/ipfs_misconceptions/phone_server.png">off of a cell phone</a>, except that Google and Apple are making this harder all the time in order to groom your Stockholm syndrome.</p>
<p>To be a part of IPFS, you need to download and run the client software, either on your home PC or on a rented server, and allow other people to connect to you. Then you need to <em>leave it running</em>, because if you turn it off then of course nobody can get your files. What did you expect.</p>
<p>The selling point of IPFS — the nature of its decentralization — is that anybody who downloads your files can seed them to anyone else using the exact same link. The <code>ipfs://</code> links contain the hash of the file rather than the address of your computer specifically.</p>
<p>This is the difference between IPFS and the regular HTTP web: if a video gets deleted from youtube.com, it's <em>possible</em> someone else in the world made a copy, but how are you going to find that person? If you get lucky, someone will generously reupload it, but the link will be different and hard to find. And if that link gets deleted, you need to find another one. Over and over again. With IPFS, the original link works as long as a single person in the solar system is willing to keep it alive.</p>
<p>There are companies or entities known as <a href="https://docs.ipfs.io/how-to/work-with-pinning-services/">pinning services</a>, who will host your files on IPFS for you if you pay them. However, even this is not "uploading to IPFS" any more than uploading a file to Amazon S3 is "uploading to The Internet". The agreement to host the file in exchange for money is between you and the service provider. IPFS the protocol and the IPFS community at large aren't responsible if that host goes out of business and stops hosting your file.</p>
<h2 id="ipfs_does_not_force_others_to_host_your_files">IPFS does not force others to host your files<a class="header_anchor_link" href="#ipfs_does_not_force_others_to_host_your_files"> (§)</a></h2>
<blockquote><p>Who pays for the storage on IPFS?</p>
<p>I keep coming back to the same question, who pays for the storage space. Like I can create a local node and upload my draft-version2-history report but why on earth would that be getting replicated across the network. It's great for me because now I can globally access it, but who would want to store that file solely for me who didn't pay anything for that replication?</p>
</blockquote>
<blockquote><p>What stops ipfs from becoming a tragedy of the commons?</p>
<p>I look at my own hard drive and half the contents - perhaps most - is ephemeral, intermediate, or junk. Sometimes I'm forced to sift through Everest-sized piles of digital rubbish to reclaim disk space, though in the process I inevitably lose some of the baby along with the bathwater.</p>
<p>Now imagine all that cruft on a planetary scale, petabytes of obsolete memes, shopping lists, programs in the process of being developed, temporary files — and billions of idiots who pin them all someplace else as a free cloud backup.</p>
<p>If I run a node on my home server, how many terabytes do I reserve to replicate an infinitely expanding pin list, assuming I only have to host the content I offer or have previously downloaded?</p>
<blockquote><p>What makes you think you can just "pin them all some place else as a free cloud backup"? Most pinning services charge you per GB*month (or equivalent) for the things you pin. If you stop paying, they stop pinning it.</p>
<blockquote><p>I just want to be sure I understand the objective — is it fundamentally a gimmick to part rubes from their crypto, or a genuine innovation in distributed storage?</p>
<blockquote><p>ipfs has nothing to do with bitcoin. Its just an alternative to http. its a way to share data that is not inherently centralized.</p>
<blockquote><p>I expect most or all cluster providers will require or at least allow payment by means of their preferred wankcoin, don't you?</p>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<blockquote><p>What's the difference between storing files on AWS cloud and IPFS?</p>
<p>From this subreddit, I learned that IPFS does not store your files permanently even if I pinned them. If so, why should I store on it? So that my files can't be hacked? So that in case Amazon goes bankrupt I still have my files? But if I use a pinned service like Pinata.cloud, they might go bust too.</p>
</blockquote>
<blockquote><p>If I host my own node, how to ensure that the file I uploaded goes into my node?</p>
<p>I learned that files are not forever on ipfs and the best way to make them permanent is by hosting my own node. So, if I do host one, do I just redirect my files into my node or will ALL nodes have ALL files from around the world from everyone?</p>
<p>Cos otherwise, if all my files are only in my node then what's the point of decentralization.</p>
</blockquote>
<blockquote><p>What's the point of IPFS? Why wouldn't I just host the files myself?</p>
<p>From what I understand, IPFS isn't private, your IP is public, and nodes only host the files they want to host.</p>
<p>Since most people only care about their own stuff, most files will be hosted from a single machine with a public IP.</p>
<p>Why wouldn't I just host the files from a single machine with a public IP?</p>
<p>What is IPFS actually providing?</p>
<blockquote><p>I am grappling with a similar question, how can we incentivize fellow nodes to pin our data? Is there any quid pro quo proposal or protocol in place?</p>
</blockquote>
</blockquote>
<blockquote><p>Okay so if no one pinned anything and just hosted what they host then it would be just like the internet without IPFS. So what incentivises people to pin?</p>
<blockquote><p>Incentive seems to be one of the fundamentally unsolved problems for decentralized storage. Not only does hosting content need to be profitable, but there needs to be systems in place that make sure that users aren't just hosting the same popular content that gets the most traffic and dumping less popular content because it isn't generating the same amount of revenue.</p>
</blockquote>
</blockquote>
<p>This misconception often stems from the first, that IPFS is a giant magical hard drive in the sky where other people will hold on to your stuff for you forever, so naturally there must be some big incentive for them to do that. "What's in it for me?" is the only language we understand. That was the idea behind <a href="https://filecoin.io/">Filecoin</a> — it gives members a financial incentive to share their storage space with the network. As it happens, Filecoin operates on a <a href="https://github.com/filecoin-project/specs/issues/1191#issuecomment-704065968">completely separate peer network</a>, unreachable by the regular IPFS client, since they need to keep their accounts payable in order. Yet, people conflate Filecoin with IPFS itself, and assume that all IPFS involves the use of Filecoin or other payment, because they can't fathom what sort of incentives exist besides financial ones.</p>
<p>There is no "push" mechanism in IPFS. There is no forcing people to take a copy of your stuff if they didn't specifically ask for it. The IPFS homepage says "each network node stores only content it is interested in".</p>
<p>That's right, idiots. Nobody's going to help you replicate your history book report for the same reason that they won't let you put your lawnmower in their garage after your garage gets full. They're not interested. This shouldn't be surprising.</p>
<p>This is related to the previous idea, that people are only familiar with online services backed by faceless corporations. It's difficult to imagine that the system is made of actual people and you have to make it worth their while to download what you're sharing. That's the magical effect of money, of course: people <strong>will</strong> suddenly become interested in your homework assignments and lawnmowers if you pay them to be. But in the absence of the financial incentive, you are left with the fact that nobody else is interested in your random junk files.</p>
<p>For many of these people, the line of reasoning stops there. If the network won't host my stuff for me for free, it's pointless. Ok, bye. Meanwhile, the people who generate valuable data that is interesting and desirable to others will see their files propagate. If NASA started advertising CIDs for original moon landing footage, there would be plenty of volunteers replicating it.</p>
<p>Many of these comments assume that all other IPFS nodes are strangers, but why? IPFS can very well be deployed in an organization where no one is a stranger to each other, and they don't need financial incentives to host each others' files. A website operator could serve their javascript or image assets over IPFS, and put lots of IPFS nodes around the world so that visitors can connect to the nearest one. If random strangers want to pin the assets, they can do that too, but the website owner would always know that keeping their files alive is their responsibility. They would never <em>rely</em> on strangers' pins when the functionality of their website is at stake.</p>
<p>Here is another example: imagine that a team of researchers in Antarctica (or on Mars) are accessing a website over IPFS. The first researcher will have to download the page and its assets over a slow satellite connection that leads back to the original node, but then they can seed the files to the other researchers over a faster local network. These peers are incentivized to help each other because it leads to a better experience for the whole group, not because they're getting paid.</p>
<p>The point of IPFS is not "strangers keep my stuff", it's "people sharing files" for whatever reasons they need. You just have to look past your own nose.</p>
<h2 id="ipfs_is_not_anonymous_or_dark_web">IPFS is not anonymous or "dark web"<a class="header_anchor_link" href="#ipfs_is_not_anonymous_or_dark_web"> (§)</a></h2>
<blockquote><p>Why do we need decentralised/censorship resistant communication platforms when they already exist on darknet?</p>
<p>they probably aren't decentralised but they do the job</p>
</blockquote>
<blockquote><p>Can my uploaded IPFS files be traced to get my IP address?</p>
<p>I'd like to use IPFS to share my files with others on Discord, however I'm concerned someone might grab my IP. Is this possible, and if it is, how do I protect myself from being attacked?</p>
</blockquote>
<blockquote><p>I love the idea of decentralized file storage, but how would IPFS prevent something like the distribution of child porn or hate speech?</p>
</blockquote>
<blockquote><p>What is stopping someone from creating a child porn IPFS website?</p>
</blockquote>
<blockquote><p>What are the ways in which ipfs prevents piracy?</p>
<p>I was thinking that all the successful decentralized networks today are highly utilised for piracy which harms the reputation of the technology. So what are the ways in which ipfs prevents that and what are the disadvantages of those implementations?</p>
</blockquote>
<blockquote><p>What Prevents IPFS from becoming the next uTorrent?</p>
<p>I believe this a problem that IPFS will face as in any peer to peer network, piracy is a big issue.</p>
<p>I propose that we make a "hash blacklist" which will have a list of hashes which are illegal. Though we would have to build a proper system around it and make sure that not any or every hash is added to it, kinda like a dmca takedown.</p>
</blockquote>
<blockquote><p>I want to join the IPFS, but I'm concerned about ending up with illegal content on my computer somehow. I tried to find information about this on the web but haven't been successful, so I thought I'd ask here.</p>
<p>I don't want illegal movies, music, etc., but I'm especially concerned about illegal sexual content like child porn. Having even traces of that stuff on your system could be disastrous. So, if I get involved in the decentralized web, and particularly with IPFS, how do I protect myself from illegal content?</p>
</blockquote>
<blockquote><p>What stops people from distributing illegal copies of different types of media?</p>
<p>(1) If I were a bad person and started uploading pirated copies of movies or games, what stops someone from doing this?</p>
<p>(2) If I have the legal rights to a movie and I found an illegal copy on IPFS for free. How could I prevent this from spreading; or stopping this illegal activity from happening? I guess this wouldn't be possible as the whole point is to spread data around so people can download it even if the original uploader is offline.</p>
</blockquote>
<p>You can find lots of posts from people who are worried about illegal or unsavory things happening through IPFS, and much of the messaging surrounding IPFS does describe it as "unstoppable" or "censorship-resistant" or "can't be taken down". There are a couple of angles we can get at here depending on your concern.</p>
<p>Some of these people believe that IPFS is a place you upload to, or that all nodes assist with the hosting of all files, which leads them to believe that by running an IPFS node they will wind up with illegal files on their computer. There is precedence for p2p networks where all peers help host all files, like <a href="https://en.wikipedia.org/wiki/GNUnet">GNUnet</a> and <a href="https://en.wikipedia.org/wiki/Freenet">Freenet</a>, but this is not the case with IPFS. You only host what you visit and pin.</p>
<p>On the other hand, some people might just feel generally uneasy knowing that child molesters can use new tools like IPFS to share their material, and they wish the system had some kind of innate block against that. But how do you expect the IPFS software to know whether a file is being blocked for a "good" reason, like preventing the spread of child pornography, versus a "bad" reason, like preventing the spread of Tiananmen Square photos? Both of these situations are basically the same: it's material that people are not allowed to look at. It just depends who's doing the allowing and disallowing in your jurisdiction. Should there be a human-curated ban list built into the default client? Curated by people from which country? The client is open source anyway, so criminals could compile the program without the blocklist. It just doesn't work. Using technical solutions to address social problems rarely does.</p>
<p>You'll also notice that knives do not have special handles that prevent you from committing murder, beer bottles do not prevent you from driving drunk, cash does not prevent you from buying drugs, pens do not prevent you from forging signatures. The tool is agnostic and the crime is up to you.</p>
<p>What stops people from distributing illegal files over IPFS? Nothing. IPFS is just a protocol. It is a language that two computers speak when they talk to each other. There is no sequence of words in the English language that will instantly alert the police when I say them, no matter how bad the words are. Likewise, there is no kind of file that will cause IPFS to alert the police.</p>
<p>However, (here comes the point of this section), IPFS is not anonymous. When you run an IPFS node and people connect to you, they're connecting to your public IP address assigned to you by your internet service provider. If the police catch wind of any CIDs for illegal files, they'll just check out which IP addresses are sharing those files and try to pin down the owners of the IP addresses.</p>
<p>People have begun to conflate decentralization with anonymity, which is not correct. As I described earlier, companies decentralize their CDN servers because it improves regional latency, but they are certainly not anonymous. Networks that aim for anonymity like <a href="https://en.wikipedia.org/wiki/Tor_(network)">Tor</a> or <a href="https://en.wikipedia.org/wiki/I2P">I2P</a> do so by routing your connection through several intermediate nodes so that the sender and receiver never talk directly to each other.</p>
<p>If a journalist in China tries to publicize the Tiananmen Square incident, the Chinese government might discover it and try to shut that person down. But, because a single <code>ipfs://</code> link can work anywhere in the world, that journalist only needs a single friend outside of the country to also pin the file and make it available globally, then the journalist can turn off their node. Other countries like USA will not prosecute a person for hosting the photos. (Realistically, the journalist should transfer the file to their friend through a separate, encrypted channel, not IPFS, in the first place.)</p>
<p>As with other technologies, like bittorrent or even just http, you could gain anonymity by running the program on a far away server which you rent or by diligently routing your PC traffic through a VPN. In both of those cases, you still need to make sure that the server owner or VPN service won't hand you over to the police and that your payment method doesn't lead back to your real name. The person who wants to download illegal files should prepare for the possibility of connecting to a honeypot source, and they probably should remove the file from their IPFS node afterward so it doesn't seed back to anyone else. This is already standard procedure.</p>
<p>From what I've seen so far, the censorship-resistance claims of IPFS are predicated on the idea that you're first able to get your files out of the jurisdiction that wants to censor them and into a jurisdiction where they're permitted. IPFS does not provide any secrecy, and if the whole world is after you, IPFS isn't a magic shield. The fact of the matter is that the regular HTTP web already carries hate speech, copyrighted files, and illegal material, but new protocols are subjected to higher scrutiny and criticism than the incumbents as a matter of course.</p>
<p>Now, one of those comments I quoted made a great point, which is that the reputation of the technology as a whole can be ruined if it's known for piracy or criminal material. Bittorrent is known for little other than piracy — when people give a demonstration of how to use a bittorrent client, they always show how to download a Linux release or Big Buck Bunny, because that's the only thing they can think of that isn't a copyright violation. Many people think that torrents are inherently illegal. So far, IPFS hasn't become a popular piracy tool to my knowledge, and all of their messaging centers around webpages.</p>
<h2 id="ipfss_copywriting_is_bad">IPFS's copywriting is bad<a class="header_anchor_link" href="#ipfss_copywriting_is_bad"> (§)</a></h2>
<p>Am I doing a good job so far? Let's compare what I've written with what appears on the IPFS homepage to see how poorly they communicate their project to newcomers. All of the statements they make are technically correct, but they only make sense if you already know how IPFS works. If you don't, it's problematic.</p>
<p><strong>Note</strong>: since this article was originally published, some phrasing on their homepage has changed. <a href="/writing/ipfs_misconceptions/ipfs_homepage_20210613.html">This</a> is the revision against which I wrote these criticisms. I will keep this article as-is until I take the time to review the new claims.</p>
<blockquote><p><strong>Today's web can't preserve humanity's history</strong></p>
<p>The average lifespan of a web page is 100 days before it's gone forever. It's not good enough for the primary medium of our era to be this fragile. IPFS keeps every version of your files and makes it simple to set up resilient networks for mirroring data.</p>
</blockquote>
<p>To the layperson, this implies that 'the network' stores your files forever once you put them in. It does absolutely nothing to address the mindset that most internet users have, which is that service providers and service users are clearly delineated.</p>
<p>Have you heard the phrase "guns don't kill people, people kill people"? Well, the network doesn't store anything, it's the people that store things, and IPFS is the network by which you can reach them. But people can get bored of holding on to a particular file and delete it to make space for something else.</p>
<p>Are you still holding on to copies of all the webpages you read 100 days ago? No? Why not? Don't you want to contribute to the permanence of all those pages? I clutch my pearls in your general direction. See, it's easy to sit around fawning over IPFS for being 'the permanent web' until you realize that permanence isn't actually a guarantee of the protocol. Permanence is a <em>possibility</em>, only to be realized by the collective choice of individuals to host the material they believe is important. And unless you're doing your part to preserve and host the files you think are important, you don't have much ground to stand on when you find that other people aren't keeping the stuff you want either.</p>
<blockquote><p><strong>Archivists</strong></p>
<p>IPFS provides deduplication, high performance, and clustered persistence — empowering you to store the world's information for future generations.</p>
</blockquote>
<p>Similar to the previous one, the word "provides" here gives the wrong impression to people who approach this page with the mindset that IPFS is a web storage service like DropBox. I'm not saying that's the only possible interpretation, but it's a very common one and IPFS should write more clearly to disambiguate.</p>
<p>"IPFS provides me with high performance storage? Sure, I'll take it! What? No, I don't want to actually <em>run</em> anything..."</p>
<p>I will give them credit for "empowering you to store", giving agency to the reader. Just make sure you use the power once you've got it.</p>
<blockquote><p><strong>Blockchains</strong></p>
<p>With IPFS, you can address large amounts of data and put immutable, permanent links in transactions — timestamping and securing content without having to put the data itself on-chain.</p>
</blockquote>
<p>This doesn't mention the fact that the link is only good as long as someone keeps the file. When everyone assumes "oh, the network's got it, I can delete mine", you'll suddenly find there's no copies left. By omission, this implies that IPFS just holds things forever.</p>
<blockquote><p><strong>Here's how IPFS works</strong></p>
<p>Take a look at what happens when you add a file to IPFS.</p>
</blockquote>
<p>Wording here could be changed to "when you add a file to your IPFS node" to remind that you're processing your own files; this isn't happening remotely on some kind of IPFS service.</p>
<blockquote><p>Your file, and all of the blocks within it, is given a unique fingerprint called a cryptographic hash.</p>
<p>IPFS removes duplications across the network.</p>
</blockquote>
<p>This statement isn't specific enough. I get it, because two identical files will produce matching hashes, so you don't get "duplicate" links. But removing duplications sounds like the opposite of what the reader wants — high availability and low latency are achieved only after many duplicates of the file are shared by many peers around the world. By contrast, it is the centralized file hosts like Google Drive who benefit most from file deduplication: if two people upload the same file to GD, Google can just store it once and let both people download it, saving themselves disk space. IPFS's statement almost lends itself to the interpretation that files will be removed from your node if they already exist on someone else's, which isn't the case.</p>
<p>Furthermore, this statement uses third-person voice for both IPFS and "the network", which is a double-whammy against the agency of the reader. It sounds like a remote service.</p>
<blockquote><p>Each network node stores only content it is interested in, plus some indexing information that helps figure out which node is storing what.</p>
</blockquote>
<p>Could be reworded to "You only store content you're interested in" to remind that IPFS is not a remote service and give agency to the reader.</p>
<blockquote><p>When you look up a file to view or download, you're asking the network to find the nodes that are storing the content behind that file's hash.</p>
</blockquote>
<p>This is weird. "Asking the network to find the nodes"? That's like asking the wave to find the water. What is the network if not nodes? And the sentence structure reminds me of the dog that killed the cat that caught the mouse that ate the cheese.</p>
<p>Should be reworded to "you're asking your peers to find who has a copy of that file".</p>
<blockquote><p><strong>Content creators</strong></p>
<p>IPFS brings the freedom and independent spirit of the web in full force — and can help you deliver your content at a much lower cost.</p>
</blockquote>
<p>The IPFS copywriters should be aware that approximately 100% of today's content creators are accustomed to uploading their videos, music, photos, and blog posts to online ad-supported services without having to pay to do so. You probably should let them know that hosting their creations on IPFS requires them to run a node or pay a pinning service, and that the decentralization only happens after they have fans who are willing to store and pin their works.</p>
<p>IPFS's homepage is bad. I wonder if they are intentionally toeing the line with their messaging, since the implications are always more grandiose and fabulous than the reality. I've said it once and I'll say it again: sqlite.org has a front-page link to <a href="https://sqlite.org/whentouse.html">When to use SQLite</a> which also plainly describes when <strong>not</strong> to use it. IPFS doesn't do this because they're <a href="/writing/sqlite_what_a_hunk">not as chad as SQLite</a>. Can't fault them for that. No one is.</p>
<p>Clearly, IPFS's messaging, and the messaging from crypto nuts who advocate IPFS without really knowing what it is either, has led people to believe that IPFS is a giant decentralized cloud storage system that may or may not be free to use. In my opinion, the copywriters need to turn this ship around and make it clear that IPFS is not a magic dumping ground for your random personal junk to be replicated globally. It's a peer-to-peer network that you need to actually participate in if you ever want to get anything done.</p>
<p>Welcome to the internet.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/ipfs_misconceptions/ipfs_misconceptions.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/16a4bfafc6fc486b5a257177a847a677b5e53835"><time datetime="2022-01-29T14:30:59-08:00">2022-01-29</time> Improve IPFS misconceptions.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/c1bc7ead18841bfc66c9d5421524edab9b6c7a6c"><time datetime="2021-12-07T23:11:55-08:00">2021-12-07</time> Add a comma between these clauses.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/a01011230d1387b1ec60bf707c34e4fd592405e0"><time datetime="2021-10-03T00:11:35-07:00">2021-10-03</time> Reduce arrogance.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/fc809226b3f6a3399be70575fcd6a7d027e38dc1"><time datetime="2021-06-14T16:07:47-07:00">2021-06-14</time> Add ipfs_misconceptions.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: 9a60192ef4bee72ebf3133215b0d5bccbb010425/view_in_app
title: View in app
url: https://voussoir.net/writing/view_in_app
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>View in app</h1>
<p>Hi! 👋</p>
<p>It looks like you're viewing this post in a web browser. Posts from voussoir.net look better and have more features when viewed from our official voussoir.net app! That's because we've intentionally reduced the performance and functionality of the web version, which would otherwise do everything you need! So although you seem to be very content browsing the website, we've decided to cut you off, block your scrolling with this modal, and serve 429s for the remainder of your session. Trust us, this really is for your own good. We just can't stand to see you suffer through this non-optimal voussoir.net experience when you could be using our awesome app instead. Thank us later!</p>
<p><a href="/app">Click here to get the app!</a></p>
<p>(<a href="https://duckduckgo.com/?q=how+to+stop+being+sooooo+lame">No thanks, I hate myself and I don't deserve the best voussoir.net experience!</a>)</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/view_in_app/view_in_app.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/9a60192ef4bee72ebf3133215b0d5bccbb010425"><time datetime="2021-06-28T18:39:29-07:00">2021-06-28</time> Add view_in_app.md, app.html.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: 02beda73fa846b115f6dc266bea489ef0c13da1e/not_just_bikes
title: Not Just Bikes
url: https://voussoir.net/writing/not_just_bikes
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<p><a class="tag_link" data-qualname="life" href="/writing/tags/life">[life]</a></p>
<h1>Not Just Bikes</h1>
<p>In May of 2021 I discovered the youtube channel <a href="https://www.youtube.com/channel/UC0intLFzLaudFG-xAvUEO-A/videos">Not Just Bikes</a>, and immediately watched the whole thing. The experience was revelatory and painful.</p>
<p><img alt="" loading="lazy" src="/writing/not_just_bikes/matrix.jpg"/></p>
<p>NJB has shown me that American urban and road design took a nosedive during the postwar period, where the <a href="https://www.youtube.com/watch?v=VVUeqxXwCA0&amp;t=1m28s" title="How Suburban Development Makes American Cities Poorer">American Dream</a> was to own a house with a yard, drive a car everywhere you go, and, for some reason, have nothing of utility around you. It's very easy to hop around a map of the US and find houses where the nearest grocery store is literally an hour's walk away.</p>
<p><img alt="" loading="lazy" src="/writing/not_just_bikes/walkingdistance.png"/></p>
<p>So you drive, and you park in the parking lots. The parking lots are enormous because everybody's driving instead of walking. They're so enormous, they push all the actual destinations farther and farther apart from each other, so that walking becomes even more useless and you have to do even more driving. Then the parking lots have to get bigger.</p>
<p>It would be no big deal to visit several small stores for a few items each on foot, but nobody likes starting their car multiple times to visit multiple stores across an asphalt ocean, and finding a new parking space each time. So, shopping trips are usually <a href="https://www.youtube.com/watch?v=YCeQLeQiRP4" title="you could stop at five or six stores">single-destination</a> only, preferring the Walmarts and Targets over the small, specialized, personalized, and/or more informed grocers and boutiques.</p>
<p>Our <a href="https://www.youtube.com/watch?v=ORzNZUeUHAM&amp;t=13s" title="The Ugly, Dangerous, and Inefficient Stroads found all over the US &amp; Canada">stroads</a> are wide, straight, and multilaned, so that it's easy for us to go really really fast and <a href="https://www.youtube.com/watch?v=Ra_0DgnJ1uQ&amp;t=58s" title="Why Cars Rarely Crash into Buildings in the Netherlands">crash into buildings</a>, because those are our priorities. All other forms of transit infrastructure are designed first and foremost to avoid disrupting the <a href="https://www.youtube.com/watch?v=vMed1qceJ_Q&amp;t=8m33s" title="I am not a Cyclist">fragile egos</a> of the motorists:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=9OfBpQgLXUc&amp;t=34s" title="The Dutch Solution for Safer Sidewalks">Sidewalk curbs step down into the road instead of the road coming up to the sidewalk</a>.</li>
<li><a href="https://www.youtube.com/watch?v=M8F5hXqS-Ac&amp;t=21m00s" title="Safe Cycling Showdown">Pedestrian bridges go over the stroad so drivers don't have to slow down</a>.</li>
<li><a href="https://www.youtube.com/watch?v=bglWCuCMSWc&amp;t=7s" title="The Wrong Way to Set Speed Limits - The 85th Percentile">Speed limits are discovered as emergent properties instead of, like, designed</a>.</li>
<li><a href="https://www.youtube.com/watch?v=bAxRYrpbnuA&amp;t=34s" title="Traffic Calming is Everywhere in the Netherlands">Traffic calming is only added as an absolute last resort after enough people die</a>.</li>
<li><a href="https://twitter.com/notjustbikes/status/1431260478303518724" title="If the bike stencil won't fit, that should tell you something.">Cyclists are sent down the rain gutters to make space for cars</a>.</li>
<li><a href="https://www.youtube.com/watch?v=RQY6WGOoYis&amp;t=1m43s" title="Do Your Buses Get Stuck in Traffic?">Buses get stuck in the same traffic as everyone else, ensuring they remain useless to all but the carless poor</a>.</li>
<li><a href="https://youtu.be/_ByEBjf9ktY?t=10m38s" title="Crossing the Street Shouldn't be Deadly (but it is)">Traffic signals are placed at the far end of the intersection so that motorists can comfortably encroach into and through the crosswalk without affecting their own line of sight</a>.</li>
</ul>
<p>Because heaven forbid we impose upon the helpless motorists inside their cushy, air conditioned, noise-proof boxes, with radio and navigation and heated seats, that require no physical effort to launch at speeds higher than humanity could have dreamed of just two hundred years ago. Don't make them wait at a crossing. Life is already so hard for them.</p>
<p>Here's my favorite NJB quote:</p>
<blockquote><p>For centuries, cities were designed such that everybody had what they needed within walking distance. Once you got where you were going, you could access everything you needed to on foot. These are the kinds of places Americans go to on vacation.</p>
<p><a href="https://www.youtube.com/watch?v=VVUeqxXwCA0&amp;t=23s">How Suburban Development Makes American Cities Poorer</a></p>
</blockquote>
<p>He says "centuries", but I think he means "since the dawn of civilization". Automobiles are less than 150 years old. You might recognize a number of beautiful, comfortable, enviable cities which are older than that. And you'll never find yourself thinking "commuting to work in ancient Rome must have been so difficult without a car!", because it wasn't. The car didn't become a necessity until we intentionally stamped out all of the alternatives.</p>
<p>In America, young people love to say that the DMV needs to be more aggressive with re-testing elderly people and revoking their drivers license because they cause more danger in traffic. And while that's true and probably a good idea, it doesn't get implemented because license revocation is a prison sentence and absolutely everyone knows it. In the cities of respectable nations, <a href="https://www.youtube.com/watch?v=IkVvXVDs5aI" title="Japan encourages parents to let kids walk to school solo - CBS">children</a> and the elderly don't have any problems going to the shop or cafe on their own because it's only five minutes away from their front door. In the States, a car is compulsory for all travel unless you live in the very densest of areas. Without it, you're stuck. Taking away your grandmother's license is taking away her independence. A whole lifetime of stars-and-stripes 🦅 American 🦅 freedom and independence comes toppling down with the removal of that one stone. Then Grandma spends the rest of her life trapped in the house because there's nowhere to walk and not enough bus service and everything's too far for even an electric mobility scooter to be useful, and she whithers away into mental and physical atrophy and dies.</p>
<p>One of the first excuses that springs to peoples' minds as to why America must be car dependent is that it is so <a href="https://www.youtube.com/watch?v=REni8Oi1QJQ" title="The Dumbest Excuse for Bad Cities - iT's tOo biG!">big</a>. Yes, America is geographically big, and if you go looking you can find <a href="https://old.reddit.com/r/dataisbeautiful/comments/tkfpfb/oc_the_most_isolated_city_or_town_in_each_us_state/">very isolated cities</a> that would take a long time to travel between. But the width of the continent as a whole has absolutely nothing to do with the placement of essentials <em>within</em> a single city. Even people who own very large houses still keep the toilet paper within arm's reach of the commode.</p>
<p>The people who built the oldest parts of our country must not have known how big the continent was, because they put living quarters right on top of shops back then! If today's cities would suck in their gut and bring more mixed use back into the center of downtown, people could get all of their daily business done by walking instead of driving, regardless of the center-to-center distance between them and the next city over. It's a non-sequitur.</p>
<p><a href="https://commons.wikimedia.org/wiki/File:Apartments_and_businesses,_12th_Ave_E_and_E_Pike_St,_ca_1912_(SEATTLE_2441).jpg"><img alt="" loading="lazy" src="/writing/not_just_bikes/mixed_use_building.jpg"/></a></p>
<p>The phrase that's been in my mind for a while is "too stupid to live". It is something of a wonder that we Americans haven't already extinguished ourselves by forgetting how to breathe or eat. You may have heard that sloths can starve to death on a full stomach because their only source of food is practically indigestible. You'd think they'd figure it out and try something else.</p>
<p>When my family gathers around the dinner table, one topic that always comes up for conversation is the vehicular idiocy that was seen throughout the week. Red light runs, excessive speeding, drivers in the shoulder lane, crashes, and near misses. A majority of people are not to be trusted with the task of driving, but we force them to do it anyway because we, collectively, are too stupid to put together better systems that don't necessitate it. It is easier to concentrate our moments of frustration towards the individuals who make short-term mistakes like running red lights than it is to realize the frustration that should be directed at the makers of long-term, diffuse, and pervasive mistakes like building suburban sprawl and bulldozing transit options.</p>
<p>Another part of the problem is that it feels good to punish people. We are a sadistic species and we like to coerce people into crossing our boundaries so that we can feel justified in retaliating. It is not as fun to design boundaries that don't get crossed in the first place. We design roadways that encourage unsafe driving and then we put up signs justifying punishment. It's dissonance. Here's a big fat 50mph five lane road that runs straight for miles, but you'd better slow down to 25mph now because there's an elementary school here. Nevermind that the 25mph stretch of road is cut from the same cloth as the 50mph road — it's the posted sign that makes the difference. Here's a series of traffic lights that don't coordinate with each other, and will stop you over and over again just as soon as you get going, but you'd better not run any reds and you sure as hell better not get stuck in the intersection during a light change because boy I'm gonna, um, honk at you, yeah that's what I'm gonna do, and you're gonna deserve it. It is difficult to convince people that car crashes are a symptom of deep, systemic design flaws affecting average people of average driving skill, rather than the fault of uniquely stupid individuals. Which is not to say the average skill level is very high, but even the people who'd like to opt out do not have a choice.</p>
<p>There is a freeway near me that is currently undergoing expansion, which is proven to <a href="https://en.wikipedia.org/wiki/Induced_demand">induce more demand</a>. Intelligent species have known this for decades. The <del>m</del><a href="https://www.youtube.com/watch?v=CHZwOAIect4" title="More Lands are (Still) a Bad Thing">billions of dollars</a> being used to put more cars on the road are not being used to improve walkability, bikeability, or reduce the need for driving in the first place by fixing our <a href="https://www.youtube.com/watch?v=VVUeqxXwCA0&amp;t=1m43s" title="How Suburban Development Makes American Cities Poorer">wack zoning</a> and just allowing a grocery to open on more corners.</p>
<p>Our zoning is the first thing that must change before anything else can happen. American cities are designed with huge contiguous swaths of land zoned as residential, especially R1 which denotes single-family housing. This is the zoning that prevents you from walking to the shop because there are no shops. This is the zoning that requires you to exodus by car to do absolutely anything except admire your neighbors' yards. This is the zoning for which every American deserves <a href="https://www.youtube.com/watch?v=8JeLPUDj4uk" title="SpongeBob SquarePants - 40 lashes">forty lashes</a>.</p>
<p>With mixed-use zoning we can allow destinations to exist among the living space instead of being wholly separate. We should start with small shops, cafes, and restaurants. The kinds of things that are needed often by the residents and won't draw excessive traffic from far away because the people who live far away have their own. This will give the NIMBYs less room to complain, though they will try anyway.</p>
<p>In the study of occupational safety, there is something called the <a href="https://www.cdc.gov/niosh/topics/hierarchy/default.html">hierarchy of controls</a>. Commonly represented as an inverted pyramid, it suggests you should do everything you can to eliminate a hazard using the most effective methods available to you, and only proceed to less effective methods when absolutely necessary. In between each of these levels, you could insert the phrase "<em>but if you can't, then, ...</em>".</p>
<p><img alt="" loading="lazy" src="/writing/not_just_bikes/hierarchy_of_controls.jpg"/></p>
<p>For example, an electrician wearing rubber gloves (PPE) could touch a live wire without too much risk, but it makes a lot more sense to turn the circuit off in the first place (Elimination) unless there are substantial justifications for working hot.</p>
<p>Applying this to suburban motorsports, we might find these levels correspond to:</p>
<ol>
<li><strong>Elimination</strong>: Do not ride any dangerous vehicle, just walk. But if you can't, then,</li>
<li><strong>Substitution</strong>: Get ordinary motorists off the road because they have proven themselves untrustworthy;  substitute them with buses operated by drivers with higher training standards, and trains which run on rails and are backed by substantial safety measures. But if you can't, then,</li>
<li><strong>Engineering controls</strong>: Increase separation of motorways from other modes of transit. Add comprehensive networks of bicycle paths. But if you can't, then,</li>
<li><strong>Administrative controls</strong>: Design roadways to be less conducive to speeding and reckless driving by making them less convenient to motorists. Raise pedestrian sidewalks so motorists must slow down, lest they wreck their suspension by speeding over it. Move traffic lights to the near side of the intersection. Bring destinations closer together with better zoning. But if you can't, then,</li>
<li><strong>PPE</strong>: Mandate airbags and seatbelts.</li>
</ol>
<p>Fail, fail, fail, fail, pass. Great job America, you got seatbelts in your cars. The only measure you've managed to accomplish so far is the least effective.</p>
<p>We are the sloths. We are too stupid to live. We'd rather challenge ourselves with the invention of self-driving cars and the manufacture of unspeakable quantities of batteries for EVs <a class="footnote_link" data-index="1" href="#footnote_text_1" id="footnote_link_1" title="[1] I look forward to EVs replacing ICEs, but they are still not as good as just using fewer cars.">[1]</a> than consider the possibility that maybe spending thousands of hours in traffic isn't an inherent part of life around which all else must bow down. You'd think they'd figure it out and try something else.</p>
<p>NJB has made me ashamed to be American. I am ashamed that a country with this much flagrant disregard for sense touts itself as the best nation in the world. I am ashamed that the closest we can get to eco-friendliness is to make our cars run on massive batteries and steer themselves, because simply getting out of the car was never considered an option. I am ashamed that these are my surroundings and that I did not wake up from this <a href="https://www.youtube.com/watch?v=OQE_5MFCekg" title="The Orange Pill">Matrix</a> sooner.</p>
<p><img alt="" loading="lazy" src="/writing/not_just_bikes/scissorhands.jpg"/></p>
<p>One of the other big problems with cars, which I don't think NJB has mentioned yet, is that they turn everyone into anonymous metal bubbles. Even without tinted windows, cars provide very little person-to-person visibility, communication, and most importantly, empathy. It is easy to become hateful towards a driver on the road in a way you'd never be towards a person you bumped into on foot, because they are nothing more than a big hotwheel that's sitting in your way. Also because bumping into someone on foot doesn't normally incur thousands of dollars of property damage.</p>
<p>Tom Scott made a video about <a href="https://www.youtube.com/watch?v=pcVGqtmd2wM">Peachtree City, Georgia</a> <a class="footnote_link" data-index="2" href="#footnote_text_2" id="footnote_link_2" title="[2] not to be confused with...">[2]</a>. They have a network of asphalt paths designed specifically for travel by golf cart, which I think is really cool and sets a good example for the rest of the country to follow. Small vehicles provide an intermediate option between bicycles and 3,000 pound automobiles, ideal for many of the around-town trips we have to make where a bike might not be enough:</p>
<ul>
<li>Travelling with a child or multiple children, or a person with limited mobility.</li>
<li>Travelling moderate distances in unpleasant weather.</li>
<li>Shopping for things that are too big or awkward to carry on a bike.</li>
<li>More things that I currently don't know about because I don't ride bikes.</li>
</ul>
<p>NJB has talked about <a href="https://www.youtube.com/watch?v=B9ly7JjqEb0" title="The Miniature Microcars of Amsterdam">microcars</a>, and while the video is still excellent, these don't strike my fancy the same way the golf carts did. Most of the microcars shown in his video follow too much in the design language of regular cars, with their high pillars and rectangulish porthole windows.</p>
<p>If we were to adopt small vehicles in more areas, I'd like them to remain mostly open-air, or wrapped in clear glass only. Slower modes of travel allow everyone to be closer to each other, and this coupled with high person-to-person visibility will ease traffic interactions and lessen the visceral savage hate that leads to so many of our stupid, pointless crashes. A switch to small vehicles is an opportunity to solve multiple traffic problems at once — let's not squander it by following the same old metal-bubble design. I don't expect actual golf carts to be what sweeps the nation, I just want small vehicles about that size, plus some comforts like weatherproofing and some speakers.</p>
<p>(See also Micah Toll's glowing review of a 25 mph electric mini-truck from China: <a href="/writing/not_just_bikes/electrek_1.html">part 1</a>, <a href="/writing/not_just_bikes/electrek_2.html">part 2</a>)</p>
<p>Finally, we need more public transit and it needs to provide benefits that cars can't. Sometimes I'll pick a destination on Google maps and ask it to route by transit. For destinations that are within "day trip" distance, the results are usually three to five times as long as travel by car, blowing all possibility of making a day trip out of it. I tried sampling a few destinations from here to the other coast and transit never seems to break even, always 1.5× to 2.5× the travel time of the car.</p>
<p>I have very little experience riding transit, so I'm not sure how much timing overhead is to be expected, or if these numbers are Americanly bad. Naturally, some time overhead is worth it in exchange for not having to do the driving, and transit routes can never be as direct as driving there yourself. But I really was expecting the trains to go just a little bit faster to make up for it. Notwithstanding that at these distances you're better off enjoying stops along the way rather than gunning for the finish.</p>
<p>As it stands, it is undeniable that transit is always significantly slower and less practical for day-to-day travel than driving except in the very densest of cities, and only exists for those who have no other options. Improved transit could be a great benefit to our society and atmosphere <a class="footnote_link" data-index="3" href="#footnote_text_3" id="footnote_link_3" title="[3] That's the place we keep our breathable air.">[3]</a>, but only if it provides enough advantages to be desirable to a person who otherwise could drive a car.</p>
<p>I can also recommend <a href="https://www.youtube.com/channel/UCGc8ZVCsrR3dAuhvUbkbToQ/videos">City Beautiful</a>. In the meantime, try <a href="https://www.youtube.com/watch?v=iGFqfTCL2fs">breaking traffic waves</a>.</p>
<p>Here's an exchange from <a href="https://en.wikipedia.org/wiki/How_to_Get_Ahead_in_Advertising">How to Get Ahead in Advertising</a>, a movie I'm surprised I hadn't heard of earlier:</p>
<blockquote><p>- [Dennis, to his boil] I'd like to see you suffer.</p>
<p>- [Boil] A typically communist statement.</p>
<p>- I'm not a communist!</p>
<p>- Yes, you are. You want to take everyone's car away.</p>
<p>- I do not want to take anything from anyone. I want to give them the choice of something better.</p>
<p>- Oh, yes? What?</p>
<p>- Trains.</p>
<p>- Trains? Trains are no good. They're old-fashioned. I hate trains. They're rotten.</p>
<p>- Only because they don't consume. Only because they're already there and don't eat up more and more and more. That's why you hate them. That's why government hates them. That's why they're old-fashioned and rotten.</p>
<p>- You commies don't half talk a lot of shit.</p>
<p>- Shut up! I'm not a communist!</p>
</blockquote>
<p>And here's a fun, angry comment from Hacker News user brailsafe:</p>
<blockquote><p>The suburbs are ironically, but not so surprisingly filled with crazy assholes that feel like the world belongs to them, or otherwise have some absurd levels of entitlement. They feel like they own the sidewalks, or if there's no sidewalks, they own the street and everything on it or not on it in front of their house, they feel like they should control whether or not a marginally higher density building should be built down the street or whether a neighbor can paint their house a different colour. When there's no land left, they want more cul-de-sacs built for them because it's the suburban dream and fuck wetlands anyway, and when there's no social services left, they want new ones built for them at everyone else's expense and they don't really want to be part of a community; they want to be by themselves, on their fat asses, in front of their fucking TV, the only quality of which they understand is how big it is.</p>
<p><a href="https://news.ycombinator.com/item?id=35106661">https://news.ycombinator.com/item?id=35106661</a></p>
</blockquote>
<p><a class="footnote_text" data-index="1" href="#footnote_link_1" id="footnote_text_1">[1]</a> I look forward to EVs replacing ICEs, but they are still not as good as just <a href="https://www.youtube.com/watch?v=OObwqreAJ48&amp;t=6" title="You don't need to own a care if you don't drive to work - carsharing">using fewer cars</a>.</p>
<p><a class="footnote_text" data-index="2" href="#footnote_link_2" id="footnote_text_2">[2]</a> <a href="/writing/not_just_bikes/peachtrees.jpg">not to be confused with...</a></p>
<p><a class="footnote_text" data-index="3" href="#footnote_link_3" id="footnote_text_3">[3]</a> That's the place we keep our breathable air.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/not_just_bikes/not_just_bikes.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/a8a7281e7f6f2f4a490d39bcb9953712de26aa35"><time datetime="2024-02-05T19:31:06-08:00">2024-02-05</time> Add link to induced demand video.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/b3727336ddb9562c686a4672f4b2070c79f872f7"><time datetime="2024-01-17T20:19:29-08:00">2024-01-17</time> Improve and rearrange some prose; add hierarchy of controls.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/b2687ba8501c014a62100c663323cba8b8547428"><time datetime="2023-10-08T10:52:00-07:00">2023-10-08</time> Fix typo "invention of".</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/f03441cfc6a2670206f45e3c20d69f62074a9fa5"><time datetime="2023-08-29T21:54:50-07:00">2023-08-29</time> Add brailsafe comment.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/96c6abb8cc113fca5887d5464794b6ad1584de13"><time datetime="2023-01-01T14:07:36-08:00">2023-01-01</time> Add How to get Ahead in Advertising quote.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/795031fc24694fa1f6f1443d37a1618a277120a0"><time datetime="2022-09-27T18:33:36-07:00">2022-09-27</time> Add link to newest pedestrian crossing video.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/19046fbe2cd10ecd9d03991e9104f6dc7d02c704"><time datetime="2022-08-19T17:35:55-07:00">2022-08-19</time> Update not_just_bikes.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/99e194ff43df3e26a64d5ca29d4fdc50d8f658f7"><time datetime="2022-06-02T18:37:24-07:00">2022-06-02</time> Link to NJB's Orange Pill video.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/1486c482b617619de918ecf079f40c48c9e10701"><time datetime="2022-01-07T22:45:34-08:00">2022-01-07</time> Add tag life to several articles.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/d6ce0a1acf309ec9b9c0d9e648e3c50e85cdadfd"><time datetime="2021-10-10T12:42:26-07:00">2021-10-10</time> Clarify wording near asphalt ocean.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/16318a53b0baf6885c6c98609b5bc498f047e0a7"><time datetime="2021-09-17T23:01:59-07:00">2021-09-17</time> Add more of my own thoughts regarding solutions.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/02beda73fa846b115f6dc266bea489ef0c13da1e"><time datetime="2021-09-10T21:56:04-07:00">2021-09-10</time> Add not_just_bikes.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: c9a3432f8674c1b4f85d3d7e6af1cbfc31235bf8/sublime_as_editor
title: Sublime Text as EDITOR
url: https://voussoir.net/writing/sublime_as_editor
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>Sublime Text as EDITOR</h1>
<p>I use Sublime Text as my <code>EDITOR</code> environment variable and as my git editor. I used ST2 for many years and recently jumped to ST4, skipping 3. But something has changed along the way, or maybe it was always a little imperfect.</p>
<p>Between Sublime's workspaces and project sessions and hot-exit files that allow you to close with unsaved changes, there is quite a lot of state saved to disk. I found myself getting frustrated at the various incantations of <code>sublime_text.exe -n</code>, <code>sublime_text.exe -n -w</code>, <code>subl.exe -n -w</code> because they recalled the previous state and opened a bunch of tabs or windows when I just wanted to do a single git rebase.</p>
<p><img alt="" loading="lazy" src="/writing/sublime_as_editor/bad1.png"/></p>
<p><img alt="" loading="lazy" src="/writing/sublime_as_editor/bad2.png"/></p>
<p><a href="https://forum.sublimetext.com/t/disable-automatic-loading-of-last-session/4132/10" title="Disable automatic loading of last session">Here is a forum thread</a> where other people have the same problem, and they mostly discuss workarounds through config files. I didn't want to make any of those changes because I like having all my tabs restored in 99% of cases, just not for temporary <code>EDITOR</code> purposes.</p>
<p>Then I realized something that I should have realized a long time ago because I'm the one who's always going on about it: Sublime is <a href="/writing/master_of_my_domain">portable software</a>. I can just make a copy of the folder. And I did. And it's great.</p>
<p>Now, I have <code>C:\Software\Sublime Text\4133</code> and <code>C:\Software\Sublime Text\4133_EDITOR</code>, and I can configure them independently. For the EDITOR copy, I can remove all project folders, disable a lot of UI elements, turn off state-saving, and uninstall unnecessary packages.</p>
<p><img alt="" loading="lazy" src="/writing/sublime_as_editor/good1.png"/></p>
<p><img alt="" loading="lazy" src="/writing/sublime_as_editor/good2.png"/></p>
<p>My <code>EDITOR</code> environment variable is <code>C:/software/sublime text/4113_EDITOR/subl.exe -n -w</code>.</p>
<p>My .gitconfig contains:</p>
<pre><code>[core]
    editor = 'C:/software/sublime text/4113_EDITOR/subl.exe' -n -w</code></pre>
<p>My WinSCP editor is <code>C:/software/sublime text/4113_EDITOR/sublime_text.exe -n !.!</code>.</p>
<p>Use portable software, folks.</p>
<p>P.S. I found that the <code>-w</code> flag only waits if you also provide a filename to edit on the command line. <code>subl -w</code> does not block, but <code>subl -w myfile.txt</code> does block. This made me confused while I was testing everything.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/sublime_as_editor/sublime_as_editor.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/c9a3432f8674c1b4f85d3d7e6af1cbfc31235bf8"><time datetime="2021-10-02T11:09:51-07:00">2021-10-02</time> Add sublime_as_editor.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: b9f257e3e625074ead95f09b8f1f0b064e6c5ca6/emailing_myself
title: Sending emails to myself
url: https://voussoir.net/writing/emailing_myself
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<h1>Sending emails to myself</h1>
<p>In April, I wrote <a href="https://git.voussoir.net/voussoir/voussoirkit/src/branch/master/voussoirkit/operatornotify.py">operatornotify.py</a>, a module which allows my programs to notify me of important information or errors. I was immediately very proud of it. It felt awesome to get so much impact out of a sub-100 line module as I went around hooking it up to my existing programs and getting the tracebacks from my horribly broken code delivered right to me.</p>
<p><img alt="" loading="lazy" src="/writing/emailing_myself/ycdl_errors.png" title="there's more"/></p>
<p>Since then, I have figured out which parts of the interface are most important, and boiled them down into a single decorator, so that adding <code>@operatornotify.main_decorator</code> is all it takes to get emails from a program. It's probably the best bang-for-buck code I've written in a while.</p>
<div class="highlight python"><pre><span class="nd">@operatornotify</span><span class="nd">.</span><span class="nd">main_decorator</span><span class="p">(</span><span class="narg">subject</span><span class="o">=</span><span class="s1">'</span><span class="s1">myprogram.py</span><span class="s1">'</span><span class="p">)</span>
<span class="kd">def</span> <span class="nf">main</span><span class="p">(</span><span class="narg">argv</span><span class="p">)</span><span class="p">:</span>
    <span>...</span>

<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'</span><span class="s1">__main__</span><span class="s1">'</span><span class="p">:</span>
    <span class="k">raise</span> <span class="ne">SystemExit</span><span class="p">(</span><span class="n">main</span><span class="p">(</span><span class="n">sys</span><span class="n">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="p">]</span><span class="p">)</span><span class="p">)</span>
</pre></div><p>The most important part of operatornotify's design is that it takes advantage of your existing logging infrastructure. Although you can call <code>operatornotify.notify</code> whenever you want, it's much easier to add a log handler that captures WARNING level messages automatically. This has encouraged me to revisit some older programs that just used print statements and replace them with proper logging, which makes them easier to use and debug in general.</p>
<p>There are a few pain points that arise from using operatornotify as a log handler. For example:</p>
<ul>
<li><p>When using <code>@main_decorator</code>, you have to pick a subject line ahead of time and can't change it later. But to improve the skimmability of emails in my inbox, I like to prefix the subject lines with <code>⭕︎</code> if everything went okay <a class="footnote_link" data-index="1" href="#footnote_text_1" id="footnote_link_1" title="[1] I wanted to use a checkmark, but the fonts on Android make all of the unicode check marks look stupendously ugly. And Android doesn't let me change the system font outside of Daddy Google's approved list because I'm a big stupid dummy baby who can't be trusted with a ttf because I might get a boo-boo.">[1]</a> and <code>✕</code> if there was a warning, which obviously is not known until the end of runtime. I can imagine a few solutions but haven't decided which is most clean and appropriate for inclusion in the module <a class="footnote_link" data-index="2" href="#footnote_text_2" id="footnote_link_2" title='[2] I am using a stopgap solution in my_operatornotify that detects the phrase "Program finished, returned 0" to add the ⭕︎.'>[2]</a>.</p>
</li>
<li><p>Not all messages cleanly fit into the integer levels of logging. For the programs I run as scheduled tasks, it's nice to receive some kind of message to know that they ran successfully and didn't just fail to launch, but I don't necessarily want to see all of their output since I trust the returned status of 0. So neither <code>--operatornotify-level WARNING</code> or <code>INFO</code> is really ideal.</p>
</li>
</ul>
<p>But these inconveniences are vastly outweighed by the ability to add a single decorator function that immediately supercharges all of the existing log lines and encourages me to add better logging where I skimped on it earlier.</p>
<p>Then I took the next step towards this summit of email enlightenment: running the mail server myself. I figure there are three reasons I should self-host the mail for operatornotify:</p>
<ol>
<li><p>The notifications usually contain private information or filepaths that I don't like to have sitting on a third-party server. I don't think these worries are justified since my email provider does at-rest encryption and uses SSL, but I just don't like it.</p>
</li>
<li><p>My code might wind up sending hundreds of emails in a row, and I don't want to do that to a third-party host.</p>
</li>
<li><p>It's a good chance for me to play with stuff I haven't tried before.</p>
</li>
</ol>
<p>I'm using the <a href="https://github.com/foxcpp/maddy">Maddy</a> email server, which is an all-in-one solution for both SMTP and IMAP. I also considered <a href="https://mailinabox.email/">Mail-in-a-Box</a>, but their documents specifically say that it's designed to have the whole machine to itself, which I don't want to do. The most widely known software is <a href="http://www.postfix.org/">Postfix</a> for SMTP and <a href="https://www.dovecot.org/">Dovecot</a> for IMAP, but I started drowning in the configuration of dovecot before even touching postfix, and gave up. I'm just a single user emailing myself. I like that maddy is just a single binary. So now I'm free to send myself as many thousands of emails as I want, containing whatever I want, using my own code and connecting to my own server.</p>
<p><a href="https://f-droid.org/en/packages/eu.faircode.email/">FairEmail</a> on Android supports IMAP IDLE, so I can get tracebacks anytime, anywhere. It's great.</p>
<p>Here are some ways I'm using operatornotify:</p>
<ul>
<li><p>My computer emails me after it boots. I configured the BIOS to automatically turn the computer back on after a power outage occurs, so I have an email letting me know roughly when that happened and what to expect next time I'm back.</p>
</li>
<li><p>My OVH server emails itself after it boots. Then, it launches a few programs — <a href="https://etiquette.voussoir.net">etiquette.voussoir.net</a>, <a href="https://old.reddit.com/r/GoldTesting/comments/26xset/newsletter_bot_commands/">/u/Newsletterly</a>, etc. — and emails again me when all of those have finished starting and the processes appear in <code>pidof</code>. If I accidentally break something in my Python environment that prevents those programs from working, I'll know about it before too long.</p>
</li>
<li><p>Most of my task scheduler jobs use <code>--operatornotify-level WARNING</code>. A lot of repetetive tasks that I used to do manually are now fully automated, but if they experience any errors (usually just network timeouts or 503s), I can re-run them at my convenience.</p>
</li>
<li><p>I'm working on a daily "system heartbeat" email that gives me a rundown of all the daemon processes that should always be running, and all of the task scheduler jobs that ran throughout the day. Although adding operatornotify to a program can help me get its traceback, it doesn't help me when the program is totally broken and didn't even launch. For example, when I upgrade Python and forget to <code>pip install</code> a module, so the <code>ImportError</code> occurs before main ever runs. I'd rather not add an intermediate launcher that tries to launch the task and notifies me if that fails.</p>
</li>
</ul>
<p>For the record, the code that actually sends the emails is in my <code>my_operatornotify.py</code>. The basic code you need is:</p>
<div class="highlight python"><pre><span class="kn">import</span> <span class="nn">email</span><span class="nn">.</span><span class="nn">message</span>
<span class="kn">import</span> <span class="nn">smtplib</span>

<span class="kd">def</span> <span class="nf">send_email</span><span class="p">(</span><span class="narg">subject</span><span class="p">,</span> <span class="narg">body</span><span class="o">=</span><span class="s1">'</span><span class="s1">'</span><span class="p">)</span><span class="p">:</span>
    <span class="n">sender</span> <span class="o">=</span> <span class="s1">'</span><span class="s1">xxx</span><span class="s1">'</span>
    <span class="n">recipient</span> <span class="o">=</span> <span class="s1">'</span><span class="s1">xxx</span><span class="s1">'</span>

    <span class="n">subject</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">subject</span><span class="p">)</span>
    <span class="n">body</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">body</span><span class="p">)</span>

    <span class="n">message</span> <span class="o">=</span> <span class="n">email</span><span class="n">.</span><span class="n">message</span><span class="n">.</span><span class="n">EmailMessage</span><span class="p">(</span><span class="p">)</span>
    <span class="n">message</span><span class="n">.</span><span class="n">add_header</span><span class="p">(</span><span class="s1">'</span><span class="s1">From</span><span class="s1">'</span><span class="p">,</span> <span class="n">sender</span><span class="p">)</span>
    <span class="n">message</span><span class="n">.</span><span class="n">add_header</span><span class="p">(</span><span class="s1">'</span><span class="s1">Subject</span><span class="s1">'</span><span class="p">,</span> <span class="n">subject</span><span class="p">)</span>
    <span class="n">message</span><span class="n">.</span><span class="n">add_header</span><span class="p">(</span><span class="s1">'</span><span class="s1">To</span><span class="s1">'</span><span class="p">,</span> <span class="n">recipient</span><span class="p">)</span>
    <span class="n">message</span><span class="n">.</span><span class="n">set_payload</span><span class="p">(</span><span class="n">body</span><span class="p">,</span> <span class="narg">charset</span><span class="o">=</span><span class="s1">'</span><span class="s1">utf-8</span><span class="s1">'</span><span class="p">)</span>

    <span class="n">server</span> <span class="o">=</span> <span class="n">smtplib</span><span class="n">.</span><span class="n">SMTP_SSL</span><span class="p">(</span><span class="s1">'</span><span class="s1">xxx</span><span class="s1">'</span><span class="p">,</span> <span class="mi">465</span><span class="p">)</span>
    <span class="n">server</span><span class="n">.</span><span class="n">login</span><span class="p">(</span><span class="s1">'</span><span class="s1">username</span><span class="s1">'</span><span class="p">,</span> <span class="s1">'</span><span class="s1">password</span><span class="s1">'</span><span class="p">)</span>
    <span class="n">server</span><span class="n">.</span><span class="n">send_message</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
    <span class="n">server</span><span class="n">.</span><span class="n">quit</span><span class="p">(</span><span class="p">)</span>

<span class="kd">def</span> <span class="nf">notify</span><span class="p">(</span><span class="narg">subject</span><span class="p">,</span> <span class="narg">body</span><span class="o">=</span><span class="s1">'</span><span class="s1">'</span><span class="p">)</span><span class="p">:</span>
    <span>...</span>
    <span class="n">send_email</span><span class="p">(</span><span class="n">subject</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
    <span>...</span>
</pre></div><p>But I have some additional stuff in there to deal with retrying and eventually writing the message to my desktop if the mail server is unreachable.</p>
<p>To write the system heartbeat, I'm parsing the output of <code>schtasks</code> with the subprocess module:</p>
<div class="highlight python"><pre><span class="kn">import</span> <span class="nn">csv</span>
<span class="kn">import</span> <span class="nn">subprocess</span>
<span class="kn">from</span> <span class="nn">voussoirkit</span> <span class="kn">import</span> <span class="n">winwhich</span>

<span class="n">command</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">winwhich</span><span class="n">.</span><span class="n">which</span><span class="p">(</span><span class="s1">'</span><span class="s1">schtasks</span><span class="s1">'</span><span class="p">)</span><span class="p">,</span>
    <span class="s1">'</span><span class="s1">/query</span><span class="s1">'</span><span class="p">,</span>
    <span class="s1">'</span><span class="s1">/tn</span><span class="s1">'</span><span class="p">,</span> <span class="s1">'</span><span class="se">\\</span><span class="s1">voussoir</span><span class="se">\\</span><span class="s1">'</span><span class="p">,</span>
    <span class="s1">'</span><span class="s1">/fo</span><span class="s1">'</span><span class="p">,</span> <span class="s1">'</span><span class="s1">csv</span><span class="s1">'</span><span class="p">,</span>
    <span class="s1">'</span><span class="s1">/v</span><span class="s1">'</span>
<span class="p">]</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">subprocess</span><span class="n">.</span><span class="n">check_output</span><span class="p">(</span>
    <span class="n">command</span><span class="p">,</span>
    <span class="narg">stderr</span><span class="o">=</span><span class="n">subprocess</span><span class="n">.</span><span class="n">STDOUT</span><span class="p">,</span>
    <span class="narg">creationflags</span><span class="o">=</span><span class="n">subprocess</span><span class="n">.</span><span class="n">CREATE_NO_WINDOW</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">output</span><span class="n">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">'</span><span class="s1">utf-8</span><span class="s1">'</span><span class="p">)</span>
<span class="n">lines</span> <span class="o">=</span> <span class="n">output</span><span class="n">.</span><span class="n">splitlines</span><span class="p">(</span><span class="p">)</span>
<span class="n">reader</span> <span class="o">=</span> <span class="n">csv</span><span class="n">.</span><span class="n">DictReader</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">reader</span><span class="p">:</span>
    <span>...</span>
</pre></div><p><a class="footnote_text" data-index="1" href="#footnote_link_1" id="footnote_text_1">[1]</a> I wanted to use a checkmark, but the fonts on Android make all of the unicode check marks look <a href="/writing/emailing_myself/checkmarks.png">stupendously ugly</a>. And Android doesn't let me change the system font outside of Daddy Google's approved list because I'm a big stupid dummy baby who can't be trusted with a ttf because I might get a boo-boo.</p>
<p><a class="footnote_text" data-index="2" href="#footnote_link_2" id="footnote_text_2">[2]</a> I am using a stopgap solution in <code>my_operatornotify</code> that detects the phrase "Program finished, returned 0" to add the ⭕︎.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/emailing_myself/emailing_myself.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/3475cb0abf63172e6392487ffaf41755f71a18e3"><time datetime="2023-09-18T21:01:09-07:00">2023-09-18</time> Replace github links with git.voussoir.net.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/b9f257e3e625074ead95f09b8f1f0b064e6c5ca6"><time datetime="2021-10-10T12:20:41-07:00">2021-10-10</time> Add emailing_myself.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: ad8a56682eeacd1aef4a3b4144d33337a560808c/motorola_c139
title: Recharging a cell phone battery outside of the phone
url: https://voussoir.net/writing/motorola_c139
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<p><a class="tag_link" data-qualname="electronics" href="/writing/tags/electronics">[electronics]</a> <a class="tag_link" data-qualname="today_i_did_this" href="/writing/tags/today_i_did_this">[today_i_did_this]</a></p>
<h1>Recharging a cell phone battery outside of the phone</h1>
<p>Here is a Motorola C139 cell phone from about 2008. I rediscovered it in a drawer last year.</p>
<p><a href="/writing/motorola_c139/phone_1.jpg"><img alt="" loading="lazy" src="/writing/motorola_c139/thumbs/phone_1.jpg"/></a></p>
<p><a href="/writing/motorola_c139/phone_2.jpg"><img alt="" loading="lazy" src="/writing/motorola_c139/thumbs/phone_2.jpg"/></a></p>
<p>The charger for this device has long been misplaced. It uses a barrel plug smaller than any I've ever seen, with an outer diameter of about 3mm.</p>
<p><a href="/writing/motorola_c139/phone_3.jpg"><img alt="" loading="lazy" src="/writing/motorola_c139/thumbs/phone_3.jpg"/></a></p>
<p>I thought it would be fun to turn this old phone back on just for nostalgia's sake, but without the charger and not wanting to tear it open to access the charger pins, I just put it back in the drawer.</p>
<p>Here is a TP4056 battery charger that I bought on <a href="https://www.ebay.com/itm/113876620225">ebay</a> a few weeks ago to explore another project idea.</p>
<p><a href="/writing/motorola_c139/tp4056.jpg"><img alt="" loading="lazy" src="/writing/motorola_c139/thumbs/tp4056.jpg"/></a></p>
<p>While I was fiddling with it, I realized this might be just what I needed to get the Motorola working again.</p>
<p><a href="/writing/motorola_c139/charging_1.jpg"><img alt="" loading="lazy" src="/writing/motorola_c139/thumbs/charging_1.jpg"/></a></p>
<p><a href="/writing/motorola_c139/charging_2.jpg"><img alt="" loading="lazy" src="/writing/motorola_c139/thumbs/charging_2.jpg"/></a></p>
<p>And that worked! This thirteen year old battery is still able to take a charge.</p>
<p><a href="/writing/motorola_c139/success_1.jpg"><img alt="" loading="lazy" src="/writing/motorola_c139/thumbs/success_1.jpg"/></a></p>
<p><a href="/writing/motorola_c139/success_2.jpg"><img alt="" loading="lazy" src="/writing/motorola_c139/thumbs/success_2.jpg"/></a></p>
<p><a href="/writing/motorola_c139/success_3.jpg"><img alt="" loading="lazy" src="/writing/motorola_c139/thumbs/success_3.jpg"/></a></p>
<p>The only problem now is that the phone is really boring to use and I have no purpose for it. Other than to play breakout.</p>
<p><a href="/writing/motorola_c139/success_4.jpg"><img alt="" loading="lazy" src="/writing/motorola_c139/thumbs/success_4.jpg"/></a></p>
<p>P.S. I accidentally fried this TP4056 shortly after taking these photos. I picked it up with the wires still dangling out of those pins and I think I shorted something. Smoke came out and everything. Luckily it came in a two-pack.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/motorola_c139/motorola_c139.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/ad8a56682eeacd1aef4a3b4144d33337a560808c"><time datetime="2021-10-22T00:17:48-07:00">2021-10-22</time> Add motorola_c139.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: e5b415e3b8c8f1438379c7381682501c16a8223c/ankibutton
title: Ankibutton
url: https://voussoir.net/writing/ankibutton
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<p><a class="tag_link" data-qualname="3dprinting" href="/writing/tags/3dprinting">[3dprinting]</a> <a class="tag_link" data-qualname="electronics" href="/writing/tags/electronics">[electronics]</a></p>
<h1>Ankibutton</h1><ol id="table_of_contents">Table of contents<li><a href="#glamour_shots">Glamour shots</a></li><li><a href="#introduction">Introduction</a></li><li><a href="#the_problem">The problem</a></li><li><a href="#false_starts">False starts</a></li><li><a href="#true_starts">True starts</a></li><li><a href="#the_fourth_button">The fourth button</a></li><li><a href="#conclusion">Conclusion</a></li><li><a href="#download">Download</a></li><li><a href="#appendix_installing_seeeduino_xiao_into_the_arduino_ide">Appendix: Installing Seeeduino Xiao into the Arduino IDE</a></li></ol>
<h2 id="glamour_shots">Glamour shots<a class="header_anchor_link" href="#glamour_shots"> (§)</a></h2>
<p><a href="/writing/ankibutton/glamour_1.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/glamour_1.jpg"/></a></p>
<p><a href="/writing/ankibutton/glamour_2.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/glamour_2.jpg"/></a></p>
<p><a href="/writing/ankibutton/glamour_3.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/glamour_3.jpg"/></a></p>
<h2 id="introduction">Introduction<a class="header_anchor_link" href="#introduction"> (§)</a></h2>
<p>One of the most effective ways to procrastinate on a task is to spend time working on something else that will supposedly help you do the original task more efficiently, but in actuality will never recoup the invested time. You can make a new tool, or design a new process, or rearrange your work environment, just as long as you spend more time on it than it could ever possibly pay you back. Whatever you do, never consult <a href="https://xkcd.com/1205/">this chart</a>. This technique will ensure that you come out behind on your goals while giving you the defense of having worked hard the entire time.</p>
<p>In this article, I'll show you a new tool I made.</p>
<h2 id="the_problem">The problem<a class="header_anchor_link" href="#the_problem"> (§)</a></h2>
<p>Over the past three years, I've done almost 100% of my <a href="https://apps.ankiweb.net/">Anki</a> studying on my <a href="https://f-droid.org/en/packages/com.ichi2.anki/">smartphone</a>, simply because I don't enjoy the ergonomics of using Anki on the computer. I don't like having to sit with my hands on the keyboard for a long time, pressing the spacebar. I'd rather be able to lean back or sit farther away.</p>
<p>At the same time, the ergonomics of the smartphone are not ideal either. The hands are most comfortable at the lap but this is bad for the neck. Researching words and copy-pasting unicode is slow and cumbersome on mobile.</p>
<p>I thought it might be nice to have a handheld controller that I can use with my computer from a distance. I already have an Xbox controller and <a href="https://joytokey.net/en/">joytokey</a>, but if I used those things then I'd be done procrastinating already.</p>
<p>So there I was, with no choice but to make my own.</p>
<h2 id="false_starts">False starts<a class="header_anchor_link" href="#false_starts"> (§)</a></h2>
<p>When I assembled my <a href="/writing/kb_nearer">keyboard</a> I used a microcontroller that cost $18 plus $5 shipping, which is more than I wanted to spend on a silly thing like the ankibutton. I happened to have an old rubber-dome style keyboard that was broken and useless, so I thought I'd take the controller out of that and wire up some of my leftover keyboard switches onto it. By following the sheets of electrical contacts you can learn which pins you'd need to solder switches to to make a keypress. I never did solder anything, but I used a piece of wire to connect some pins and figure out where the keys I want are.</p>
<p><a href="/writing/ankibutton/harvested_1.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/harvested_1.jpg"/></a></p>
<p><a href="/writing/ankibutton/harvested_2.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/harvested_2.jpg"/></a></p>
<p><a href="/writing/ankibutton/harvested_3.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/harvested_3.jpg"/></a></p>
<p>I designed a case for this controller and three cherry switches.</p>
<p><a href="/writing/ankibutton/oldmodel.png"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/oldmodel.png"/></a></p>
<p><a href="/writing/ankibutton/harvested_4.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/harvested_4.jpg"/></a></p>
<p>I decided not to use that controller for two reasons. Mainly because it's not possible to reprogram the firmware on it, so if I ever got tired of using it as an ankibutton I'd be unable to change any of the keys without unsoldering and resoldering it in a new configuration. Secondly because I want to include a Ctrl+Z button on the ankibutton, and I don't think soldering a single switch onto the pads for both Ctrl and Z would work properly.</p>
<h2 id="true_starts">True starts<a class="header_anchor_link" href="#true_starts"> (§)</a></h2>
<p>I set this idea aside for a few months until one day I got an idea for a different project and started researching for other microcontrollers. I discovered the Seeeduino Xiao, and was able to get a two-pack for $14. Seven dollars for an arduino-compatible board with USB-C is a pretty good price.</p>
<p><a href="/writing/ankibutton/controller_1.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/controller_1.jpg"/></a></p>
<p><a href="/writing/ankibutton/controller_2.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/controller_2.jpg"/></a></p>
<p><a href="/writing/ankibutton/controller_3.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/controller_3.jpg"/></a></p>
<p>I also decided not to use the gateron keyboard switches, because for a handheld device these switches were just too big and would require lots of thumb movement during normal use. Instead, I harvested some small pushbuttons from a plate that had come out of a fax machine.</p>
<p><a href="/writing/ankibutton/buttons_1.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/buttons_1.jpg"/></a></p>
<p><a href="/writing/ankibutton/buttons_2.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/buttons_2.jpg"/></a></p>
<p><a href="/writing/ankibutton/buttons_3.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/buttons_3.jpg"/></a></p>
<p>I redesigned the enclosure around the Seeeduino and 6mm pushbuttons.</p>
<p><a href="/writing/ankibutton/model.png"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/model.png"/></a></p>
<p><a href="/writing/ankibutton/controller_fitting_1.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/controller_fitting_1.jpg"/></a></p>
<p><a href="/writing/ankibutton/controller_fitting_2.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/controller_fitting_2.jpg"/></a></p>
<p><a href="/writing/ankibutton/controller_fitting_3.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/controller_fitting_3.jpg"/></a></p>
<p><a href="/writing/ankibutton/button_fitting_1.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/button_fitting_1.jpg"/></a></p>
<p><a href="/writing/ankibutton/button_fitting_2.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/button_fitting_2.jpg"/></a></p>
<p><a href="/writing/ankibutton/button_fitting_3.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/button_fitting_3.jpg"/></a></p>
<p>I used superglue to hold the buttons in place, and double-sided tape to fix the controller in its recess. I used doubled-sided tape to attach a piece of felt on the underside of the lid, so that when the lid is firmly shut it provides more support to the controller.</p>
<p><a href="/writing/ankibutton/controller_fitting_4.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/controller_fitting_4.jpg"/></a></p>
<p>The wiring was straightforward, though I'm still not very good at soldering. The idea is the same as a full-sized keyboard matrix. One wire comes out of the controller and visits all four switches, providing what I am calling the "outbound" signal. Then, the other leg of each switch is wired to a separate pin on the controller so that there are four distinct "inbound" signals. The controller simulates a keypress whenever an inbound signal is received.</p>
<p><a href="/writing/ankibutton/soldering_1.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/soldering_1.jpg"/></a></p>
<p><a href="/writing/ankibutton/soldering_2.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/soldering_2.jpg"/></a></p>
<p>I was surprised to find that the Seeeduino does not support QMK firmware like I used on my keyboard. Or at least, I was not able to make QMK Toolbox discover the device even after switching the MCU type to atmega328p. I had to write the firmware myself as Arduino code which took me a while but was overall not too difficult.</p>
<p>Programming for hardware is slower than programming computer software. Normally when I write a program that crashes I can just read the traceback, but in hardware there are no tracebacks. It just stops working. And I have to keep bisecting the code until I find the part that does the least amount of wrongness, each time using a piece of wire to short RESET to GROUND to go back to bootloader mode because regular mode crashes before Arduino can reprogram it.</p>
<p><a href="/writing/ankibutton/testing.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/testing.jpg"/></a></p>
<p><a href="/writing/ankibutton/soldering_3.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/soldering_3.jpg"/></a></p>
<p><a href="/writing/ankibutton/soldering_4.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/soldering_4.jpg"/></a></p>
<p>Even though the first several prints I made were able to snap shut with a bit of friction, for some reason the final one didn't hold itself together very well. But I was tired of printing it so I wrapped it with some blue tape instead of doing it again.</p>
<p><a href="/writing/ankibutton/iterations.jpg"><img alt="" loading="lazy" src="/writing/ankibutton/thumbs/iterations.jpg"/></a></p>
<h2 id="the_fourth_button">The fourth button<a class="header_anchor_link" href="#the_fourth_button"> (§)</a></h2>
<p>My original plan was for three buttons: Spacebar (right answer), 1 (wrong answer), and Ctrl+Z (go back). After switching to the little buttons it made more sense to have four. It would be nice to map it to Anki's "easy" answer, but that's not straightforward since easy is sometimes 3 and sometimes 4. I am not quite sure what I'll do with it yet.</p>
<h2 id="conclusion">Conclusion<a class="header_anchor_link" href="#conclusion"> (§)</a></h2>
<p>The finished product functions very well. With a long USB cable I can lean back and review my flashcards comfortably. I added code to debounce the button presses and they seem reliable.</p>
<p>Having said that, I will probably use the ankibutton a few times and then forget about it. The burden of plugging it in, or worse, leaving it plugged in and cluttering my desk space, is simply higher than the value it provides. Mission accomplished!</p>
<h2 id="download">Download<a class="header_anchor_link" href="#download"> (§)</a></h2>
<p><a href="/writing/ankibutton/ankibutton.scad">ankibutton.scad</a></p>
<p><a href="/writing/ankibutton/ankibutton.ino">ankibutton.ino</a></p>
<h2 id="appendix_installing_seeeduino_xiao_into_the_arduino_ide">Appendix: Installing Seeeduino Xiao into the Arduino IDE<a class="header_anchor_link" href="#appendix_installing_seeeduino_xiao_into_the_arduino_ide"> (§)</a></h2>
<ol>
<li>Open File &gt; Preferences, and into the "Additional Boards Manager URLs", paste this: <code>https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json</code>.</li>
<li>Open Tools &gt; Board &gt; Boards Manager, and download "Seeed SAMD Boards", which should appear in search results for "xiao".</li>
<li>Select Tools &gt; Board &gt; Seeed SAMD &gt; Seeeduino Xiao.</li>
</ol>
<p>When the Seeeduino is in normal operating mode, it will occupy one COM port. If you use a piece of wire to short RESET to GROUND twice in a row, it will enter bootloader mode and occupy a different COM port. During bootloader mode it will also appear in Windows as an external storage device.</p>
<p>When uploading the code from Arduino IDE to the board, it will automatically go from normal mode to bootloader mode and back again. But if you need to reset it manually due to a crash, you need to go back to Tools &gt; Ports and pick the bootloader port before uploading again.</p>
<p>I found that uploading the code would often make my computer reset all of its USB connections, including my external hard drives, which was problematic for me. I did the remainder of the programming on a separate laptop to avoid this.</p>
<p>At first, my laptop was not able to recognize the device at all. I had to download <a href="https://github.com/Seeed-Studio/Signed_USB_Serial_Driver/blob/master/seeed_usb_serial.inf">seeed_usb_serial.inf</a>, and then tell Device Manager to install a driver from that file. When Device Manager asks for a driver location it only allows you to select folders, not files, so just select the folder into which you downloaded the inf file.</p>
<p>After these steps I did not encounter any more issues with programming the controller.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/ankibutton/ankibutton.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/e5b415e3b8c8f1438379c7381682501c16a8223c"><time datetime="2021-11-14T16:55:54-08:00">2021-11-14</time> Add ankibutton.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: 6b8ec10d9dc00d3bc3f273d01c5808b825167c85/everything_is_politics
title: Everything is politics
url: https://voussoir.net/writing/everything_is_politics
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<p><a class="tag_link" data-qualname="life" href="/writing/tags/life">[life]</a></p>
<h1>Everything is politics</h1><ol id="table_of_contents">Table of contents<li><a href="#introduction">Introduction</a></li><li><a href="#who_you_talk_to">Who you talk to</a></li><li><a href="#morals">Morals</a></li><li><a href="#what_you_buy">What you buy</a></li><li><a href="#what_you_eat">What you eat</a></li><li><a href="#tradition">Tradition</a></li><li><a href="#travel_and_transit">Travel and transit</a></li><li><a href="#technological_progress">Technological progress</a></li><li><a href="#employment">Employment</a></li><li><a href="#investments">Investments</a></li><li><a href="#everything">Everything</a></li></ol>
<h2 id="introduction">Introduction<a class="header_anchor_link" href="#introduction"> (§)</a></h2>
<p>Note: when I first sat down to write this, I was expecting it to come out a little more structured and coherent. Instead it's more of a wild stream of consciousness and references. Sorry. If I had more time I'd have written a shorter something or other.</p>
<p>I used to tell people that I'm not interested in politics, or that I don't like politics. At the time, I thought of "politics" as elections, presidents, congress, bills, and laws, and I get bored hearing or talking about those things. That part is written in present tense because they still bore me, but the first part was past tense because I've since changed my understanding of what politics even is.</p>
<p>It's everything.</p>
<p>Or at least, it's everything that involves more than one person. Which is almost everything. Even if you live off the grid, totally isolated and self-sufficient, unless you're <a href="https://en.wikipedia.org/wiki/Tarzan">Tarzan</a> or <a href="https://en.wikipedia.org/wiki/Nell_(film)">Nell</a> and have never encountered another human being, you presumably left society to get there, and that decision was political.</p>
<p>Politics is how people interact with each other. Politics is deciding who deserves what, who gets what, and how and when and why they get it. Politics is making your decisions based on how you think other people might react. Politics is <a href="https://en.wikipedia.org/wiki/Game_theory">game theory</a>. Do you follow someone's orders because they're in charge, or do you do what you believe is right? Do you anticipate that they will praise and congratulate you? How much does their opinion of you matter? Do you rely on resources they provide, do you need to keep them happy so they'll vote for you again next quarter, can you live without them? Politics is deciding how much to rely on others in the first place. Will they hate you, or ban you, or fire you, or torture and kill you? Do you have enough confidence in your decisions that you will preach to others and become a leader, or will you keep them to yourself and hope for the best?</p>
<h2 id="who_you_talk_to">Who you talk to<a class="header_anchor_link" href="#who_you_talk_to"> (§)</a></h2>
<p>Who you talk to is politics. Time is one of your most valuable assets, and who you spend it with is a big deal. It's good exercise to examine the relationships in your life and ask yourself what it is you get from them. There is always an answer. There are people you spend time with because they give you happiness and laughter, or physical intimacy. There are people you spend time with because you want to unlock future opportunities like jobs or travel or fame or fortune.</p>
<p>There are others you spend time with because you have a sense of obligation to do so, or a feeling of guilt if you don't. Maybe some family members come to mind. What you're "getting" in this case is a relief from that guilt. You can cut them out of your life if you really want to, but you'll have to power through difficult emotions to get there. Then again, maybe there's nothing wrong with having obligations sometimes. Maybe you have an abusive spouse or partner, whom you should escape from but whom you rely on for food and shelter. Maybe you fear the retaliation that will come if you try to leave them.</p>
<p>People Make Games did a video on a tabletop game called <a href="https://www.youtube.com/watch?v=aOYbR-Q_4Hs" title="The Game Prototype That Had to Be Banned by Its Own Studio">Tank Tactics</a> that demonstrates the politics of interpersonal relationships very well.
We already know that politics is big, but politics is also small. The situations that arise from a simple tabletop game with office coworkers are not unlike those that arise between real nations with real commerce and <a href="https://en.wikipedia.org/wiki/Cold_war">real nukes</a>. PMG describes how some coworkers who used to be friends had stopped talking to each other. We love to scorn the race of people known as politicians, but every interpersonal conflict is going to see someone try to take charge. It's in our nature and it only makes sense to give it a name.</p>
<h2 id="morals">Morals<a class="header_anchor_link" href="#morals"> (§)</a></h2>
<p>Morals are politics. <a href="https://en.wikipedia.org/wiki/Ethics">Few things</a> are inherently good or bad. It is a matter of interpersonal cooperation that theft, murder, and rape are illegal. To punish a stranger who hurt another stranger is straightforwardly logical because it deters others from hurting ourselves. But there are more abstract freedoms and crimes like dissent — <a href="https://en.wikipedia.org/wiki/Nineteen_Eighty-Four">illegal</a> in some places because the people in charge are insecure and tyrannical — and pornography — <a href="https://en.wikipedia.org/wiki/Pornography#Laws_and_regulations">illegal</a> in some places because people like to make sure the world follows their vision of what's clean and correct. You might think it's silly for me to point out examples of laws and crimes and say "see, that's politics", but of course the morals came first and the laws came second. Then there are laws surrounding tobacco, <a href="https://en.wikipedia.org/wiki/Prohibition">alcohol</a>, and other drugs, all caught in a dizzying mix of moral grandstanding, legitimate health concerns, and the fairness of health insurance payouts.</p>
<h2 id="what_you_buy">What you buy<a class="header_anchor_link" href="#what_you_buy"> (§)</a></h2>
<p>What you buy is politics. Products made locally, instead of in China, cost more. Products made without slave labor and animal cruelty cost more. Businesses that manage customer service domestically instead of outsourcing to India cost more. Televisions, computers, and cell phones that don't spy on you cost more. Electronics with <a href="https://en.wikipedia.org/wiki/Right_to_repair">removable batteries</a> cost more, at least up front. <a href="https://www.goodreads.com/quotes/72745-the-reason-that-the-rich-were-so-rich-vimes-reasoned">Boots that last</a> cost more. Every dollar you spend is a statement of your priorities and helps that company grow.</p>
<p>"Voting with your wallet" is a very tough thing that I'd like to write more about. A lot of it comes down to information imbalance and transparency since supply chains are so long and complicated now. It's hard to know where anything is made, and it's hard to know how good something will be before you buy it (the world needs more <a href="https://www.youtube.com/channel/UC2rzsm1Qi6N1X-wuOg_p0Ng/videos">Project Farm</a>s!).</p>
<p>These days, big-budget AAA video games have a reputation for being broken, buggy messes on release day because the studios know that customers will complain but not actually <a href="https://www.youtube.com/watch?v=T2pdvh4uiaM&amp;t=28m45s" title="Ross's Game Dungeon: Darkspore">do anything</a> about it. I would love to see the look on a project manager's face if they woke up on release day and saw a big, fat, <strong>$0.00</strong> on their sales sheets because the customers finally wised up. If only.</p>
<h2 id="what_you_eat">What you eat<a class="header_anchor_link" href="#what_you_eat"> (§)</a></h2>
<p>What you eat is politics. Folding Ideas has covered this in two great videos: <a href="https://www.youtube.com/watch?v=4EXVrzOACv4">Cooking Food on the Internet</a> and <a href="https://www.youtube.com/watch?v=V-a9VDIbZCU">Jamie Oliver's War on Nuggets</a>. The traditional foods of many cultures are the foods that got them through times of poverty <a class="footnote_link" data-index="1" href="#footnote_text_1" id="footnote_link_1" title="[1] Even if the food's reputation has since improved, e.g. lobster.">[1]</a>. They represent togetherness not just in the geographical sense of eating what's nearby, but in a historical sense, a shared background and understanding. Even two mortal enemies can realize they have something in common when they sit down to eat the same dish. But in the same geographical region and culture, socioeconomic striations can be revealed through food. It is not just a matter of rich people having access to more expensive ingredients like caviar and truffles, it is an active avoidance or even a loathing for the foods associated with the non-rich that gives it away. Jamie Oliver's vendetta against chicken nuggets doesn't make me think he has fine culinary taste, it makes me think he's out of touch.</p>
<p>In America, many agricultural products are <a href="https://en.wikipedia.org/wiki/Agricultural_subsidy">subsidized</a> by the government. That is, the customer only pays a fraction of what the food really costs, and the government covers the rest so the farmer can break even. You will not be surprised to learn that some crops earn higher subsidies than others, making them cheaper for the consumer and ultimately influencing the diet of the entire nation.</p>
<h2 id="tradition">Tradition<a class="header_anchor_link" href="#tradition"> (§)</a></h2>
<p><a href="https://www.youtube.com/watch?v=gRdfX7ut8gw" title="Fiddler on the Roof - Tradition">Tradition</a> is politics. Let's get the obvious out of the way and acknowledge that when countries undergo a major political event, it often becomes a holiday later. See America's <a href="https://en.wikipedia.org/wiki/Independence_Day_(United_States)">Independence Day</a>, France's <a href="https://en.wikipedia.org/wiki/Bastille_Day">Bastille Day</a>, Britain's <a href="https://en.wikipedia.org/wiki/Guy_Fawkes_Night">Guy Fawkes Day</a>. But every other kind of tradition is still politics by virtue of gathering people around shared or not-so-shared values. I like what Folding Ideas <a href="https://www.youtube.com/watch?v=uU5ZlOAvzAo&amp;t=9m16s" title="Let's Argue About Christmas Movies">says here</a> too, so I won't even paraphrase: "Ritual is an outward signifier of stability", "they are things to look forward to, things to look back on", "the dueling desires of the human psyche: the need to be different, the need to be independent, but also welcome and accepted".</p>
<p>Traditions can be the source of controversy when people have conflicting opinions about what's valuable and worthy of preservation. See for example the Netherlands's blackface-wearing <a href="https://en.wikipedia.org/wiki/Zwarte_Piet">Zwarte Piet</a>. Traditions are valuable to us because they keep historical events and ideas alive, but there comes a time when people decide that the value of upholding a tradition is not worth the tension it creates with modern sensibilities. The same can be said about <a href="https://en.wikipedia.org/wiki/Removal_of_Confederate_monuments_and_memorials">statues and monuments</a> representing immoral figures, <a href="https://en.wikipedia.org/wiki/The_Birth_of_a_Nation">propaganda art</a>, and art by <a href="https://en.wikipedia.org/wiki/Roman_Polanski">immoral people</a>. Even if I personally am not offended by a certain thing, I can recognize when other people are, and make decisions about what I want to share and perpetuate. That's politics. And it's difficult to balance the removal of offensive material — because there's no need to lord statues of murderers over passers-by every day — with the preservation of history and knowledge — because forgetting those murders happened is a tragedy of its own.</p>
<p>Traditions evolve and are replaced as people mingle and migrate. If it's a tradition you don't like, you call this progress; if it's a tradition you do like, you call it erosion. Both <a href="https://en.wikipedia.org/wiki/Sakoku">Japan</a> and <a href="https://en.wikipedia.org/wiki/Foreign_relations_of_North_Korea">North Korea</a> have isolationism in their history books (and, uh, present day book) at least in part because the leaders got sick of foreign cultures interfering with their own. I was interested to learn that Korea took deliberate steps to <a href="https://en.wikipedia.org/wiki/Linguistic_purism_in_Korean">remove Japanese loanwords</a> from their vocabulary after the Japanese occupation ended. On the other hand, the number of English loanwords into pretty much every other language is actively <a href="https://www.youtube.com/watch?v=pW4AiEqKGto" title="Dogen - Japanese in 10 years">growing</a>. Mainland China does not recognize Taiwan as an independent nation, due in part to the fact that Taiwan preserved many artifacts and cultural elements that the CCP tried to destroy during the <a href="https://en.wikipedia.org/wiki/Cultural_Revolution">Cultural Revolution</a>. It might be fair to say that Taiwan represents what China would have been, and the CCP hates having that reminder.</p>
<p>My family has some friends who own an alpaca farm. Some of their clientele are rich celebrities, who pay for the alpaca but leave it on the farm to be taken care of. Why would someone buy an alpaca in name only? Because the government allows the buyer to write that money off on their taxes. This incentivizes the flow of cash into the agricultural sector and helps preserve the tradition of raising a more diverse set of animals which otherwise might be displaced by pigs and cows. Tradition is political in the sense that it takes active, ongoing effort to maintain, and we as a culture decide how to carry that cost.</p>
<h2 id="travel_and_transit">Travel and transit<a class="header_anchor_link" href="#travel_and_transit"> (§)</a></h2>
<p>Travel and transit is politics. Whether you choose to walk, bike, ride, or <a href="/writing/not_just_bikes">drive</a> is a decision soaked in your local politics. The kinds of infrastructure that exist, and to what extent they are developed, depend on the priorities of who's in charge. Since the 1950s, the U.S. federal government has provided subsidies of <a href="https://crsreports.congress.gov/product/pdf/R/R44332">up to 90%</a> <a class="footnote_link" data-index="2" href="#footnote_text_2" id="footnote_link_2" title='[2] "Until the 1950s, each federal dollar had to be matched by an identical amount of state and local money. The federal share is now 80% for non-Interstate System road projects and 90% for Interstate System projects. Generally, federal money can be spent only on designated federal-aid highways, which make up roughly a quarter of U.S. public roads."'>[2]</a> for the development of automobile freeways, allowing states to launch enormous road-paving projects for a tenth of the true price. <a href="https://www.youtube.com/watch?v=_nSvy8jcNbU" title="City Beautiful - Freeways almost ruined San Francisco">San Francisco</a> fought and won against a freeway development plan to protect their local identity and scenery. <a href="https://www.youtube.com/watch?v=sI-1YNAmWlk" title="Not Just Bikes - How to (Quickly) Build a Cycling City">Paris, France</a> is working to quickly beef up their bicycling network and get cars off the road. Countries <a href="https://en.wikipedia.org/wiki/Fuel_tax">tax the sale of gasoline</a> in order to help pay for road infrastructure, which is about to become a problem as we switch to electric cars which use the road but not the gas. Even in a car-dependent area, you can decide to walk or bike as a way of making a statement of your values to your neighbors, but this statement will be costly in terms of your time and potentially your <a href="https://www.youtube.com/watch?v=vMed1qceJ_Q&amp;t=8m33s" title="Not Just Bikes - I am not a Cyclist">safety</a>. Some of you will be willing to pay those costs, others will not. It is a catch-22 because cities usually won't develop alternative transit infrastructure if there is no demand, but there is no demand because the current state of non-car transit is bad. <a href="https://en.wikipedia.org/wiki/Field_of_Dreams">If you build it...</a>? <a href="https://en.wikipedia.org/wiki/Fossil_fuels_lobby">Lobbying</a> is also a big issue with regards to the paradoxical state of car dependence.</p>
<p><a href="https://en.wikipedia.org/wiki/Taxi_medallion">Taxi medallions</a> are government-regulated licenses for operating taxi cars. You can view them as a sign of authenticity and trustworthiness for the passenger, giving them confidence that they won't be axe-murdered by the driver; or as a form of artificial scarcity propping up a market segment that might collapse if exposed to the realities of supply and demand. It's probably both, although I've heard lots of stories about vile taxi drivers so maybe it's just the one.</p>
<h2 id="technological_progress">Technological progress<a class="header_anchor_link" href="#technological_progress"> (§)</a></h2>
<p>Technological progress is politics. A lot of <a href="https://www.youtube.com/watch?v=7Pq-S557XQU" title="CGP Grey - Humans Need Not Apply">horses</a> lost their jobs when the automobile was invented. I'm sure they had foals to feed. Upheaving the status quo and affecting peoples' current livelihoods in exchange for maybe improving the future is a politically hot move. When a robot takes a factory assembly line worker's place, should we celebrate because they've been liberated from a repetitive, boring, dangerous, or mindless job that squanders their potential as a human being; or fear because they might now go homeless? What if we, as customers and consumers, had voted with our wallets from the very beginning and never allowed a factory that puts people in assembly lines to become successful in the first place <a class="footnote_link" data-index="3" href="#footnote_text_3" id="footnote_link_3" title="[3] And don't tell me that it's impossible! It might be impossible while maintaining our current expectations of consumer comforts, but it's not impossible outright.">[3]</a>?</p>
<p>The human mind is weird when it comes to progress. We have strong attractions to the first form of something that we encountered, even though our initial encounter was totally arbitrary <a class="footnote_link" data-index="4" href="#footnote_text_4" id="footnote_link_4" title="[4] I say &quot;was arbitrary&quot; and not &quot;might have been arbitrary&quot; because the deciding factor in all situations is when and where you were born, over which I don't think you had any control.">[4]</a>. If you gather up all the people who are against robotic automation of factory work, you'll find that very, very few of them are actually interested in going backwards in areas that have already been automated. There are no movements to reinstate employment of <a href="https://en.wikipedia.org/wiki/Switchboard_operator">switchboard operators</a>. To be honest, even my example of the assembly line is out of date since automation there is now so mainstream. <a href="https://en.wikipedia.org/wiki/Agricultural_robot">Farm automation</a> is a growing territory thanks to improvements in computer vision and automatic crop / weed differentiation.</p>
<p>Politicians love to run campaigns based on the idea of creating more jobs. If the notion of 'having more jobs' is noble in and of itself, we should be <a href="https://en.wikipedia.org/wiki/Luddite">dismantling everything</a> and turning them into jobs. The only reason this all matters so much is because the increased profits of automation are <a href="https://en.wikipedia.org/wiki/Means_of_production">centralized</a> amongst a few, and the pain and fear of being replaced are spread across the many. In a utopian society, these advancements would be uncontroversially celebrated as all of humanity would benefit from the awesome inventions we as a species can come up with.</p>
<h2 id="employment">Employment<a class="header_anchor_link" href="#employment"> (§)</a></h2>
<p>Employment is politics. The employer wants to pay as little as possible, the employee wants to earn as much as possible. The employer gains an advantage when the employees <a href="https://en.wikipedia.org/wiki/Fog_of_war">do not know each others' salaries</a> and will encourage a culture that is ashamed of talking about income. The power dynamics of employment are similar to large-scale economies: both parties rely on each other for something, but when the relationship is severed one party will fare better than the other, and they both know that. People love to hate their bosses; USA loves to hate China; people don't leave their bosses because they need the paycheck; USA doesn't leave China because we need the manufacturing. Employers can defend themselves from uppity employees by spreading out responsibilities and having new applicants on hand. Employees can defend themselves from uppity employers by keeping feelers out for new opportunities. It is a battle for leverage, for negotiating power. More primitively, employment is a sale of your time for the employer's money, but in every transaction there is the chance that one party will find a better deal elsewhere.</p>
<p>Most people don't like to change jobs very often, since that comes with its own set of headaches (paperwork, training, rebuilding personal rapport with coworkers, the desire to feel like you belong in just one place), but if your employer knows you won't leave them, they'll become more and more dominant in the relationship. Much like an abusive spouse who knows their partner is afraid to leave them, and for all the same reasons: food on table, roof over head.</p>
<h2 id="investments">Investments<a class="header_anchor_link" href="#investments"> (§)</a></h2>
<p>Investments are politics. It's good to own a home because the value of homes always goes up. It's good to own stocks because on the whole stocks always go up. Anything that threatens the upward trend of housing prices is an existential threat to the owner — it might be the entire basis of their retirement plan and their only means of eating next month. I'm not even moaning about property speculators or prolific landlords — ordinary people rely on the cost of their homes through <a href="https://en.wikipedia.org/wiki/Reverse_mortgage">reverse mortgages</a>. Value comes from scarcity, so it's existentially necessary for the homeowner to block the development of nearby affordable housing. Value comes from beauty, so it's existentially necessary to block power plants, wind farms, high-rises, and other infrastructure. See <a href="https://en.wikipedia.org/wiki/NIMBY">NIMBYism</a>. Value comes from class and dignity, so it's existentially necessary to block the poor and the homeless and the racial minorities. See <a href="https://en.wikipedia.org/wiki/Gentrification">gentrification</a>.</p>
<p>Throughout 2020 and 2021, the Fed propped up the stock market by buying bonds and securities with essentially unlimited funds. We expect unlimited growth and return on investment. We rely on the status quo and existentially panic when it doesn't hold up. There is the notion that all young people are liberal and all old people are conservative. We forget that investments are a form of gambling. We normalize this gambling and teach it to our children as the right way to live and to retire. According to the rules we've laid out for ourselves, these gamblers deserve to die of starvation and homelessness. But when push comes to shove, we realize we need to change those rules. Landlords were forbidden by the government from evicting tenants during the heights of covid. Stimulus checks went out to the tune of <a href="https://en.wikipedia.org/wiki/U.S._federal_government_response_to_the_COVID-19_pandemic#Congressional_response">hundreds of billions of dollars</a>. But we'll swear up and down we're not <a href="https://en.wikipedia.org/wiki/Red_Scare">damn commies</a> and this federal interference was just temporary. See also <a href="https://en.wikipedia.org/wiki/Welfare">social security</a>.</p>
<h2 id="everything">Everything<a class="header_anchor_link" href="#everything"> (§)</a></h2>
<p>Everything is politics. I've covered all of the major topics that have been on my mind. As I proofread this page I feel that I have spent too much time on the negative kinds of politics and not enough on the positive. After all, if everything is politics, and some things are good, ∴ politics is sometimes good. But so far the words have been <a href="https://en.wikipedia.org/wiki/Pitch_drop_experiment">flowing</a> easily, and going back to add positive thoughts is like pulling teeth, so, alas.</p>
<p>I want to end this article by condensing a thought that has been diffused throughout each of these sections. When we look at "politics", the global, legal, macroeconomic kind of politics that normally comes to mind at the word politics, we usually feel that it is too big and too separate of a thing to have anything to do with ourselves. There are politicians running my country, but I'm not one of them so I don't deal with politics. There are trade deals and manufacturing contracts and banking agreements, but I'm down here so I don't deal with politics. I can't change the world because the world is big and I am small.</p>
<p>But politics is present in even the smallest of interactions. Global politics is not fundamentally distinct from politics at any other level. It is the collection of every individual's small decisions, which has been growing for as long as humanity has grown. We see international leaders acting like immature school children, and for good reason: we're all actually doing the same thing. Every purchase you make, every idea you support, every employer you work for, all add up to this massive tiny thing we call politics. If you follow what you believe in, and do what you think is right, and encourage everyone you know to do the same, that changes the world by definition.</p>
<p>"I hear a million voices crying <em>what can one man do?</em>"</p>
<p>If you can carry this idea with you throughout your day, and remind yourself that you are thoroughly engaging in true, meaningful politics on an hourly basis all the time, maybe you'll feel a little less overwhelmed when you think about changing the world. You'll be used to it by then.</p>
<hr/>
<p>This article, like the others here, is moreso a compendium of thoughts than a statement of truth. I'm saying that so I can be off the hook for correctness. It's that easy! Maybe you have thoughts similar to mine and I've helped you think about things in a new way. Maybe your thoughts are opposed to mine, but at least now you know what kind of crazies you coexist with.</p>
<p>Boy, now I need to watch more <a href="https://en.wikipedia.org/wiki/Connections_(British_documentary)">Connections</a>!</p>
<p><a class="footnote_text" data-index="1" href="#footnote_link_1" id="footnote_text_1">[1]</a> Even if the food's reputation has since improved, e.g. <a href="https://en.wikipedia.org/wiki/Lobster#History">lobster</a>.</p>
<p><a class="footnote_text" data-index="2" href="#footnote_link_2" id="footnote_text_2">[2]</a> "Until the 1950s, each federal dollar had to be matched by an identical amount of state and local money. The federal share is now 80% for non-Interstate System road projects and 90% for Interstate System projects. Generally, federal money can be spent only on designated federal-aid highways, which make up roughly a quarter of U.S. public roads."</p>
<p><a class="footnote_text" data-index="3" href="#footnote_link_3" id="footnote_text_3">[3]</a> And don't tell me that it's impossible! It might be impossible while maintaining our current expectations of consumer comforts, but it's not impossible outright.</p>
<p><a class="footnote_text" data-index="4" href="#footnote_link_4" id="footnote_text_4">[4]</a> I say "was arbitrary" and not "might have been arbitrary" because the deciding factor in all situations is when and where you were born, over which I don't think you had any <a href="https://en.wikipedia.org/wiki/Mr._Nobody_(film)">control</a>.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/everything_is_politics/everything_is_politics.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/6b8ec10d9dc00d3bc3f273d01c5808b825167c85"><time datetime="2022-01-07T22:46:33-08:00">2022-01-07</time> Add everything_is_politics.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: d4049b9ee7082c9e09635875427abbde11afb6f4/mouse_usbc_mod
title: Modding a rechargeable mouse to USB-C
url: https://voussoir.net/writing/mouse_usbc_mod
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<p><a class="tag_link" data-qualname="electronics" href="/writing/tags/electronics">[electronics]</a> <a class="tag_link" data-qualname="today_i_did_this" href="/writing/tags/today_i_did_this">[today_i_did_this]</a></p>
<h1>Modding a rechargeable mouse to USB-C</h1>
<p>I have a wireless mouse that uses USB micro-B to recharge. I'd like for it to charge over USB type-C instead so I can use the cables that I already have around my desk.</p>
<p><a href="/writing/mouse_usbc_mod/mouse.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/mouse.jpg"/></a></p>
<p>It is a Vogek VKM42. You've never heard of Vogek and you never will again. I got the mouse for free and it is obviously very cheap, so I decided I wouldn't feel bad if I damaged it and the idea of replacing the socket was worth exploring.</p>
<p>There are two screws on the bottom underneath the gliders, which I cut so that I wouldn't have to fully remove them.</p>
<p><a href="/writing/mouse_usbc_mod/screws.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/screws.jpg"/></a></p>
<p>I didn't know where the screws would be underneath the gliders, or if the whole thing would simply be clipped shut, so I used some plastic blades to pry open the housing. The backside wouldn't pry, so I knew there were screws there.</p>
<p><a href="/writing/mouse_usbc_mod/disassemble_1.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/disassemble_1.jpg"/></a></p>
<p><a href="/writing/mouse_usbc_mod/disassemble_2.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/disassemble_2.jpg"/></a></p>
<p>As you can see, the USB socket only provides power to recharge the battery. The data lines are not connected because the mouse uses its wireless transmitter all the time. This makes the replacement very easy.</p>
<p>The type-C board that I used was conveniently sized to fit with the existing board. If you want to buy these, search for "USB type-C 2.0 receptacle". You should be able to find a 10-pack for one or two dollars plus shipping.</p>
<p><a href="/writing/mouse_usbc_mod/compare.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/compare.jpg"/></a></p>
<p>The micro-USB port was removed, then photographed with a shallow depth of field to make it feel unimportant.</p>
<p><a href="/writing/mouse_usbc_mod/disassemble_3.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/disassemble_3.jpg"/></a></p>
<p>The USB board has two intermediate solder pads between the socket and the wires. I'm not sure what they're for and the incomprehensible text didn't help.</p>
<p><a href="/writing/mouse_usbc_mod/board.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/board.jpg"/></a></p>
<p>I decided to assume they were unnecessary and soldered the type-C socket directly to the wires.</p>
<p><a href="/writing/mouse_usbc_mod/solder.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/solder.jpg"/></a></p>
<p>I plugged it in and it charged just fine.</p>
<p><a href="/writing/mouse_usbc_mod/testcharge.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/testcharge.jpg"/></a></p>
<p>However, I knew I needed to keep the other board because it has the screw hole which will keep the socket secure. I had to glue my type-C socket onto that board. I covered the old board with insulating tape to avoid short circuits and glued the pieces together with silicone, which I heard is good at bonding PCBs.</p>
<p><a href="/writing/mouse_usbc_mod/glueup_a1.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/glueup_a1.jpg"/></a></p>
<p><a href="/writing/mouse_usbc_mod/glueup_a2.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/glueup_a2.jpg"/></a></p>
<p><a href="/writing/mouse_usbc_mod/glueup_a3.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/glueup_a3.jpg"/></a></p>
<p>A minor disaster occured in which the white wire was decapitated.</p>
<p><a href="/writing/mouse_usbc_mod/glueup_a4.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/glueup_a4.jpg"/></a></p>
<p>I cut and stripped both wires and tried again.</p>
<p><a href="/writing/mouse_usbc_mod/glueup_b1.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/glueup_b1.jpg"/></a></p>
<p><a href="/writing/mouse_usbc_mod/glueup_b2.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/glueup_b2.jpg"/></a></p>
<p>The hole in the plastic housing was widened with a rotary tool to fit the type-C socket.</p>
<p><a href="/writing/mouse_usbc_mod/hole.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/hole.jpg"/></a></p>
<p>However, I had attached the socket to the other board with the fronts flush, whereas the original micro-USB socket had protruded from the board. My charging cables were not able to reach the new socket through the plastic housing. Not photographed.</p>
<p>I took the glue apart and tried again, this time with hot glue instead of silicone because the silicone took a very long time to become firm.</p>
<p><a href="/writing/mouse_usbc_mod/glueup_c1.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/glueup_c1.jpg"/></a></p>
<p>The problem with the hot glue attempt was that the glue made a very thick layer between the board and new socket, so it did not sit flush against the board. This took it out of alignment with the hole on the housing. Not photographed.</p>
<p>That didn't matter, because another minor disaster occured in which the red wire was decapitated. I was sick of these wires' weak heads and did a cranial transplant with some wire I could trust. I would have replaced them entirely but I don't have the metal bits to re-crimp a JST connector. So, I embraced the jank.</p>
<p><a href="/writing/mouse_usbc_mod/transplant.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/transplant.jpg"/></a></p>
<p>If you went into this article assuming I would know what I was doing, you were wrong.</p>
<p>I glued the type-C socket back onto the other board, first using superglue to tack them together, then adding the slow-drying silicone.</p>
<p><a href="/writing/mouse_usbc_mod/glueup_d1.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/glueup_d1.jpg"/></a></p>
<p><a href="/writing/mouse_usbc_mod/final_1.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/final_1.jpg"/></a></p>
<p><a href="/writing/mouse_usbc_mod/final_2.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/final_2.jpg"/></a></p>
<p><a href="/writing/mouse_usbc_mod/final_3.jpg"><img alt="" loading="lazy" src="/writing/mouse_usbc_mod/thumbs/final_3.jpg"/></a></p>
<p>In the end, it works. I'm glad I got some practice on a low-stakes item like this, so that if I do it again on something else I'll be more prepared. One less micro-USB cable to deal with.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/mouse_usbc_mod/mouse_usbc_mod.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/d4049b9ee7082c9e09635875427abbde11afb6f4"><time datetime="2022-02-05T17:04:17-08:00">2022-02-05</time> Add mouse_usbc_mod.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: aa92a34d060aecd1d17abb63d84508ecef000fff/run_as_admin_on_login
title: Run as Administrator on login
url: https://voussoir.net/writing/run_as_admin_on_login
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<p><a class="tag_link" data-qualname="windows" href="/writing/tags/windows">[windows]</a></p>
<h1>Run as Administrator on login</h1>
<p>I have a few long-running / daemon programs that I would like to "run as administrator" automatically when I start my computer, without UAC prompts. The programs are not available as Windows Services.</p>
<p>First, I tried placing an lnk shortcut in the Startup folder <a class="footnote_link" data-index="1" href="#footnote_text_1" id="footnote_link_1" title="[1] %appdata%\Microsoft\Windows\Start Menu\Programs\Startup">[1]</a> with the "Run this program as an administrator" box checked. However, this didn't work, and I found that the program simply didn't start at all.</p>
<p><img alt="" loading="lazy" src="/writing/run_as_admin_on_login/lnk_properties.png"/></p>
<p>My next attempt was to use the Task Scheduler:</p>
<p><img alt="" loading="lazy" src="/writing/run_as_admin_on_login/tasksched_1a.png"/></p>
<p><img alt="" loading="lazy" src="/writing/run_as_admin_on_login/tasksched_1b.png"/></p>
<p><img alt="" loading="lazy" src="/writing/run_as_admin_on_login/tasksched_1c.png"/></p>
<p>This worked, but the problem was that the task would be permanently stuck in the "task is currently running (0x41301)" state. So, I instead told the task scheduler to start cmd.exe with a command that immediately launches the real target program:</p>
<p><img alt="" loading="lazy" src="/writing/run_as_admin_on_login/tasksched_2.png"/></p>
<p>This solved the state problem because the cmd.exe finishes immediately, and that's all the task cares about.</p>
<p>The final problem was that the program would become slower and slower and slower over time. After a day of computer uptime, the program would be unusably slow. I found the solution to this problem <a href="https://vnote42.net/2021/04/29/windows-scheduled-tasks-get-slower-over-time/">here</a>, which explains that scheduled tasks are started with below normal process priority. The fix (copied here for preservation) was:</p>
<ol>
<li>Export the task to an xml file.</li>
<li>In that xml file, replace <code>&lt;Priority&gt;7&lt;/Priority&gt;</code> with <code>&lt;Priority&gt;4&lt;/Priority&gt;</code> and save it.</li>
<li>Delete the task from the Task Scheduler UI.</li>
<li>Re-import the task from the xml file.</li>
</ol>
<p><a class="footnote_text" data-index="1" href="#footnote_link_1" id="footnote_text_1">[1]</a> <code>%appdata%\Microsoft\Windows\Start Menu\Programs\Startup</code></p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/run_as_admin_on_login/run_as_admin_on_login.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/aa92a34d060aecd1d17abb63d84508ecef000fff"><time datetime="2022-02-21T14:25:01-08:00">2022-02-21</time> Add run_as_admin_on_login.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


guid: aa6f5dfae739d2b628a4916660fecc790aaaf856/advertixing
title: Advertising
url: https://voussoir.net/writing/advertixing
feedurl: https://voussoir.net/writing/writing.atom
content_mime_type: text/html
content:
            
            <article>
<p><a href="/writing">Back to writing</a></p>

<p><a class="tag_link" data-qualname="life" href="/writing/tags/life">[life]</a></p>
<h1>Advertising</h1><ol id="table_of_contents">Table of contents<li><a href="#introduction">Introduction</a></li><li><a href="#types_of_advertisements">Types of advertisements</a></li><li><a href="#the_damage_of_advertisements">The damage of advertisements</a><ol><li><a href="#the_basics_of_capitalism">The basics of capitalism</a></li><li><a href="#breakdown_of_conventional_incentives_distortion_of_metrics_clickbait">Breakdown of conventional incentives &amp; distortion of metrics (&amp; clickbait)</a></li><li><a href="#manipulation_asymmetric_information_budgets">Manipulation &amp; asymmetric information &amp; budgets</a></li><li><a href="#tracking_targeted_ads">Tracking &amp; targeted ads</a></li><li><a href="#jevons_paradox">Jevons paradox</a></li><li><a href="#slapping_everyone_once">Slapping everyone once</a></li><li><a href="#destruction_of_public_spaces_race_to_the_bottom">Destruction of public spaces &amp; race to the bottom</a></li><li><a href="#stifling_of_expression_and_choice_to_match_the_sponsors">Stifling of expression and choice to match the sponsor's</a></li><li><a href="#if_youre_not_paying_youre_the_product">If you're not paying, you're the product</a></li><li><a href="#if_youre_paying_youre_still_the_product">If you're paying, you're still the product</a></li><li><a href="#spam_your_life_as_an_arms_race">Spam: your life as an arms race</a></li></ol></li><li><a href="#arguments_against_ads">Arguments against ads</a><ol><li><a href="#not_every_jobs_a_living">Not every job's a living</a></li><li><a href="#without_adsupported_content_would_there_be_any_content">Without ad-supported content, would there be any content?</a></li><li><a href="#you_paid_for_the_ads">You paid for the ads</a></li></ol></li><li><a href="#unspoken_agreement_between_publishers_and_visitors">Unspoken agreement between publishers and visitors</a></li><li><a href="#hailcorporate">HailCorporate</a></li><li><a href="#hall_of_shame">Hall of shame</a></li><li><a href="#enacting_change">Enacting change</a></li><li><a href="#my_virtues">My virtues</a></li><li><a href="#conclusion">Conclusion</a></li></ol>
<p>You can listen to this article. FLAC, about 350 MiB. <a href="https://files.voussoir.net/writing/advertixing/advertixing.flac">Download</a>.</p>
<audio controls="" src="https://files.voussoir.net/writing/advertixing/advertixing.flac"></audio>
<h2 id="introduction">Introduction<a class="header_anchor_link" href="#introduction"> (§)</a></h2>
<p>Every once in a while, someone will ask me "have you seen that commercial about..." and my response is almost always "no". I haven't seen that commercial. I do my best to not see any commercials.</p>
<p>Throughout this article I will use the term "adblock" as a common noun, not a proper noun. I am not referring to any particular adblocker and <a href="https://old.reddit.com/r/privacy/comments/bvj5nj/use_ublock_origin_not_adblock/">certainly not the one by the name of Adblock</a> or <a href="https://news.ycombinator.com/item?id=12487307">Adblock Plus</a>. Today, <a href="https://github.com/gorhill/uBlock">uBlock Origin</a> is widely accepted as the best adblocker, but this will of course change <a href="https://en.wikipedia.org/wiki/Ozymandias">with time</a>. This article contains some external links. Make sure to install an adblocker before clicking on any of them.</p>
<p>I will mostly be talking about advertising over the internet, because that's the medium where I have the most knowledge and experience. I don't watch TV or listen to the radio. There are too many ads there.</p>
<p>The URL for this article is <code>advertixing</code> because when it was called <code>advertising</code>, the inlined images were being adblocked by <code>/advertising/*</code> URL pattern matchers. Ha.</p>
<p>This article has been a work in progress for a very long time, so some references to supposedly current events may seem a bit temporally challenged.</p>
<h2 id="types_of_advertisements">Types of advertisements<a class="header_anchor_link" href="#types_of_advertisements"> (§)</a></h2>
<p>In some sections of this article, I criticize the advertisers who create ads, and in others I criticize the publishers who publish those ads in exchange for money. The incentives and issues surrounding each are different and I'll try to make it clear which one I'm referring to, but in my blind rage I'm sure I'll switch topics without mentioning it. Let's start by defining what we're dealing with.</p>
<p>I find that advertisements can be separated into three broad categories by their mode of propagation:</p>
<ol>
<li><p><strong>Sponsorship</strong>, in which a product seller pays a publisher to publish ads about their product. This is a very traditional and straightforward kind of ad.</p>
<p>This includes the ads you see on TV, radio, magazines, newspapers, web sidebars, headers, popups, in apps, as <a href="https://en.wikipedia.org/wiki/Product_placement">product placement</a>, and as <a href="https://en.wikipedia.org/wiki/Pre-installed_software">bloatware</a>. This does not include first-party upsells or encouragements to upgrade to the premium edition of something you already have.</p>
<p>Sponsorship advertisements might be explicitly labeled, or they might be hidden amongst regular content so that you don't realize you're being advertised to. The second is more lucrative though FTC regulations against them exist.</p>
<p><img alt="Illustrated diagram depicts a person reading an article. Following the arrows in the diagram, we see the article is composed of a draft from a Publisher with a blank space in it, and an advertisement from the Advertiser that goes into the space. The Advertiser gives money to the Publisher." loading="lazy" src="/writing/advertixing/sponsorship.png"/></p>
</li>
<li><p><strong>Spam</strong>, in which a product seller self-publishes ads for their product in spaces where ads don't belong <a class="footnote_link" data-index="1" href="#footnote_text_1" id="footnote_link_1" title="[1] as if they belong anywhere amirite">[1]</a> and without getting permission from the owner of the space.</p>
<p>This includes uninvited email and phone calls and private messages, self-promotional forum posts, SEO keyword abuse, fliers stuck under your windshield wipers, door-to-door salesmen, and solicitors outside grocery stores.</p>
<p>Colloquially, one might include first-party upsells, because they're annoying and feel like spam, but I think it depends whether they intrude into your personal space, such as a spam email appearing in your inbox, or occur within the first-party's space, such as a banner on their webpage. You are allowed to always hate upsells but that doesn't mean they are always spam.</p>
<p>Most spammers are cowards. They won't own up to their actions. They'll say "I'm not spamming, I'm just letting you know about this cool new thing".</p>
<p><img alt="Illustrated diagram depicts a person receiving emails from several other people. But, they also receive a spam email from an Advertiser." loading="lazy" src="/writing/advertixing/spam.png"/></p>
</li>
<li><p><strong>Chumps</strong>, publishers who discuss a product and give it ad-like publicity without compensation from the seller because they think they can use it to attract an audience of their own, usually because the product is currently a hot topic. This is different from word of mouth because the chump isn't actually passionate about the product, and may not even have it. The chump probably gets their income from other sponsors unrelated to the product in question, or by selling their own product.</p>
<p>This includes bloggers, reviewers, and opinionators discussing new products, press releases, scandals, speculation, leaks, and hype. Product sellers can intentionally create scandals or leaks to get free advertising from chumps. Check out <a href="https://www.youtube.com/watch?v=Ns8ydpZ5-4o&amp;t=8m03s" title="Escobar Responds! A PSA (2020-05-29)">this MKBHD video</a> where he calls out chump media outlets giving free attention to a certain scandalous device, which I am now ironically propagating by showing it to you. inb4 <a href="https://www.youtube.com/watch?v=bATUW8G2ONE" title="iPhone 12: What to Expect! (2020-07-07)">MKBHD also speculates</a>. Chumps will often regurgitate basic product information instead of forming their own opinions. Also keep an eye out for product reviews released too quickly after the product's launch, which indicates it was an embargoed job or the reviewer simply spent no time with it.</p>
<p><img alt="Illustrated diagram depicts a person curious about a brand or product. The Publisher has lots to say about that brand as well as others, and adds some advertisements into the mix. The Advertiser gives money to the Publisher." loading="lazy" src="/writing/advertixing/chumps.png"/></p>
<p>I feel that I need to give a concrete example of chumping to make my definition clear, so I'll continue with MKBHD because I can still positively say that I respect his work and I watch what he makes <a class="footnote_link" data-index="2" href="#footnote_text_2" id="footnote_link_2" title="[2] This paragraph applies to the majority of hot-topic reviewers, I just don't watch very many of them. I like that MKBHD does get into industry critique and Youtube critique from time to time, but I'm sure the chump videos are better at paying the bills.">[2]</a>. He releases lots of videos after spending only a week with a product, and the release of the video is often clearly aligned with an embargo. This means the company has sent its products to many different reviewers and told them not to publish their reviews until a certain date. So, the review doesn't come from a place of genuine personal interest in the product; the companies are using him as part of their scheduled marketing. These products attract viewers to his channel because they are new and hot, but he isn't getting paid cash by the likes of Samsung (probably) — he performs ad segments for <a href="https://www.youtube.com/watch?v=vax8FCuQUsE&amp;t=2m46s" title="Galaxy S22 Impressions / sponsored by Morning Brew">other sponsors</a>. The end result is that the viewer is being double-advertised to: they get to hear the product's basic specsheet read aloud to them with only superficial opinionation, then hear from another sponsor on top of that.</p>
<p>Sellers are incentivized to put chumps on embargoes because a single, big wave of marketing that gets everybody talking is more effective than the slow trickle that would come from reviewers finishing their work over weeks and months. Chumps are incentivized to participate in embargoes because if they miss the wave, the audience will have already had their fill of hearing about that product.</p>
<p>Rushing a review to meet the embargo deadline is one thing, but the chumps who do "breakdowns" of press releases, advertisements, and marketing copy are undoubtedly on an even lower rung.</p>
</li>
</ol>
<p>The majority of this article deals with sponsorship advertisements because they are the most systemically accepted of the three. Consider:</p>
<ul>
<li><p><strong>There's as not much to say about spam</strong>. Everybody already hates spam. This article is about systemic problems with advertisements and spam is built upon the abuse of systems by definition. Discussing the problems with spam is like discussing the problems with homicide. It's not systemically accepted but occurs anyway. Spam will exist as long as <del><a href="https://www.youtube.com/watch?v=9NZDwZbyDus" title="Meet the Sniper">there's two people left on the planet</a></del> popular systems and spaces exist. Spam can only be countered with diligent policing by the owner of the space, or by convincing the spammer to repent. Good luck with that. Sponsorship, on the other hand, exists comfortably within the system. I dedicate <a href="#the_problem_with_spam_your_life_as_an_arms_race">one section of this article</a> to spam but otherwise I don't have much to say about spam except that I hate it too.</p>
</li>
<li><p><strong>Chumps usually rely on sponsorships to do what they do</strong>. There is not much need for me to discuss chumps because if we could eliminate sponsorships, we'd bring the majority of chumps down at the same time. By my definition, chumps are not actually interested in the product, they only talk about it to get attention, clicks, and ad views. Without sponsorships to make chumping worthwhile, most chumps would quit. Only those who sell their own product would continue, and I believe that to be a minority.</p>
</li>
</ul>
<p>As such, of these three kinds of advertisements, sponsorships are the ones that I find most worth writing about.</p>
<p><strong>Glossary</strong>:</p>
<ul>
<li>Product seller: People who make and sell some product or service to customers as their main source of income.</li>
<li>Publisher: Websites, TV channels, radio stations, newspapers, app developers, storefront owners, social media creators et al. who create media or own a space. For my purposes this would also include performers, racecar drivers, and other personalities who promote a brand, even though we wouldn't normally call them publishers. The space they are selling is their body, image, and reputation.</li>
<li>Sponsor, advertiser: A product seller who pays a publisher to show ads for their product in the publisher's space.</li>
</ul>
<p><a class="footnote_text" data-index="1" href="#footnote_link_1" id="footnote_text_1">[1]</a> as if they belong anywhere amirite</p>
<p><a class="footnote_text" data-index="2" href="#footnote_link_2" id="footnote_text_2">[2]</a> This paragraph applies to the majority of hot-topic reviewers, I just don't watch very many of them. I like that MKBHD does get into <a href="https://www.youtube.com/watch?v=a6zvvlrd-jw" title="The Electric Car Pre-Order Problem">industry critique</a> and <a href="https://www.youtube.com/watch?v=1Cw-vODp-8Y" title="YouTube comment impersonation spam">Youtube critique</a> from time to time, but I'm sure the chump videos are better at paying the bills.</p>
<h2 id="the_damage_of_advertisements">The damage of advertisements<a class="header_anchor_link" href="#the_damage_of_advertisements"> (§)</a></h2>
<h3 id="the_basics_of_capitalism">The basics of capitalism<a class="header_anchor_link" href="#the_basics_of_capitalism"> (§)</a></h3>
<p>Capitalism is a complicated topic. The core principles are pretty simple and don't sound inherently malicious, at least to me. Sellers try to sell for the highest price they can, buyers try to buy for the lowest, and everybody either strikes a deal they're satisfied with or goes home empty-handed. Beyond the essentials of <a href="https://en.wikipedia.org/wiki/Maslow%27s_hierarchy_of_needs">food, water, and shelter</a>, the human as animal doesn't technically need very much, and the worst that can happen in most transactions is disappointment.</p>
<p>Sellers do research to learn buying habits, buyers do research to learn of alternative sellers and price points. Sellers don't necessarily need to have the absolute highest quality product on the market, they just need to hit a good quality-per-price ratio, or value, to accommodate different segments of the market: some buyers are professionals who need the best quality tools and will pay a lot for them, other buyers just need something that works well enough.</p>
<p>When a person decides to start selling products, they start from a position where nobody else knows they exist. Sellers advertise so that they can enter the buyer's decision-making process, and if they're better than the competition they'll rightfully win the sale. Competition drives sellers to innovate, lest they stagnate and be undercut or outperformed by new sellers. The result is a continuous progression of higher quality products at lower prices, and a steady churn of advertising along the way.</p>
<p>If I lived in the era where advertisements were barely more than hand-painted signs like "Visit Farmer John's farm for some tasty corn", I wouldn't mind them very much. It's fair to say that if Farmer John didn't make the sign, I might not know I could buy corn from him. His corn may in fact be the best in town, so I'll be glad to have learned of it. When I watch movies or see pictures of the wild west, with towns popping up along unpaved roads, I am sometimes jealous of how simple their economy seems. They weren't blasted with advertisements over radio and television and the internet, they heard from their neighbors and whoever came through town.</p>
<p><img alt="Still frame from a Western film. A horse-drawn wagon rides along a dirt road that stretches to the horizon. On one side of the road there are four small wooden buildings and two covered tents. The other side of the road is empty land." loading="lazy" src="/writing/advertixing/buck_and_the_preacher.jpg"/></p>
<p>Then again, this is exactly when <a href="https://en.wikipedia.org/wiki/Snake_oil">snake oil</a> entered our vernacular, so now I'm doubting myself about that!</p>
<p>Indeed, it seems that these basics of capitalism do "work", in the sense that right now I can buy a computerized internet-connected device with only a day's wage, which is truly a feat of humanity. Products improve and prices drop. So although I hate advertisements as they exist today, it's hard for me to say that the deepest, fundamental notion of advertising is inherently malicious. It is not wrong for a furniture maker to want to sell his furniture, I don't think.</p>
<p>You can consider this article to be a Capitalism sequel to my <a href="/writing/complicated_topics_insurance">Insurance</a> article: the primordial elements of Capitalism seem reasonable, but the current state of affairs is objectionable. Maybe there is a level at which advertising can be called a force for good. But things change when we reach the scale of multi-billion dollar global companies and their ads, and they've ruined it for everyone.</p>
<p><img alt="Sonic the Hedgehog helpfully reminds us that there is no such thing as ethical consumption under capitalism." loading="lazy" src="/writing/advertixing/sonic.jpg"/></p>
<h3 id="breakdown_of_conventional_incentives_distortion_of_metrics_clickbait">Breakdown of conventional incentives &amp; distortion of metrics (&amp; clickbait)<a class="header_anchor_link" href="#breakdown_of_conventional_incentives_distortion_of_metrics_clickbait"> (§)</a></h3>
<p>According to the basic principles of capitalism, sellers should try to sell high quality products because the only way to get the money out of the customer's pocket is to have the best quality-per-price ratio on the market. Capitalist competition is grounded in this. When a company makes its money through goods-for-money transactions, we'd expect them to try making a good product.</p>
<p>But that's hard :(</p>
<p>What if you could just skip the customers? What if the money could come from somewhere besides the customer? By displaying a sponsor's advertisement alongside your product, you can earn more money without having to make your product better. You might be able to reduce the price of your product to attract a wider range of customers, netting overall higher sales. If the sponsor pays you enough, you might even be able to offer the product to the customer for the irresistible price of <em>free</em>. And if it's free, then the quality-per-price ratio becomes a division by zero and the fundamentals of capitalism implode. Suddenly, all levels of quality are functionally equivalent. The quality of the product is now irrelevant, detached from the means of income.</p>
<p>If the product seller wants to increase their income, increasing the quality of the product won't help anymore. All they can do is try to show the sponsor's ads to more and more people. That means the seller has just pivoted their entire business model away from creating their actual product towards reaching more eyeballs. This shift is much bigger than most realize — reaching eyeballs is an entire industry of its own: it's called the media. Whatever you thought your business was can go right out the window, because you're a media production house now and you're competing with the likes of Hollywood in the quest to reach more eyeballs.</p>
<p>You might be thinking that the quality of the product still comes into play because if two competing products are both free-with-ads, the customerbase will still gravitate towards the better one, thus rewarding it with more sponsorship money and longevity. The end result could be just as if the customers had paid for it themselves, just <a href="https://www.youtube.com/watch?v=50R21mblLb0" title="The Attention Economy - Will Schoder">using their eyeballs instead of their wallets</a>.</p>
<p>There are some cases where this doesn't work at all because of network effects or surrounding ecosystems. Users don't want to join the most technically superior social network, because their friends are on the old one. Users don't want to switch to the most technically superior spreadsheet tool, because there are lots of video tutorials about the old one.</p>
<p>There are other cases where it does work — but only briefly — because the better product is coming from a young and idealistic company that hasn't fully realized the consequences of their recent pivot into the media production industry. Young companies, especially those with angel investors, can undercut the incumbents because they're willing to operate at a loss in an attempt to fast-track their market share. But when it comes time for them to start returning on their investments, they realize they need to start recouping their costs via sponsorships and they become just like the incumbents they destroyed. See how imgur.com took over the image hosting space with their easy UI and straightforward hotlinking. Now, they are "Your upload will resume after this ad, or press ESC", impossible to visit hotlinks without getting redirected to the webpage, pushing you to <a href="/writing/view_in_app">download the app</a>. Like ImageShack before it, Imgur has gone downhill and is ready to be replaced by a new starry-eyed image host destined to repeat the process. Some day, Imgur will die, and its in wake will be millions of image links that no longer work. Free-with-ads products live on a treadmill and the entire internet suffers for it. If there's anything on the internet that you might want to access again in ten years, I'd suggest you buy a nice big hard drive and start downloading it now while you can.</p>
<p><a href="https://en.wikipedia.org/wiki/Goodhart%27s_law">Goodhart's Law</a> says "When a measure becomes a target, it ceases to be a good measure". We've all seen this: people who split one task into many small ones so they can say they did many tasks; students who increase the font size on their essay so they can hit the minimum page requirement more easily; programmers who <a href="https://news.ycombinator.com/item?id=28998374">close bug reports</a> without fixing them to keep the issue count low; Youtubers who fluff up empty ideas into 10+ minute videos for algorithm <a href="https://www.youtube.com/watch?v=Gi6FcI2wFrw" title="RubberNinja - Does Independent Animation Have a Future on YouTube?">favorance</a>; entrepreneurs who cash in on <a href="https://en.wikipedia.org/wiki/Cobra_effect">dead-cobra bounties</a> by breeding more cobras to kill, or, rather, <a href="/writing/advertixing/guardian_3d_gun_buyback.html">3D-printing gun parts to sell at buybacks</a>. People in general are very adept at exploiting these kinds of opportunities and, as <a href="https://en.wikipedia.org/wiki/Game_theory">game theory</a> will tell you, it'd be silly not to.</p>
<p>See <a href="https://en.wikipedia.org/wiki/Cost_per_impression">cost per impression</a> (CPI). An Impression is when a person sees an advertisement, and the CPI is the dollar amount the sponsor pays the publisher for those. And you better believe that for the publishers, increasing impressions can easily become the top — or only — priority. Every day, the publisher has to choose between improving its product or finding new ways to reach eyeballs for its sponsors. One of these has direct financial incentive and the other doesn't. In order to increase the number of impressions, the publisher must increase page visits, video views, minutes spent on site, density of advertisement amongst regular content, etc. Attention is turned towards questions like:</p>
<ul>
<li>How can we keep people coming back?</li>
<li>How can we make them stay longer?</li>
<li>How can we make them share with their friends?</li>
<li>How many ads can we show them before they get too annoyed and leave?</li>
</ul>
<p>The answers to these questions are usually along the lines of:</p>
<ul>
<li>Add an "infinite scroll" to reduce the friction of staying on site.</li>
<li>Use enticing thumbnails and hero images to bring attention to content that can't otherwise earn it on its own.</li>
<li>Promote harmless, easy, cute, emotional, sexy, and, above all, Like-able content over serious, contemplative, or deep reading.</li>
<li>Cater to the lowest common denominator so that every piece of content can reach a maximum number of eyeballs instead of wasting time on small audiences.</li>
<li>Outrage, scandals, and exposés are all good too, as long as they are easy and shallow and free of nuance, because people <a href="https://www.youtube.com/watch?v=rE3j_RHkqJc" title="This Video Will Make You Angry - CGP Grey">click on more things when they're fired up</a>.</li>
<li>Hide advertisements within the real content through product placement and so-called <a href="https://en.wikipedia.org/wiki/Native_advertising">native advertising</a> as much as possible.</li>
</ul>
<p>It doesn't matter if you're enjoying yourself or hating every minute of it, just as long as it's a lot of minutes. This is the origin of clickbait.</p>
<p>Businesses love to willingly fall into the Goodhart trap of maximizing engagement and eyeball reachitude because they love seeing pretty graphs that climb every quarter. The other metrics — the ones that are hard to graph — get ignored. Metrics like:</p>
<ul>
<li>Are we bringing people something they can't find anywhere else?</li>
<li>Are we staying true to the vision that we started with?</li>
<li>Are the users who contribute the most to our community going to stick around?</li>
<li>Do people respect us?</li>
</ul>
<p>I will reiterate because it is so important: when a product is free with ads, the fundamental rules of seller competition under capitalism are subverted. The need for a quality product becomes zero, replaced by a need to drive impressions at the cost of anything else.</p>
<p>The software industry is notable for its focus on metrics since it's so much easier to track digital actions than real-life actions <a class="footnote_link" data-index="3" href="#footnote_text_3" id="footnote_link_3" title="[3] At least until face and gait recognition in store security cameras become universal.">[3]</a>, thus metrics are much easier to collect and deify. This is to the detriment of product quality and long term consistency. Engineers (or their bosses) will pick some specific <a href="https://en.wikipedia.org/wiki/Performance_indicator">metric</a> to optimize, beat the hell out of it, and pat themselves on the back until— Wait!, look over there!, we should be optimizing for this other specific metric instead! Look over there!, Apple is doing it this way now! At every step of the way there is a delusion of climbing towards some peak quality or efficiency, when actually it's just going up and down a bunch of separate peaks in a mountain range. I wonder how much is deliberate by engineers who want to stick it to their dumb managers and get a fat paycheck for essentially wasting time, and how much is really, earnestly believed internally. Either way, the user is the guinea pig who has to deal with a product that continues to change and re-prioritize for no good reason.</p>
<p><a class="footnote_text" data-index="3" href="#footnote_link_3" id="footnote_text_3">[3]</a> At least until face and gait recognition in store security cameras become universal.</p>
<h3 id="manipulation_asymmetric_information_budgets">Manipulation &amp; asymmetric information &amp; budgets<a class="header_anchor_link" href="#manipulation_asymmetric_information_budgets"> (§)</a></h3>
<p>We would all like to think that we're immune to the manipulative effects of advertising. That we make our buying decisions only after comparing our options and coming to the best conclusions. That we can see right through the doctored footage, fake food, irrelevant celebrity endorsements, industry buzzwords, and <a href="https://old.reddit.com/r/wheredidthesodago">hopelessly incompetent baboon actors</a>.</p>
<p>What's the longest you've ever spent thinking about a purchase before making it? Try to remember a time when you wanted to buy the most perfect option that would match your needs exactly. Maybe it was a cell phone, or vehicle, or mirrorless camera, or pair of hiking boots. Remember how many searches you did, how many alternatives you compared, how you divided the price by your hourly wage to get a feel for how many work-hours you were about to trade for that item. How many hours of research did you do? One or two? Five or ten? You could answer 100, and I'd believe you.</p>
<p>It doesn't matter, because every single marketer and salesperson who works for the company that sold you the item puts in 8 hours a day, every single day, trying to sell it. Buying products is what you do in your time off. Selling products is what they do for a living. Multiply that by the number of staff on their marketing department and immediately it's clear you're up against quite a force. And this was the exceptional example — what about the other 99% of purchases that you make in life which don't receive even a fraction of that research time? This imbalance of effort is a good first hint that individuals can't expect their buying decisions to ever be perfectly well-informed.</p>
<p>As a buyer, I need to juggle the pros and cons of a million different aspects of a million different products at a million different price points and find where they converge. For every technical detail that I can devote a few minutes or hours of research to, there is someone whose livelihood it is to understand that detail and find the right way to sell it.
How should I feel about <a href="https://en.wikipedia.org/wiki/Dennis_Gonsalves">GMO</a> food?
Does "cage free" necessarily mean the animal is treated well or <a href="https://www.google.com/search?q=cage+free+crowded&amp;tbm=isch">not</a>?
Does this unlocked cell phone support the cellular bands I need for my carrier?
What's the difference between all these <a href="https://www.youtube.com/watch?v=V-jmSjy2ArM" title="Space Heater Nonsense - Technology Connections">space heaters</a>?
What's the relationship between megapixels, sensor size, and f-numbers?
Do I want more cores or more gigahertz?
How many plies do I want in my toilet paper?
What the lux is a lumen anyway?
Is 4k <em>always</em> better than 1080p?
How do I know this hard drive isn't secretly <a href="https://old.reddit.com/r/DataHoarder/comments/gagori/are_there_any_ethical_companies_that_are/">SMR</a>?
My buying energy is spread graphene-thin, but a company's marketing department can focus entirely on selling their product.</p>
<p>Some people are rich enough to have a personal butler wherever they go. But how about a personal psychologist-butler, who can tell you about all the ways the people you interact with are taking advantage of your natural thought processes? Your psychobutler could say Pardon me, Sir/Madam, may I inform you that the small, medium, and large sodas are so close in price so that you <a href="https://en.wikipedia.org/wiki/Anchoring_(cognitive_bias)">focus on the relative deal</a> and not realize it's a total racket no matter what you pick? If I may interrupt, Sir/Madam, the colors used in ads are <a href="https://en.wikipedia.org/wiki/Color_psychology">carefully chosen</a> to push you in the right direction based on research correlating color with emotional response <a class="footnote_link" data-index="4" href="#footnote_text_4" id="footnote_link_4" title="[4] Don't forget to enable grayscale mode on your phone or computer. Look for something along the lines of Settings &gt; Accessibility &gt; Vision &gt; Grayscale, or Settings &gt; Ease of Access &gt; Color Filters &gt; Grayscale.">[4]</a>. Salesmen encourage feelings of urgency with their buy now! last chance! one day only! messaging to prevent you from calmly measuring the sale. Items are priced as $XX.99 so that you mentally round it to $XX.00 instead of $XY.00. The <a href="https://en.wikipedia.org/wiki/Loss_leader">milk is at the back of the store</a> so that you pass by everything else on your way there. Thumbnails with faces, and especially surprised expressions, pique the most interest and clicks. Ads show crowds of people to help induce <a href="https://en.wikipedia.org/wiki/Fear_of_missing_out">FOMO</a> and peer pressure. The free continental breakfast is paid for by the cost of your room. Businesses sell coupon packets where the savings is greater than the cost of the packet, but they make you feel obligated to visit more often to use them up, spending more money than you would have without them <a class="footnote_link" data-index="5" href="#footnote_text_5" id="footnote_link_5" title="[5] Some of you are probably shaking your head at my exasperated presentation of this paragraph. This is Marketing 101 level stuff, everyone knows it, stop sounding so dramatic. So why does it still work on people!">[5]</a>.</p>
<p>Do you have a personal psychobutler? The advertisers do. Teams of them. All working around the clock to find the optimal way to disrespect your decision-making autonomy, because you're an ape with an ape brain and you can be tricked.</p>
<p>I've reached the point that I no longer question business decisions any more. Sometimes I'll see a product that looks stupid, and in the past I would have said "that's stupid, why would they do it like that?". Now, I think "that's stupid, but I guess they think it'll make more money", because that's always the answer. I certainly still spend a lot of time criticizing business decisions, but not questioning them.</p>
<p>That's not to say all companies are perfectly rational, for they too are made of apes. There's quite a bit of cargo-culting and trend-following. Apple removed the headphone jack? Oh my god, we'll look so behind if we don't remove it too! <a class="footnote_link" data-index="6" href="#footnote_text_6" id="footnote_link_6" title="[6] For posterity, here's Samsung's ad mocking Apple for removing the headphone jack, shortly before they removed theirs too.">[6]</a> I've given up on thinking that big companies ever intentionally make anything good <a class="footnote_link" data-index="7" href="#footnote_text_7" id="footnote_link_7" title='[7] I realize this is a No True Scotsman. Any company that does make anything good is simply "not big enough yet".'>[7]</a>. That's just a byproduct when quality accidentally coincides with profit.</p>
<p>As they say, you need to know your limits. I for one recognize that no matter how smart I think I am <a class="footnote_link" data-index="8" href="#footnote_text_8" id="footnote_link_8" title="[8] very">[8]</a>, I do not have the capacity to compete with the behemoth that is modern marketing. I recognize that advertising can influence me even if I don't feel it and can't articulate how. I cannot understand the intricate details of every product well enough to counteract the positive spin that advertisements will always try to place on them.</p>
<p>As such, I am better off cutting advertising out of my life as much as possible, rather than lying to myself that I'm immune. And you are too. People like to think they're not influenced by ads, but if that was true then surely the companies would have given up on making them by now. The industry is foolish, but not that foolish. Avoiding ads doesn't suddenly give me an infinite amount of time to research before buying, but it helps me to start my research from a more objective standpoint rather than being primed by ads.</p>
<p>Hacker News user ineedasername shared his thoughts on some mobile game advertisements:</p>
<blockquote><p>Cunningham's Law states "the best way to get the right answer on the internet is not to ask a question; it's to post the wrong answer."</p>
<blockquote><p>A sort of interesting "corollary" to this is something I've noticed in mobile games with in-app ads for other mobile games:</p>
<p>The best way to attract a player isn't by showing them someone playing well, it's by showing them someone playing very bad.</p>
<p>Because these ads show demo play (usually of puzzles) where the player is making obviously bad decisions, and watching it is sort of like seeing a dozen objects in a row, but one of them is completely askew, and there's an urge to straighten in out a bit.</p>
<p>I only noticed this after seeing a bunch of ads recently for perhaps a dozen different games, and realized that I felt somewhat uneasy when they came on instead of simply impatient, and eventually. I tracked this feeling down to the crappy gameplay phenomenon. And once I realized that was the issue, the unease went away.</p>
<p>Further reflection made me realize I'd been much more tempted to download those games to "do it right" than other random games that didn't seem to use this tactic. It was actually when I broke and was about to download one that I had the realization, basically "this game looks awful and tedious, why am I about to download it?"</p>
<p><a href="https://news.ycombinator.com/item?id=30523075">https://news.ycombinator.com/item?id=30523075</a></p>
</blockquote>
</blockquote>
<p>macksd shares his children's reaction to TV commercials:</p>
<blockquote><p>We went quite a few years without ever seeing cable. My kids would stream shows and consume other media on-demand, but any advertising was minimal and fairly non-intrusive. And then they were watching a kids show at a hotel once and the ads came on and the effect it had on them was crazy. They suddenly desperately needed all the toys in the commercials and were repeating catch phrases from ads after only seeing them a couple of times. The contrast in their behavior was insane. And they HAD to keep watching it like I hadn't seen before.</p>
<p><a href="https://news.ycombinator.com/item?id=30430324">https://news.ycombinator.com/item?id=30430324</a></p>
</blockquote>
<p>David Foster Wallace comments on advertisements that make fun of advertisements:</p>
<blockquote><p>Isuzu Inc. hit pay dirt with its series of "Joe Isuzu" spots, featuring an oily, Satanic-looking salesman who told whoppers about Isuzus' genuine llama-skin upholstery and ability to run on tap water. Though the ads rarely said much of anything about why Isuzus are in fact good cars, sales and awards accrued. The ads succeeded as parodies of how oily and Satanic car commercials are. They invited viewers to congratulate Isuzu ads for being ironic, to congratulate themselves for getting the joke, and to congratulate Isuzu Inc. for being "fearless" and "irreverent" enough to acknowledge that car ads are ridiculous and that the Audience is dumb to believe them. The ads invite the lone viewer to drive an Isuzu as some sort of anti-advertising statement. The ads successfully associate Isuzu-purchase with fearlessness and irreverence and the capacity to see through deception.</p>
<p><a href="/writing/advertixing/e_unibus_pluram.html">E unibus pluram (1993)</a></p>
<p><a href="https://www.youtube.com/watch?v=nJMq_7alQpU">https://www.youtube.com/watch?v=nJMq_7alQpU</a> <a class="footnote_link" data-index="9" href="#footnote_text_9" id="footnote_link_9" title="[9] Notice that Joe Isuzu fires the whole bullet. That's 65% more bullet per bullet.">[9]</a></p>
</blockquote>
<p>Please do yourself a favor and read E unibus pluram in its entirety!</p>
<p><a class="footnote_text" data-index="4" href="#footnote_link_4" id="footnote_text_4">[4]</a> Don't forget to enable grayscale mode on your phone or computer. Look for something along the lines of Settings &gt; Accessibility &gt; Vision &gt; Grayscale, or Settings &gt; Ease of Access &gt; Color Filters &gt; Grayscale.</p>
<p><a class="footnote_text" data-index="5" href="#footnote_link_5" id="footnote_text_5">[5]</a> Some of you are probably shaking your head at my exasperated presentation of this paragraph. This is Marketing 101 level stuff, everyone knows it, stop sounding so dramatic. So why does it still work on people!</p>
<p><a class="footnote_text" data-index="6" href="#footnote_link_6" id="footnote_text_6">[6]</a> For posterity, here's <a href="https://www.youtube.com/watch?v=wQ4ys-R1B_8">Samsung's ad mocking Apple for removing the headphone jack</a>, shortly before they removed theirs too.</p>
<p><a class="footnote_text" data-index="7" href="#footnote_link_7" id="footnote_text_7">[7]</a> I realize this is a No True Scotsman. Any company that does make anything good is simply "not big enough yet".</p>
<p><a class="footnote_text" data-index="8" href="#footnote_link_8" id="footnote_text_8">[8]</a> very</p>
<p><a class="footnote_text" data-index="9" href="#footnote_link_9" id="footnote_text_9">[9]</a> Notice that Joe Isuzu fires the whole bullet. That's 65% more bullet per <a href="https://www.youtube.com/watch?v=6i-nMWgBUp0" title="Aperture Investment Opportunity #3: Turrets - Valve, Portal 2">bullet</a>.</p>
<h3 id="tracking_targeted_ads">Tracking &amp; targeted ads<a class="header_anchor_link" href="#tracking_targeted_ads"> (§)</a></h3>
<p>When a publisher puts ads on their website, how should they get paid? Is it enough to tell their sponsor "we had X,000 visitors who spent YY,000 minutes on the site"? The sponsor is unlikely to <a href="https://www.youtube.com/watch?v=zONW46d50A0" title="Eric Andre - Harry's Car Place">trust like that</a>. The reality of web advertising is that the publisher will have to include a javascript package served by the advertiser so that the advertiser can see for themselves how many impressions they're making. We affectionately refer to these as "trackers" while we block them and curse their existence.</p>
<p>When two different websites use the same advertising package — take Google AdSense for example — then the advertiser Google will know that you visited both sites. So although each individual website cannot follow you around the internet on their own, they can aid Google in doing so by linking AdSense to their page. The more websites that use AdSense, the more eyes Google will have into your life, your browsing habits, your interests, your race and gender and sexuality, your purchases, your political affiliations. Like if every time you went to visit a friend's house, you found that some other dude with a clipboard had also been invited.</p>
<p><img alt="Illustrated diagram depicts a person visiting two different websites. Arrows drawn from the person to the website represent the HTTP requests. Along the way, the arrows branch off, so that both arrows are also redirected to the Advertiser in addition to their original destination." loading="lazy" src="/writing/advertixing/advertiser_tracking.png"/></p>
<p>The vague concept of web tracking has become widely known in the past few years, but I think the specifics of how it works have not. Let's make this perfectly clear: the only reason advertisers are able to follow you around the internet is because all of the websites you visit are inviting them in. You are on a daily basis being betrayed by almost everyone who has even the slightest financial incentive to betray you. They will sell you off for a single cent, because $0.01 is bigger than $0.00. Why do you tolerate this? When Google tracks you, you must blame more than just Google, you must blame every single webpage that invited Google into the session.</p>
<p>In 2018, the <a href="https://gdpr.eu/">GDPR</a> went into effect. The General Data Protection Regulation, from the European Union, is a set of rules and regulations surrounding user privacy on the internet, and the storage of personally identifying information by website operators. Although the GDPR is an EU regulation, the effects are felt internationally since most companies want the opportunity to do business in as many markets as they can. Compliance with the GDPR means, for example:</p>
<ul>
<li>Users should be able to request a download of any personal information the website is storing about them.</li>
<li>Users should be able to request that the website delete any personal information about them — that is, truly delete, not just hide from the public.</li>
<li>Users should be made aware, in advance, that their data is being collected and what it will be used for.</li>
<li>Users should be able to opt out of non-essential data collection.</li>
</ul>
<p>And that brings us to cookies. Of the GDPR's effects, the rise of the "cookie banner" is certainly the most prominent and recognizable by the average person even if they don't know its background.</p>
<p>Cookies are small pieces of information that the website sends to your computer, and asks your computer to hold on to, so that it can recognize you next time you come back. The cookie is your way of saying "hey, it's me again" and have <a href="/writing/advertixing/RFC2109.html">long been used</a> to maintain account logins, settings, and shopping carts. Cookies are very helpful.</p>
<p>They have also been used for tracking and advertising. When a publisher invites an advertiser's javascript package onto their webpage, that javascript package will leave behind cookies so that when I leave website1.com and go to website2.com, the advertiser can see that I am the same person. By correlating my various interests with statistics from the rest of their tracked population, they can decide what type of advertisement is most likely to convince me to buy their product, and show me that one.</p>
<p>The GDPR did not invent the cookie, nor did it invent tracking, but by requiring websites to disclose the fact that the user is being tracked, it essentially invented the cookie banner. Six years down the road, I'm sick of cookie banners, <a href="/writing/advertixing/i-dont-care-about-cookies.eu.html">you're sick of cookie banners</a>, and we're all sick of the cutesy cookie graphics they put on them.</p>
<p><img alt="By clicking 'accept all cookies', you agree Stack Exchange can store cookies on your device and disclose information in accordance with our cookie policy." loading="lazy" src="/writing/advertixing/stackexchange_cookies.png"/></p>
<p>You will have noticed that a large percentage of cookie banners out there have one great big button for "accept all", because this is the advertiser's preferred choice; and another, smaller, less contrasty and less prominent button for "customize" or "configure". And that the even the customization menu is loaded with <a href="https://en.wikipedia.org/wiki/Dark_pattern">dark patterns</a> and guilt-trip language like "we're using cookies to improve your experience".</p>
<p><img alt="When you click 'Accept all' cookies, Aarhus University can give you the best user experience." loading="lazy" src="/writing/advertixing/aarhus_cookies.png" title="Notice how even when the user is in the configuration menu, the 'accept all' button has more prominence than the button that confirms the user's actual choices"/></p>
<p>Don't you wish cookie banners would just go away already? Oh, but wait, we never actually needed them in the first place:</p>
<blockquote><p>Strictly necessary cookies — These cookies are essential for you to browse the website and use its features, such as accessing secure areas of the site. Cookies that allow web shops to hold your items in your cart while you are shopping online are an example of strictly necessary cookies. These cookies will generally be first-party session cookies. While it is not required to obtain consent for these cookies, what they do and why they are necessary should be explained to the user.</p>
<p><a href="https://gdpr.eu/cookies/">https://gdpr.eu/cookies/</a></p>
</blockquote>
<p>The GDPR does not require the user to be prompted for cookies that are necessary for the website to work. Let that sink in for a moment. Every single cookie banner you've encountered since 2018 has been a self-admission of nonessential tracking and advertising by the operator, standing between you and the actual reason you went to the website in the first place, because their opportunity to make $0.01 was more important than producing a site or publication that is pleasant to read and use. Didn't you say you're doing this to <a href="https://www.youtube.com/watch?v=YWdD206eSv0" title="You really think someone would do that? Just go on the internet and tell lies?">improve my experience</a>?</p>
<p>And whenever you see a cookie banner that starts with the phrase "Because we respect your right to privacy, ...", just remember that they don't actually respect you enough to stop sending you trackers. That would just be too easy. They'd rather moan and whine about how the GDPR forced their hand into adding this big annoying cookie banner and there was just no other way, we're so sorry you have to deal with it. Indeed, these kinds of cookie banners can be considered a form of <a href="https://en.wikipedia.org/wiki/Malicious_compliance">malicious compliance</a> — if the website can convince you that a banner is required for all forms of cookies and that the law is to blame, they can sway public opinion against the legislature. The big bad government is the one ruining your web browsing experience, not us. Contact your representatives and get them to repeal GDPR so we can go back to sending you all of our trackers without telling you, the way it used to be.</p>
<p><img alt="" loading="lazy" src="/writing/advertixing/becausewerespectyourrighttoprivacy.png"/></p>
<p>If the user declines the tracking cookies, you can punish them by showing them the banner every time they come back, until they give up and accept (or block the element with their adblocker). If you wanted the "don't show me the banner again" cookie to persist, you should have enabled cookies! Bwahahahahaha.</p>
<p>Ok, that's enough about cookies. If you're interested in the topic of targeted advertising, you've probably already heard the apocryphal story about, appropriately, Target <a href="/writing/advertixing/nyt_target_story.html">inadvertently outing a young pregnant girl</a> by sending maternity-related coupons to the family's home:</p>
<blockquote><p>"My daughter got this in the mail!" he said. "She's still in high school, and you're sending her coupons for baby clothes and cribs? Are you trying to encourage her to get pregnant?"</p>
<p>The manager didn't have any idea what the man was talking about. He looked at the mailer. Sure enough, it was addressed to the man's daughter and contained advertisements for maternity clothing, nursery furniture and pictures of smiling infants. The manager apologized and then called a few days later to apologize again.</p>
<p>On the phone, though, the father was somewhat abashed. "I had a talk with my daughter," he said. "It turns out there's been some activities in my house I haven't been completely aware of. She's due in August. I owe you an apology."</p>
</blockquote>
<p>Like an Aesop fable for the ethically bankrupt, the moral of the story is given here:</p>
<blockquote><p>We started mixing in all these ads for things we knew pregnant women would never buy, so the baby ads looked random.</p>
<p>As long as a pregnant woman thinks she hasn't been spied on, she'll use the coupons.</p>
</blockquote>
<p>I think the Target story is fake, or greatly enhanced, but nevertheless it has become extremely well known. It has surely sparked the imagination of many an advertiser and thus contributes to the advertising landscape today. Any competent advertiser who is accurately tracking you will be sure to recover their plausible deniability by adding noise, thanks in part to this story.</p>
<p>Why do I think the Target story may be false?</p>
<ol>
<li><p>The article cites "an employee who participated in the conversation", so nobody was willing to put their name on these quotes, giving the author free reign to embellish. The tidy plotline and the father's eloquent speech sound like the conceit of an author, though oddly they forgot to mention that he received a <a href="https://old.reddit.com/r/thathappened">round of applause and $100</a> for his humility.</p>
</li>
<li><p>Even if the coupon packets were distributed at random, they're bound to hit this kind of situation at least once with an audience of Target's size. This is a typical statistical "surprise" <a class="footnote_link" data-index="10" href="#footnote_text_10" id="footnote_link_10" title="[10] When you pick a random number between one and one million, do you think it feels lucky?">[10]</a>.</p>
</li>
<li><p>Despite the nonstop development of advertising and machine learning in the years since, this story from 2012 still comes up as the first and often only example of eerily-accurate targeted ads. That would lead me to believe that either the intelligent ads industry hasn't advanced very far since then, or else has advanced so far as to become undetectable with no intermediary standout headlines — every other advertiser instantly skipped to a higher level of competence. The whole <a href="https://old.reddit.com/r/privacy/comments/79jenh/facebook_iphone_listening_into_our_conversations/dp2fm1q/">"cat food"</a> thing came close but I don't think the evidence was very good. Here's a comment by Hacker News user segfaultbuserr:</p>
<blockquote><p>Amazon is a $250 billion dollar company that reacts to you buying a vacuum by going THIS GUY LOVES BUYING VACUUMS HERE ARE SOME MORE VACUUMS</p>
<p><a href="https://twitter.com/kibblesmith/status/724817086309142529">https://twitter.com/kibblesmith/status/724817086309142529</a></p>
<blockquote><p>Everyone thinks this problem is really annoying, but to me it's a good sign - it indicates the current technical capabilities on using and abusing personal information is still limited, the predicted machine learning apocalypse is not here yet. In other words: despite the large quantity of personal information collected by advertisers, they still cannot exploit it efficiently enough, so far all they can do mostly is showing you the same things over and over</p>
<p><a href="https://news.ycombinator.com/item?id=25109026">https://news.ycombinator.com/item?id=25109026</a></p>
</blockquote>
</blockquote>
<p>But maybe that's all part of a larger plot:</p>
<blockquote><p>Let's say you buy a washing machine on Amazon. You're not likely to need more than one. Amazon knows whether you canceled or returned your order.</p>
<p>So the only way it makes any sense is if Amazon is advertising on the chance that you're going to cancel or return it in the future. Amazon certainly has those numbers. But do you think the chance you're going to cancel or return it is so high Amazon should advertise the same product to you instead of something else you might buy?</p>
<p><a href="https://news.ycombinator.com/item?id=23749738">https://news.ycombinator.com/item?id=23749738</a></p>
</blockquote>
</li>
</ol>
<p>In data science, it is common wisdom to collect as much data as you can while you have the chance and filter it down later, because if you don't collect it now you might regret it. A political surveyor could ask you what state you live in so that they can make state-by-state comparisons, but it makes more sense for them to also ask about your city, so they can make intra-state comparisons from the same survey data instead of having to go out and do another survey.</p>
<p>This principle of data collection should not be considered slimy in and of itself. It is simply pragmatic, and applies to all areas: professional photographers tell their cameras to store <a href="https://en.wikipedia.org/wiki/Raw_image_format">raw sensor data</a> instead of jpegs because their editing software can make better changes when it has the raw light and color information, and they can't go back in time to capture that moment again.</p>
<p>The problem is that advertisers haven't really figured out how to deliver on the whole well-targeted ads premise yet, but they're storing absolutely everything they can so they'll be ready for the algorithmic breakthrough if and when it comes. They're like pathological hoarders who keep every single paperclip because "it might come in handy someday", except the paperclip is your mother's maiden name and place of birth.</p>
<p>So if you think targeted advertisements are already accurate beyond detection and advertisers are <a href="https://en.wikipedia.org/wiki/Hypodermic_needle_model">magic-bulletting</a> the population, you have cause for upset. And if you think targeted advertisements are still "buy more vacuums"-level useless, then that means that despite collecting the private details of billions of people's lives over several years, the advertising industry is too pathetically incompetent to make anything of it and is clearly unfit for the responsibility of handling such data in the first place, and you have cause for upset. <a href="https://www.youtube.com/watch?v=ZwMVMbmQBug&amp;t=1m09s" title="I'm as mad as hell and I'm not going to take this any more!">Get upset!</a></p>
<p><a class="footnote_text" data-index="10" href="#footnote_link_10" id="footnote_text_10">[10]</a> When you pick a random number between one and one million, do you think it feels lucky?</p>
<h3 id="jevons_paradox">Jevons paradox<a class="header_anchor_link" href="#jevons_paradox"> (§)</a></h3>
<p>The <a href="https://en.wikipedia.org/wiki/Jevons_paradox">Jevons paradox</a> is when an increase of efficiency leads to an increase of consumption that outweighs the savings. Jevons's original description was of coal: as coal-fired steam engines became more efficient, producing more useful power per weight of coal burned, more people began using the engines and the total consumption of coal went up instead of down. Of course, those engines were used to perform work, so the Jevons paradox does not imply that the consumption is not productive in some way — each individual engine owner would say that the new engines had saved them coal — but the fact remains that the total usage of coal was higher than before.</p>
<p>One of the things we learn from the Jevons paradox is that we are restless creatures, and we are not satisfied with our consumption until we find ourselves bumping into limits. There is much to say about this topic both economically and ecologically, but let's get on to the part about ads.</p>
<p>When the internet was young, data rates were <a href="https://en.wikipedia.org/wiki/Internet_access#Speed">slow</a>. It took minutes to send a megabyte. Most people won't wait minutes to read a webpage, so webpages had to be kilobytes. As internet speeds have gotten faster and faster, the efficiency of bytes transferred per second has increased, and so too has our consumption. Maciej Cegłowski gave a talk called <a href="https://idlewords.com/talks/website_obesity.htm">The Website Obesity Crisis</a> which you can refer to, so I will not belabor this point except to say that even now, in the year of our web 2023, it is all too common for pages on big-name websites to take multiple seconds to fully load and become functional.</p>
<p>Text is quick to download. Pictures are quick to download. By today's standards, even 1080p video is quick to download. We find ourselves bathed in technology that is too efficient for our feeble minds, so we find new ways to slow it down.</p>
<p>One effective technique is to connect the website to a dozen different advertising and tracking services, each of which will launch a series of network requests to separate domains over separate connections, downloading and parsing more and more javascript, adding more and more click handlers and scroll watchers and background processes and over time shooting out countless telemetrics about how engaged you are. That'll do it.</p>
<p><img alt="" loading="lazy" src="/writing/advertixing/washington_post_requests.png"/></p>
<p>People don't want to wait a whole minute for a news article to load, that's much too long. Three seconds is slow, but tolerable to most. One second is better, and it's pretty excellent when a page finishes in under a fifth.</p>
<p><img alt="" loading="lazy" src="/writing/advertixing/hackernews_requests.png"/></p>
<p>But publishers do not strive for excellence. They strive for maximum engagement while maintaining minimally tolerable speed. If they can spend 200 milliseconds sending you meaningful content and 2800 milliseconds sending you ads, they'll do it. All further efficiency gains lead only to more consumption.</p>
<p>I remember when watching videos on the internet meant letting them buffer for thirty seconds since the download was slower than the playback. Now, watching videos on the internet means letting the thirty-second ad play before you can start. Funny how we instinctively hinder ourselves from progress.</p>
<p>As computers have developed over the decades, we've come to expect higher resolution screens, higher fidelity audio and video, and larger storage capacities, but for some reason our tolerance for slow pageloads doesn't seem to crack through this barrier of one to five seconds. There's a level below which people just don't care about an increase in speed, so the publishers are free to use the excess capacity for advertising. You've probably even heard of software that has <a href="/writing/advertixing/atlantic_fake_progressbars.html">fake loading bars</a> added because it gives people confidence that the computer is working. Hardware designers keep producing faster computers, and we are all too happy to squander them.</p>
<h3 id="slapping_everyone_once">Slapping everyone once<a class="header_anchor_link" href="#slapping_everyone_once"> (§)</a></h3>
<p>Here's a quaint documentary from the 1960s called <a href="https://www.youtube.com/watch?v=Lz_q4PxZFxA">Advertising: What it's doing to your life</a> <a class="footnote_link" data-index="11" href="#footnote_text_11" id="footnote_link_11" title="[11] You'll find that the documentary as a whole is apologetic towards advertising, its importance, and how it creates value and jobs. I recommend giving it a watch, but if you were hoping for a progressive anti-advertising message from the 60s, sorry!">[11]</a>. For this section, I want to pull a particular quote:</p>
<blockquote><p>If the product isn't all it's advertised, you'll never buy it again. This is important because it forces the advertised product to maintain a reputation. And any time it fails on quality or value, it loses you and your business. Now that isn't true of an un-advertised product, because it has no reputation to maintain. And it isn't true in the case of an advertised product that only seeks to sell you once.</p>
<p><a href="https://www.youtube.com/watch?v=Lz_q4PxZFxA&amp;t=16m58s">16:58</a></p>
</blockquote>
<p>And comment by Hacker News user WalterBright:</p>
<blockquote><p>I asked the prof who taught my accounting class about his career in used car sales. He said you could tell a good dealer from bad by how long he'd been in business. A good lot will last more than 5 years, because by then he'll be running on repeat business rather than running out of suckers in the community.</p>
<p><a href="https://news.ycombinator.com/item?id=23253296">https://news.ycombinator.com/item?id=23253296</a></p>
</blockquote>
<p>What the 1960s documentary didn't anticipate was the advent of the internet, which gives the product an effectively endless supply of new potential customers. So even a product that "only seeks to sell you once" has significantly more opportunity now than it did in the 60s. It's not easy to get a bearing on a company's reputation when they only exist as an <a href="https://www.youtube.com/watch?v=nQpxAvjD_30" title="Ryan George - What Shopping On Amazon Feels Like">Amazon brand page</a> with product reviews of questionable veracity, especially when all they have to do to get a clean slate is take down their Amazon page and put up a new one with the exact same poorly photoshopped pictures.</p>
<p><img alt='A stock photo of a man smiling and giving a thumbs up has been poorly edited so that there is a cell phone in his hand and headphones on his head. A misspelled caption reads "wireles headpohnes". The stock photo site watermarks are still present.' loading="lazy" src="/writing/advertixing/poorly_photoshopped.jpg"/></p>
<p>This tactic of slapping everyone once isn't the most lucrative in terms of absolute dollar figures, but is sufficiently low effort and low cost that some product sellers would rather play this way than just make a legitimately better product. To continue the theme of advertising subverting the principles of capitalism, try to imagine how any of these scam-and-spam pieces of junk would get even two feet off the ground without the ability to advertise to fresh gullible eyes all day long. <a class="footnote_link" data-index="12" href="#footnote_text_12" id="footnote_link_12" title="[12] I can think of one market segment where crap products can survive long-term without the help of advertising, and that's where the buyer is not the ultimate consumer. Think gift shops full of cheap trinkets, where the buyer doesn't know or care about any of the brands' reputations, and the gift recipient will say &quot;thanks, that's so thoughtful of you&quot; no matter how bad it is. Thus, there is no feedback loop for consumer opinion to affect buyer behavior.">[12]</a></p>
<p>If you slapped someone in the face a hundred million times, I think you'd go to jail. But with a bit of care, I think you could get away with slapping a hundred million people once each. Let me know how it goes.</p>
<p><a class="footnote_text" data-index="11" href="#footnote_link_11" id="footnote_text_11">[11]</a> You'll find that the documentary as a whole is apologetic towards advertising, its importance, and how it creates value and jobs. I recommend giving it a watch, but if you were hoping for a progressive anti-advertising message from the 60s, sorry!</p>
<p><a class="footnote_text" data-index="12" href="#footnote_link_12" id="footnote_text_12">[12]</a> I can think of one market segment where crap products can survive long-term without the help of advertising, and that's where the buyer is not the ultimate consumer. Think gift shops full of cheap trinkets, where the buyer doesn't know or care about any of the brands' reputations, and the gift recipient will say "thanks, that's so thoughtful of you" no matter how bad it is. Thus, there is no feedback loop for consumer opinion to affect buyer behavior.</p>
<h3 id="destruction_of_public_spaces_race_to_the_bottom">Destruction of public spaces &amp; race to the bottom<a class="header_anchor_link" href="#destruction_of_public_spaces_race_to_the_bottom"> (§)</a></h3>
<blockquote><p>People are taking the piss out of you everyday. They butt into your life, take a cheap shot at you and then disappear. They leer at you from tall buildings and make you feel small. They make flippant comments from buses that imply you're not sexy enough and that all the fun is happening somewhere else. They are on TV making your girlfriend feel inadequate. They have access to the most sophisticated technology the world has ever seen and they bully you with it. They are The Advertisers and they are laughing at you.</p>
<p>You, however, are forbidden to touch them. Trademarks, intellectual property rights and copyright law mean advertisers can say what they like wherever they like with total impunity.</p>
<p>Fuck that. Any advert in a public space that gives you no choice whether you see it or not is yours. It's yours to take, re-arrange and re-use. You can do whatever you like with it. Asking for permission is like asking to keep a rock someone just threw at your head.</p>
<p>You owe the companies nothing. Less than nothing, you especially don't owe them any courtesy. They owe you. They have re-arranged the world to put themselves in front of you. They never asked for your permission, don't even start asking for theirs.</p>
<p>— Banksy</p>
</blockquote>
<p>We've talked about the media industry competing to reach more eyeballs, and much of this competition takes place in public. "Visit Farmer John's farm" doesn't cut it. Advertisements must get bigger, brighter, flashier, and more animated all the time in order for advertisers to continue out-competing each other. You may have noticed how many advertisements show people dancing, because watching people dance is naturally hypnotic. Roadside billboards, in all their awful 672 square foot glory, have been electrified so they can show a rotation of animated advertisements instead of a single static photo, and they can be bright enough to signal incoming spacecraft.</p>
<p><a href="https://old.reddit.com/r/LosAngeles/comments/m4o2v4" title="Does anyone know what that insanely bright billboard just outside of downtown LA is all about?"><img alt="A photo taken at night over Los Angeles with many illuminated buildings. In the distance, an extraordinarily bright light overpowers the scene. It is an advertising billboard." loading="lazy" src="/writing/advertixing/billboard.jpg"/></a></p>
<p>It is hardly possible to step outside without being advertised to, unless you recede all the way out into the woods. As I prepared to write this paragraph, I had to ask myself, what would the alternative even be? What kind of cityscape am I imagining that would allow me to be out in a public space and not be advertised to? It is such a foreign notion that it is difficult to even answer. Buildings in a public space are either homes or businesses, and the businesses will want advertise on their space, right?</p>
<p>Well, if you're interested in foreign notions, look to <a href="https://en.wikipedia.org/wiki/Cidade_Limpa">São Paulo, Brazil</a>, which enacted a "clean city" law in 2006.</p>
<p><img alt="A before-and-after comparison of several two-story shops on a street. In the before photo, the buildings have advertising, branding, and signage on their facades and canopies. In the after photo, the advertisements are gone, the signs are smaller, and one building has been freshly painted a deep green." loading="lazy" src="/writing/advertixing/sao_paulo_1.jpg"/></p>
<p><img alt="A before-and-after comparison of several high-rise apartments and commercial buildings. In the before photo, large billboards sit both on ground level and on top of some of the buildings. One building has a large advertisement stretched over the entire face of one wall. In the after photo, all of this is removed." loading="lazy" src="/writing/advertixing/sao_paulo_2.jpg"/></p>
<p>Admire also the interior of <a href="https://www.youtube.com/watch?v=EqwasBTzZS8&amp;t=11m47s" title="Not Just Bikes - Amsterdam Just Got Awesomer">Amsterdam's central station</a>, which decorates itself from floor to ceiling with centuries-old artwork and heritage instead of advertising. Because when a city knows what the hell it's doing with its funds, it can spare some for art and atmosphere instead of pimping out the very walls to advertisers. Who knew!</p>
<p>I think it's not wrong for a business to have their name on a sign, but our cities are just totally soaked in advertising that isn't necessary. Billboards, windows, telephones, train stations, bus stops, hell, even the buses themselves are wrapped in advertising reminding you who you should thank for sponsoring the continued existence of the public sphere, as if it would otherwise collapse. Sixteen years later, São Paulo hasn't collapsed.</p>
<p><img alt="A photo taken from a very high angle looks down at the street, showing that a pedestrian crosswalk has been turned into a mcdonalds advertisement. The ordinary yellow crosswalk lines now represent french fries, coming out of a large red mcdonalds fry cup." loading="lazy" src="/writing/advertixing/mcdonalds_crosswalk.jpg"/></p>
<p>In 2019 a company called StartRocket wanted to <a href="/writing/advertixing/startrocket.html">launch logos into space</a> <a class="footnote_link" data-index="13" href="#footnote_text_13" id="footnote_link_13" title="[13] The next step in cola's domination of the universe.">[13]</a>.</p>
<blockquote><p>"We are ruled by brands and events," he told Futurism. "The Super Bowl, Coca Cola, Brexit, the Olympics, Mercedes, FIFA, Supreme and the Mexican wall. The economy is the blood system of society. Entertainment and advertising are at its heart. We will live in space, and humankind will start delivering its culture to space. The more professional and experienced pioneers will make it better for everyone."</p>
</blockquote>
<blockquote><p>The company didn't share how much a space advertisement might cost, but a pitch deck sent to Futurism opined that brands will pay for the ads because the "ego is brighter than the sun."</p>
</blockquote>
<blockquote><p>"If you ask about advertising and entertainment in general — haters gonna hate," Skorupsky said. "We are developing a new medium. At the advent of television no one loved ads at all."</p>
</blockquote>
<p><img alt="A still frame from StartRocket's promotional video shows Mount Fuji, with the brightly illuminated name Simple Cola suspended in the night sky." loading="lazy" src="/writing/advertixing/startrocket.jpg"/></p>
<p><img alt="A still frame from the film They Live shows John Nada wearing the sunglasses that let him see the truth behind advertisements. His head is angled slightly upward to give the impression he is looking at the StartRocket image above." loading="lazy" src="/writing/advertixing/they_live_1.jpg"/></p>
<p><img alt='A still frame from the film They Live shows the world in black and white, with all advertising billboards replaced with subliminal messages: "CONSUME", "OBEY", "WATCH TV", "BUY".' loading="lazy" src="/writing/advertixing/they_live_2.jpg"/></p>
<p>If you're in the mood to deface some advertisements, here's a design you could print out on sticker paper and fill in with marker:</p>
<p><img alt='A business card-sized sticker template reads "WARNING: This ad promises blank, but only sells blank", where you can write on the blank lines.' loading="lazy" src="/writing/advertixing/warning_sticker.svg" title="THIS AD PROMISES 𝓫𝓮𝓪𝓾𝓽𝔂, BUT ONLY SELLS 𝓶𝓪𝓴𝓮𝓾𝓹"/></p>
<p><a class="footnote_text" data-index="13" href="#footnote_link_13" id="footnote_text_13">[13]</a> The next step in <a href="https://www.youtube.com/watch?v=Cry7kbpPlDA&amp;t=4m14s" title="Ross's Game Dungeon: The Journeyman Project">cola's domination of the universe</a>.</p>
<h3 id="stifling_of_expression_and_choice_to_match_the_sponsors">Stifling of expression and choice to match the sponsor's<a class="header_anchor_link" href="#stifling_of_expression_and_choice_to_match_the_sponsors"> (§)</a></h3>
<p>It is no secret that people who receive things from sponsors feel pressured to keep the sponsor happy by <a href="https://en.wikipedia.org/wiki/Chilling_effect">censoring themselves</a>. For example, a product reviewer who receives free samples from manufacturers might choose to temper their criticisms so they don't risk the chance of not receiving the next free product. I can respect reviewers like <a href="https://www.youtube.com/channel/UCSOpcUkE-is7u7c4AkLgqTw/videos">Mr. Mobile</a> who end every review by explicitly denying any editorial input from the manufacturer, but I also think that his criticisms are usually quite lightweight. Even if he's not being told what to say, I can tell that he's either self-censoring or just not as discerning as I would be in his position. Better yet are the likes of <a href="https://www.youtube.com/channel/UC2rzsm1Qi6N1X-wuOg_p0Ng/videos">Project Farm</a> who always purchases everything he tests — when he says "very impressive!" it actually means something.</p>
<p>Self-censorship also includes not talking about particular topics deemed taboo by the sponsor. The <a href="/writing/advertixing/youtube_adpocalypse.html">Youtube Adpocalypse</a> and Youtube's <a href="https://www.youtube.com/watch?v=LuScIN4emyo">COPPA agreement</a> are both great example of a mass chilling effect that left video creators unsure of what they can and can not say or show. Superstition like "you can say the f-word, but only after 30 seconds" became <a href="https://www.youtube.com/watch?v=VWAdzMmNLy0&amp;t=1m02s" title="What the &amp;$!#^%!!! 🤬 Profanity in YOUR YouTube videos and how it affects the MONETIZATION icon 🤑 - Creator Insider (actual youtube staff members)">officially encouraged</a> for a while. People became worried that everything they do has to be family-friendly or else they'll get banned. Youtube's continued decline into artificial incompetence and automated decisionmaking have only made things worse. Even now, many are superstitious that saying the words "<a href="https://www.youtube.com/watch?v=w4jsvollABY&amp;t=1h1m8s" title="Accursed Farms Videochat May 2021">covid</a>" or "Ukraine conflict" out loud will weight the video towards being demonetized.</p>
<p>I already feel that basing your income and internet presence on a free website is <a href="/writing/cancel_this_album">risky</a> at best, but in a basic sense I don't mind platforms having rules and people abiding by them. As time goes on, though, we've seen more and more people consolidate themselves under a shrinking number of platform brands, so the rules that apply to creators of today are ever more monochromatic. If you pay the creators that you want to see succeed, and they diversify or even self-host their publications, and we all come to our senses and start using RSS again, we'd see a lot more color.</p>
<p>The internet presents us with enormous opportunity to develop the long tail, and we are refusing to take advantage of it. In the ages before the internet, if your interests were too niche and specific, you'd never be able to get in front of enough people to find the like-minded among them. Now, with the internet, we have the possibility for people around the entire world to reach each other in milliseconds, to catalog and index and search through all that exists, but instead we stick to what we know, and that's the television-era way of doing things.</p>
<h3 id="if_youre_not_paying_youre_the_product">If you're not paying, you're the product<a class="header_anchor_link" href="#if_youre_not_paying_youre_the_product"> (§)</a></h3>
<p>There is a very well-known mantra that goes "if you're not paying, you're the product". You can use Facebook for free, but only because Facebook is selling you to advertisers. If you've heard this once, you've heard it a thousand times.</p>
<p>What this means is that your eyeballs and your attention are the product being sold by the publisher to the sponsor. The sponsor doesn't care about you as a human being, they care about how many clicks are landing on their website, and the publisher promises they can generate so many clicks in exchange for CPI. We like to think of ourselves as the customer using the Facebook product, but in fact we're more like cattle on the Facebook ranch, and the advertiser is the customer hungry for steak.</p>
<p>Cattle ranches like Facebook, Instagram, and Twitter do odd things that make the service less convenient for the cattle, like obscuring chronological timelines in favor of discovery and recommendation systems. One might say that these changes make the product worse, but since the real product is the cattle's mere continued existence and not their happiness, these changes actually make the product better from the perspective of the advertiser.</p>
<p>This also explains why it's so difficult for users to get help when something is wrong with their account, and why their opinions are rarely considered when changes are being made to the system. The happiness of the cattle is not really important, and it's better to pursue two new ones than help one old one. At this point I am basically repeating what I said earlier about becoming a media production house.</p>
<p>That's fairly straightforward, but there are some situations where the "you're the product" concept starts to get a little twisted. That's when a content platform shares some of its advertising income with the content creators. Youtube, for example: <a href="https://news.ycombinator.com/item?id=24571038">They're deleting my channel, but they don't know why?</a></p>
<blockquote><p>If Google/Youtube were NOT a monopoly, they would have invested significant amount of money in customer support. However, there is zero. They are saving hundreds of millions in support costs by not delivering any support. Unlike more overt monopolistic actions like raising prices, etc, what they do instead is increase their profits by taking away functionality that their customers should be receiving.</p>
<p><a href="https://news.ycombinator.com/item?id=24575131">https://news.ycombinator.com/item?id=24575131</a></p>
<blockquote><p>They do have support infrastructure for their customers. Youtube content creators are not customers, they're more akin to contractors (when paid) and volunteers (when not). In fact, google is the customer in this relationship, and they are within their rights to stop buying the product without having to explain why.</p>
<p>It is on content creators to diversify their business. If a contractor has only a single customer because that customer is the most profitable, would you pity them when they are fired by that customer? Or would you call them bad at business for failing to diversify?</p>
<p><a href="https://news.ycombinator.com/item?id=24575307">https://news.ycombinator.com/item?id=24575307</a></p>
</blockquote>
</blockquote>
<p>We have a situation where simultaneously:</p>
<ol>
<li>The advertiser is the customer and the viewer's attention is the product.</li>
<li>Google is the customer and the video is the product.</li>
</ol>
<p><img alt="Illustrated diagram depicts the relationship between the Viewer, the Publisher, the Advertiser, and Google. The Publisher sends a video to Google in exchange for one dollar bill. The Advertiser sends an advertisement to Google along with three dollar bills. Google puts the advertisement on the video and sends it to the Viewer." loading="lazy" src="/writing/advertixing/youtube_youretheproduct_1.png"/></p>
<p>But the thing that makes this relationship even more twisted is that even though video creators expect to get paid for their videos, they don't actually have any contract guaranteeing it. Youtube has a system where videos may become "demonitized", meaning they are not eligible to receive advertisement money, if Google determines that the video is not suitable for their sponsors. Officially, each video is offered up to Google for free, and Google may or may not decide to kick some revenue towards the creator. Don't get me wrong, this lack of contract and casual business relationship works in favor of the creator too: they have no production quotas or deadlines, and they can publish as much or as little as they want. Lots of people try making videos for a while and then get bored of it, so we can't expect much in the way of contractual work. But the difficulty of getting paid by Youtube has led many video creators to make deals directly with advertisers and <a href="https://www.youtube.com/watch?v=WVDQEoe6ZWY" title="Tom Scott - This Video is Sponsored by ███ VPN">perform the advertisement</a> as part of the video. This leads to viewers seeing twice as many ads in the practical sense, except in the minority case where Google decides not to run their sponsors' ads on the video because the topic is too risqué for them.</p>
<p><img alt="Illustrated diagram expands upon the previous one as the relationship has become more complex. One Advertiser sends money to the Publisher, and the Publisher performs the advertisement as part of the video. The Publisher sends the video to Google, but they are not sure if they will get money back from Google because the video might become demonitized. Google puts their own Advertiser's advertisement on the video and sends it to the viewer. When the viewer watches the video, they will see Google's ad as well as the Publisher's ad." loading="lazy" src="/writing/advertixing/youtube_youretheproduct_2.png" title="Note to future readers: the yellow dollar sign indicates limited or no advertising run by Google's sponsors"/></p>
<p>Collectively, creators have complete leverage over the site's ability to operate. Without new videos, Youtube would be in big trouble with the advertisers. But individually they are basically holding out their hats and hoping they'll catch some of the falling coins. The strongest threat that an individual creator can make is "I'm not gonna upload any more videos for you!", which measures at about 0.0001 on the Richter scale. Google is always prepared for individual creators to come and go, which is why they don't draft contracts or guarantee payment, so without significant collective action on the part of creators hurting the bottom line, Google has no incentive to change. Not to mention you'd be asking creators to sacrifice their own income by withdrawing their hat.</p>
<p>I will take this opportunity to say that I agree with the perspective that full-time youtubers are like contractors relying on a single client with no contract, and if they don't diversify their income it's their own fault. It's bad business sense with little room to cry victim. This is similar to what I wrote in <a href="/writing/cancel_this_album">Cancel This Album!</a>. The situation with Youtube advertisements is not new. Every single person getting into Youtube with the goal of making money has had ample time to assess the system and decide if they're willing to try their hand with it anyway. Besides, the kind of people who get into Youtube with the goal of making money are not the kind of people I care about, and I am more than happy for them to bail when it doesn't work out. The ones I care about are getting my patronage separately.</p>
<p>One more good comment:</p>
<blockquote><p>People could stop using Google today but most don't, because Google is just so much better than everyone else at searching.</p>
<p>Should Google/YouTube be regulated because people dislike what the company is doing, but just not enough to actually stop using their products?</p>
<p><a href="https://news.ycombinator.com/item?id=24577153">https://news.ycombinator.com/item?id=24577153</a></p>
</blockquote>
<h3 id="if_youre_paying_youre_still_the_product">If you're paying, you're still the product<a class="header_anchor_link" href="#if_youre_paying_youre_still_the_product"> (§)</a></h3>
<p>"Hey", said the director of marketing to the product manager, "the users on the free plan are earning us $3.50 per month in advertisements, and the users who upgraded to the premium plan are earning us $8.00 per month."</p>
<p>The product manager eyeballed the quarterly report and saw that these figures were accurate. "Things are looking good."</p>
<p>"But if we show them the ads too, we could be making $11.50."</p>
<p><img alt="The Stonks meme shows a silly 3D rendering of a businessman in front of a chart of numbers and a upwardly rising arrow of profit." loading="lazy" src="/writing/advertixing/stonks.jpg"/></p>
<p>Hulu is one of the more notorious examples that comes to mind. You can find lots of people wondering why they <a href="https://www.google.com/search?q=hulu+ads+on+paid+site:reddit.com">still see ads</a> after upgrading to the plan called "Hulu (No Ads)". Hulu's help center has <a href="/writing/advertixing/hulu_ads.html">an answer to this question</a>: their service provides both on-demand media and live television, but "No Ads" only refers to the on-demand media because the live television is, well, live from another broadcaster that controls the stream. That answer is pretty reasonable in my opinion but, gee, maybe they shouldn't call it "No Ads", huh? A reasonable consumer might be misled into thinking they're paying for a plan that will not include any advertising. Perhaps Hulu is only targeting the unreasonable consumers.</p>
<p>"That's fine", you say. "I don't use Hulu, I use Netflix. I pay for Netflix and it has no ads". <a href="/writing/advertixing/netflix_pp1.html">Well</a>, <a href="/writing/advertixing/netflix_pp2.html">except</a>.</p>
<p><img alt="Screenshot from Stranger Things. Eleven, wearing a medical gown and crown of brain activity monitors, sits at a desk with a can of Coke." loading="lazy" src="/writing/advertixing/stranger_things.jpg"/></p>
<p>The current state of so-called smart televisions is a horrifying glimpse into this future of being advertised to after you've already paid. There are endless reports of <a href="https://www.google.com/search?q=samsung+smart+tv+showing+ads+site:reddit.com">Samsung televisions showing ads in the UI</a>. And when you see the option to "turn off personalized ads", that doesn't mean you get to turn off the ads, just that they won't be personalized any more. Probably. I'm waiting patiently for some <a href="https://old.reddit.com/r/assholedesign/comments/dm8vv9/my_2500_tv_has_sponsored_content_built_into_the/f4ytbn8/" title="I've had a Samsung TV for about 2 years, and the ads just showed up recently after an update">evidence</a> of manufacturers delaying the showing of ads until a 90-day return period has expired.</p>
<p>The tech-savvy TV buyers know that you should never, ever give your TV your wifi password, because it will use it to advertise to you. But get your tin foil <a class="footnote_link" data-index="14" href="#footnote_text_14" id="footnote_link_14" title="[14] Reynolds Wrap™ is perfect for making faraday cages and also hats!">[14]</a> ready because soon that won't be good enough — cellular providers offer <a href="/writing/advertixing/att_iot.html">IoT data plans</a> for around $1.00 per month, <a href="/writing/advertixing/hologram_iot.html">or less</a> when arranged in bulk. Your next TV could very well come with a cellular modem and a SIM card inside, essentially all the important guts of a cell phone, so that it can connect to the internet all by itself. The TV manufacturer would pay the monthly cost of the SIM and you'd never know it's there.</p>
<p>"But the advertisements subsidize the TV and make it cheaper for the consumer", you'll hear. Firstly, I think this is basically hogwash. If it's true at all, it will only be a temporary effect. The manufacturers picking up money on advertising can afford to drop the sticker price and <a href="/writing/advertixing/freetelly.html">take a loss on the TV itself</a> to undercut the competitors. But once all the competitors follow suit and every television at your local big box store has advertising built in, we'll be back to square one in a new fresh layer of hell. Secondly, the whole <a href="https://en.wikipedia.org/wiki/Moore%27s_law">Moore's law</a> thing took place from the 1960s to the 2000s and demonstrated within one lifetime that electronics technology can become better and cheaper without every single transistor sending you spam mail. To say that letting your TV advertise to you has opened up new doors for affordable technology is myopic. This isn't the only way forward.</p>
<p><a href="/writing/advertixing/US8246454B2.pdf" title="SYSTEM FOR CONVERTING TELEVISION COMMERCIALS INTO INTERACTIVE NETWORKED VIDEO GAMES, Sony Computer Entertainment America LLC"><img alt="Figure 8 from Sony's patent shows a man using a remote control to interact with an advertisement. The screen reads &quot;throw pickle in burger to speed up commercial&quot;. After the man swings the remote to throw the pickle, the screen reads &quot;make it your way&quot;." loading="lazy" src="/writing/advertixing/make_it_your_way.png"/></a></p>
<p><a href="/writing/advertixing/US8246454B2.pdf" title="SYSTEM FOR CONVERTING TELEVISION COMMERCIALS INTO INTERACTIVE NETWORKED VIDEO GAMES, Sony Computer Entertainment America LLC"><img alt="Figure 9 from Sony's patent shows a man on a couch watching a tv show. An advertisement of a burger appears, and reads &quot;say mcdonalds to end commercial&quot;. The man stands up, raises his hands into the air, and exclaims &quot;mcdonalds!&quot;. He sits back down and the show resumes." loading="lazy" src="/writing/advertixing/say_mcdonalds.png"/></a></p>
<p>The TV is one thing. It's a media device anyway. Next up is your refrigerator, dishwasher, clothes washer, dryer, air conditioner, heater, stove, oven. Looks like you're running low on detergent, why not pick up some Tide™? Looks like you've been running the AC pretty often, you should ask Home Depot™ about installing some double-paned windows to improve your home's insulation. You've started cooking more recently — new hobby? — you might like a fresh set of Lodge™ cast iron skillets. The manufacturers will not put a screen on your appliance that tells you these things, but they'll collect the data and use it to decide what you see on the web tomorrow <a class="footnote_link" data-index="15" href="#footnote_text_15" id="footnote_link_15" title="[15] But remember, the only reason your stove can influence the ads you see on Twitter is because Twitter is selling you out, and you've got to blame both parties.">[15]</a>.</p>
<p>"As long as a pregnant woman thinks she hasn't been spied on, she'll use the coupons."</p>
<p>And every time you see a "smart" version of a product that you didn't know needed to be smart, you should be very suspicious. As soon as the manufacturer of your bed, your couch, your <a href="https://www.youtube.com/watch?v=VkVGtQOko1A" title="JerryRigEverything - This Smart Pillow costs $300!?!">pillow</a>, your dresser, your cabinets can convince you to plug your furniture into the wall, you're taking the bait and they're going to use your <a href="https://www.youtube.com/watch?v=kTCmpYDzq3w" title="Two of my own pies!?">own electricity</a> to advertise to you. It's a bad habit to get into.</p>
<p><img alt='A screenshot of a 4chan greentext post from 2013. The scene plays out as follows: 2018. Wake up feeling sick after a late night of playing vidya. Excited to play some halo 2k19. xbox on. dot dot dot. xbox on. Please verify that you are annon332 by saying Doritos TM Dew TM it right! Doritos TM Dew TM it right. ERROR! Please drink a verification can. Reach into my Doritos TM Mountain Dew TM Halo 2k19 TM War Chest. Only a few cans left, needed to verify 14 times last night. Still feeling sick from the 14. Force it down and grumble out "mmmm that really hit the spot". Xbox does nothing. I attempt to smile. Connecting to verification server. Dot dot dot. Verification complete! Finally. Boot up halo 2k19. Finding multiplayer match. ERROR! User attempting to steal online gameplay! My mother just walked into the room. Adding another user to your pass, this will be charged to your credit card. Do you accept? No! Console entering lock state! To unlock drink verification can. Last can. WARNING, OUT OF VERIFICATION CANS, an order has been shipped and charged to your credit card. Drink half the can, oh god im going to be sick. Pour the last half out the window. PIRACY DETECTED! PLEASE COMPLETE THE ADVERTISEMENT TO CONTINUE. The mountain dew ad plays. I have to dance for it. Feeling so sick. Makes me sing along. Dancing and singing. Mountain dew is for me and you. Throw up on myself. Throw up on my tv and entertainment system. Router shorts. ERROR NO CONNECTION! XBOX SHUTTING OFF. PLEASE DRINK VERIFICATION CAN TO CONTINUE' loading="lazy" src="/writing/advertixing/please_drink_verification_can.png"/></p>
<p>There's another point that I was only recently enlightened to. One way that appliance manufacturers are able to get these anti-user products into users' homes is by making deals with home builders and landlords, and having their appliances installed before the would-be home buyer has any say in the matter. After all, the home builders aren't the ones that have to actually use it. This is another example of advertising subverting the foundations of capitalism: the manufacturer doesn't need to win over the customer with a good product, they just need to find novel ways of getting in your face.</p>
<p>This is okay though, because as we all know, the free market will sort itself out. You as a home buyer will simply have to do comprehensive research on every single electronic device that is included in the home and be ready to drop the entire deal at a moment's notice. In this economy. Good luck!</p>
<p><a class="footnote_text" data-index="14" href="#footnote_link_14" id="footnote_text_14">[14]</a> Reynolds Wrap™ is perfect for making faraday cages and also <a href="https://www.youtube.com/watch?v=urglg3WimHA" title="Weird Al Yankovic, Foil">hats</a>!</p>
<p><a class="footnote_text" data-index="15" href="#footnote_link_15" id="footnote_text_15">[15]</a> But remember, the only reason your stove can influence the ads you see on Twitter is because Twitter is selling you out, and you've got to blame both parties.</p>
<h3 id="spam_your_life_as_an_arms_race">Spam: your life as an arms race<a class="header_anchor_link" href="#spam_your_life_as_an_arms_race"> (§)</a></h3>
<p>Spam is built upon the abuse of systems by definition. Unlike sponsors, who make a deal with the publisher to show ads in their space in exchange for payment, spammers are people who try to slip between the cracks of the system and get their advertisements directly to you. Like bomb-carrying terrorists, spammers will target spaces that:</p>
<ol>
<li>are pre-established, because spammers can't attract an audience on their own.</li>
<li>are highly trafficked, because spammers need to hit as many people as possible before getting caught.</li>
<li>provide otherwise legitimate value to your life, so that you will not simply leave the space after the spammers invade.</li>
</ol>
<p>Your <a href="/spam">email inbox</a> and your telephone are spaces for communicating with people you know, and spammers abuse it to send you junk. Web forums are spaces for conversation, and spammers abuse them by making fake posts. Grocery stores are spaces for buying food, and spammers abuse the traffic flow to hand out fliers. <a href="/writing/not_just_bikes">Parking lots</a> are part of our transit system, and spammers leave advertisements under your wipers because you're not there to stop them. The front door of your house is for yourself and your guests, and spammers abuse it by turning it into ad space.</p>
<p>The problem with spam is not just that it's annoying, but that it converts your entire life into an arms race. Spam is hostile. It is mean. Spam takes every aspect of your life and turns it into an opportunity to make a buck off of you. No matter how hard you work to avoid advertisements and carefully pick the publishers you want to pay for, spammers can override your decisions and advertise to you anyway. I am not kidding when I compare spam to terrorism, though I am exaggerating. Spam positions you against enemies you didn't know you had. Enemies who come from afar to your place of residence to disrespect your time, attention, and belongings, and sneak away. Unlike a TV which can be turned off or a magazine which can be closed, spam offers no means to opt-out. Spammers will hit you and run without showing their face. What are you going to do about it, not have an email address? Not have a phone number?</p>
<p>People dump their ugly fliers on your doorstep, and for some reason the onus is on you to clean it up and hang a No Soliciting sign to stop it from happening again. Do we also need to hang a "Please don't throw eggs at my house" sign, just in case? How about "No Bombing"?</p>
<p>Consider for a moment the extraordinary amount of resources that have been utterly wasted by spam. How many millions of square miles of paper are printed into pre-approved credit card offers so they can go straight to the shredder. How many talented software engineers have been relegated to writing spam filters, email blockers, abuse heuristics, shadowbanners, phishing protection, and anti-spoof measures just to stop worthless dirtbag spammers from polluting their website and the internet at large. All this effort could have been put to better use.</p>
<p>Spam is a crime against humanity and I'd like to see the worst offenders jailed.</p>
<h2 id="arguments_against_ads">Arguments against ads<a class="header_anchor_link" href="#arguments_against_ads"> (§)</a></h2>
<p>Even if we consider the above the be a list of reasons why ads are evil, some may say they are a necessary evil. Below are some reasons that advertisements are less necessary than we think.</p>
<h3 id="not_every_jobs_a_living">Not every job's a living<a class="header_anchor_link" href="#not_every_jobs_a_living"> (§)</a></h3>
<p>When people complain about ads on the internet, mobile apps, and so forth, there is a common defense that always comes up. It's that "website owners/app developers need to eat too!". I agree with this and will take it a step further: everyone needs to eat. No, further: everyone <em>deserves</em> to eat. And everyone deserves to have a comfortable home and enough time in the day for leisure. Woah! So progressive! I'm pretty ahead of the game here. But how can I reconcile such a utopian vision with a rejection of the ads that make all of these things possible? You know that nobody ate until the advertisement was invented.</p>
<p>Whenever I think about this, there's an analogy that always pops into my head. I've had it for years, and it goes like this:</p>
<p>Suppose someone decides they want to make a living selling bottlecaps, or refurbishing used napkins, or decorating toilets, or teaching underwater basket weaving <a class="footnote_link" data-index="16" href="#footnote_text_16" id="footnote_link_16" title="[16] When I equate the writing of software with these trades, I'm not doing so on the basis of the craft itself. I'm doing so on the basis of the number of paying clientele, and furthermore I'm exaggerating to make a point. Writing software is much more useful and impactful than refurbishing napkins, etc etc etc, and we could harvest a million is/oughts out of this situation.">[16]</a>. So they stand on a street corner peddling their wares and find they don't get many takers. Turns out people don't want to spend money on that. Panic sets in. "I've set my sights on this job!" they cry. Rent and bills continue to pile up but the money's just not coming in.</p>
<p>The situation becomes desperate as they realize their monetization scheme — you know, exchanging their goods and services with customers for money — isn't going to pan out. With the business failing and the market clearly not ready for their idea, they finally make the obvious choice... huh?... find another job? No, I mean they start yelling at passersby with a script someone else is paying them to say, and slipping tracking devices into their pockets as they go. And if any of them complain, it's the same old story: <em>I'm sorry you don't like the ads, but used napkin refurbishers need to eat, too!</em></p>
<p>Such is the current state of the software, web publishing, and mobile app industries.</p>
<p>I know that our society has got a pretty serious problem with undervaluing software. Why is it that I'm willing to spend $10 on a pizza that I'll get three meals out of, but I'm not willing to spend $10 on software I'll use hundreds of times over the course of years? I don't know. Partly because we have problems assigning value to intangibles, and partly because I've been conditioned by the plethora of great, free, no-ads software I've already <a href="/writing/sqlite_what_a_hunk">got</a>. And partly because of <a href="https://en.wikipedia.org/wiki/Digital_rights_management">DRM</a> which aims to strip control even from paying customers, but that's another matter. If I was getting free pizza regularly I'd surely stop paying for that, too, even if the paid ones were a little better.</p>
<p>But that's not really the point. That's an <a href="https://en.wikipedia.org/wiki/Is%E2%80%93ought_problem">is/ought problem</a>. Consumers <em>ought</em> to be willing to pay for good software or web experiences or mobile apps, but the reality is they mostly <em>aren't</em>. The economy and the world in general is full of is/oughts, and when it comes to making a living and paying rent, I think most of us understand that we have to follow the is. What absolutely boggles my mind is that developers whose goal is to make money with their idea <a class="footnote_link" data-index="17" href="#footnote_text_17" id="footnote_link_17" title="[17] If your goal is not to make money, then proceeding with an unprofitable idea is perfectly fine. That's called having a hobby. I'm talking about people who want to enter a market that won't support them and then saying Sorry! I had to run ads or I'd be out of business! as if that outcome wasn't obvious from the beginning, and as if staying in business was mandatory.">[17]</a> can recognize the state of the industry, understand that the likelihood of making sales with it is near zero, and then <strong>proceed anyway</strong> before, oops!, needing ads to pay the bills. In fact, I'm being disingenuous here by implying that developers even intend to use honest sales in the first place; the situation today is that ads are the expected and planned business model for many or most. Look at how many websites and apps are launched with analytics, tracking, and ads baked in from day one.</p>
<p>Can you imagine applying this line of reasoning to any other industry? Mom, when I grow up I'm going to become a napkin refurbisher. But darling, no one's going to pay for that, are you sure you can make a living? It's okay I'll run ads. Mom, I'm going to start a business decorating toilets. Will anyone pay for that? Maybe a few, and I'll run ads to earn the rest. Mom, I'm going to <strong>enter a market in which there are not enough paying customers to make a living</strong>, but it's ok I'll run ads. Does this not sound totally wild?</p>
<p>My feelings here would be different if we were still in the exploratory phase of computers, back when we weren't really sure if goods-for-money style transactions could work here. But we're not in that phase. Those pioneers have come and gone, and they left a bunch of signposts saying "people don't pay for this stuff". Very occasionally, someone will realize a market opportunity that does work. Steam sells loads of games and does so because "it's easier than piracy". I don't use Spotify but I've heard they're in a similar position. Netflix captured the movie-streaming market first, and were worth paying for until the more recent fragmentation of everyone trying to start their own streaming service and pulling their licenses from Netflix. I just simply cannot sympathize with someone who knows that making websites or mobile games doesn't pay the bills without ads, then starts doing it anyway and complains that they can't pay the bills without ads, despite not having a remotely unique take on the problem. Likewise, I expect that you would not sympathize with me if I tried to start a napkin refurbishing business and found it to be unsustainable.</p>
<p>Job titles are descriptive, not prescriptive. It's not like you are born an app developer and therefore you must make a living making apps. You're an app developer because that's what you chose to do. So when people say "app developers need to eat too!", all I can think of is "then why did they choose that job!?". This is not discrimination against something out of your control. <em>Everybody</em> needs to eat, so the fact that they become full-time app developers confounds me.</p>
<p>I don't understand why we're so hell-bent on making apps and websites and social media networks. Our culture has become absolutely tunnel-visioned, barrelling along on the locomotive of PUBLISH MORE PUBLISH MORE, we've become incapable of considering that our hobbies weren't meant to be full-time jobs. All we can do is double down, insist with our dying breath that Twitter must go on!, injecting it with engagement-boosters whenever growth slows. Have ye no shame, corrupting your work like this? Didn't you begin the project out of passion?</p>
<p><img alt="A still frame from the film Akira shows Tetsuo becoming mutated. His body balloons and wires and hoses protrude from his skin." loading="lazy" src="/writing/advertixing/tetsuo.jpg"/></p>
<p>I don't know why we've developed this "all business ventures must grow forever" mindset, especially when it leads to the corruption and rotting of the original business. If you're running a free web service and it's costing you too much to host, I'd have way more respect for you if you just said "hey everyone, I can't afford to keep doing this out of pocket, we'll have to cut back on the scope of our project unless the community would like to contribute some funds". It doesn't seem like that level of honesty should be so hard to come by, especially when speaking to the very people that are making your service successful, but most of the time it's straight to the advertisers for help instead.</p>
<p>If this line of reasoning works for web/app developers, why haven't we seen the degenerative collapse of other industries in which people do unprofitable things but spin it off into an ad-slinging business to make ends meet? Why isn't every single auto mechanic, grocery store, and restaurant offering their primary service for free, and making up for it by showing advertisements for sponsors <a class="footnote_link" data-index="18" href="#footnote_text_18" id="footnote_link_18" title="[18] Yes, grocery stores do have signage and priority shelving spots which suppliers pay extra for, and fast food chains have agreements with ketchup and soda suppliers. The difference is that shelving is physical, limited real estate. So the decision of what to put where comes down to logistics with sponsorship as a tie-breaker. Furthermore these things are contextually relevant to the domain, and I enter these places with the expectation of spending money, neither of which are the case for web ads.">[18]</a>? Well, first and foremost it's because there are actually customers willing to pay for those. But moreover, the technology industry is unique because it's the biggest force-multiplier the world has ever seen. Real-life businesses are going to be bound by the high costs of property and lights and inventory and staff. If Grocery Mart gives out groceries for free and hopes to make their money on third-party ads, they're gonna have to show a hell of a lot of ads and still will never achieve a big enough reach to make it pay off. Meanwhile, ads on the internet are highly passive from the point of view of the website owner or app developer, and they reach thousands of times more eyeballs, and the cost of hosting a website or distributing an app's worth of megabytes is dirt cheap compared to leasing store property and giving away real inventory.</p>
<p>It's all a bunch of is/ought/is/ought/is/oughts. I'm gonna go crazy over this stuff <a class="footnote_link" data-index="19" href="#footnote_text_19" id="footnote_link_19" title="[19] I already have.">[19]</a>.</p>
<p><a class="footnote_text" data-index="16" href="#footnote_link_16" id="footnote_text_16">[16]</a> When I equate the writing of software with these trades, I'm not doing so on the basis of the craft itself. I'm doing so on the basis of the number of paying clientele, and furthermore I'm exaggerating to make a point. Writing software is much more useful and impactful than refurbishing napkins, etc etc etc, and we could harvest a million is/oughts out of this situation.</p>
<p><a class="footnote_text" data-index="17" href="#footnote_link_17" id="footnote_text_17">[17]</a> If your goal is not to make money, then proceeding with an unprofitable idea is perfectly fine. That's called having a hobby. I'm talking about people who want to enter a market that won't support them and then saying Sorry! I had to run ads or I'd be out of business! as if that outcome wasn't obvious from the beginning, and as if staying in business was mandatory.</p>
<p><a class="footnote_text" data-index="18" href="#footnote_link_18" id="footnote_text_18">[18]</a> Yes, grocery stores do have signage and priority shelving spots which suppliers pay extra for, and fast food chains have agreements with ketchup and soda suppliers. The difference is that shelving is physical, limited real estate. So the decision of what to put where comes down to logistics with sponsorship as a tie-breaker. Furthermore these things are contextually relevant to the domain, and I enter these places with the expectation of spending money, neither of which are the case for web ads.</p>
<p><a class="footnote_text" data-index="19" href="#footnote_link_19" id="footnote_text_19">[19]</a> I already have.</p>
<h3 id="without_adsupported_content_would_there_be_any_content">Without ad-supported content, would there be any content?<a class="header_anchor_link" href="#without_adsupported_content_would_there_be_any_content"> (§)</a></h3>
<p>During the previous section, you may have been thinking that a developer slinging ads on a free site or app is more acceptable than a napkin refurbisher slinging ads, because websites and apps improve our lives in a way that refurbished napkins don't. This is also true for Youtubers who quit their day jobs to make videos, funded by ads.</p>
<p>One facet I want to express is that the value, I mean benefit-to-the-world value, of ad-supported websites and services is almost universally overstated, and the value that is there can hardly overcome the damaging cost of ads. After all, how valuable could it really be if nobody's willing to pay for it except the sponsors expecting a return on investment? Humanity survived for many thousands of years without Instagram and we can continue to do so. It's just not very important.</p>
<p>But surely if I got my wish and ad-supported websites all shut down, there'd be nothing left, right?</p>
<p>There would be less, that much is true. There'd be a <strong>lot</strong> less. But increasingly, and overwhelmingly as of late, that's sounding like a good thing to me. I don't want <em>more</em>, I want <em>better</em>. Like, if you've got one gold nugget and a whole bunch of trash, and you throw away the trash, yeah that's the majority of your content. But it was trash content, and to be rid of it is good. Focus on the gold. What's that, Facebook wouldn't be able to continue operating if it weren't for ads? The History Channel, a shell of its former self and a disgrace to its name, would have to stop broadcasting? Okay, I'll take it!</p>
<p>The internet used to be small, but most things you could find were interesting or at least made by someone who was genuinely interested in making it. Now the internet is enormous and nobody cares about anything except getting clicks. Browsing the internet now is like swimming in a polluted lake. It's miserable and discouraging.</p>
<p>Veritasium <a class="footnote_link" data-index="20" href="#footnote_text_20" id="footnote_link_20" title="[20] I like Veritasium's videos but his descent into clickbait is a top 10 saddest anime moment for sure :(">[20]</a> gave a presentation about fake news and facts on the internet:</p>
<blockquote><p>I was an optimist. Maybe I was naive about the internet. My thinking about having an international communication system whereby anyone anywhere can share anything — regardless of their education background or their class standing — and get access to real information through Wikipedia. My thinking was the internet was going to make everyone happier and more informed, more educated, and probably more tolerant of others around them.</p>
<p><a href="https://www.youtube.com/watch?v=dvk2PQNcg8w">Post-Truth: Why Facts Don't Matter Anymore</a></p>
</blockquote>
<p>His thesis is about misinformation and intolerance <a class="footnote_link" data-index="21" href="#footnote_text_21" id="footnote_link_21" title="[21] I won't say that advertising and intolerance are directly causally linked, but I will say that stormfront.org has Google Analytics.">[21]</a>, not advertising, but I share his feelings of disappointed optimism. What was once called the information superhighway and touted as all of human knowledge <a href="https://www.youtube.com/watch?v=A81IwlDeV6c" title="The Kids' Guide to the Internet">at your fingertips</a> is now sadistically impossible to navigate, with little tidbits of value hidden beneath mountains of SEO gamification, low-density listicles, promoted posts, and flat-out spam.</p>
<p>When I say that I long for the internet to be small again, I'm not saying I want the clock to roll back in time — that would mean there'd be fewer people connected and I certainly want the internet to be global. But I want it to be personal, and passionate. I want to find things that people made because they enjoyed making them, not because it was the most algorithmically optimal thing to make. I'm sick of communications platforms becoming walled silos because if they allow anyone else to access their data they'd lose their advantage over the analytics that feed their advertising. I'm sick of gmail being synonymous with email. I'm sick of everyone and everything being factored in to a monetization strategy writeup.</p>
<p>For some people, it is a shock that anybody would do anything without the motivator of profit, but this is actually normal. Musicians make music because they like doing it. Artists make art, photographers take photos, programmers make programs, cartographers make maps, linguists make languages, carpenters make furniture, chefs cook, animators animate, sculptors sculpt, and writers write... for fun, it turns out. If you look around in places that aren't ravaged by poverty, where people don't have to scrape by to survive, where people have leisure time to do the things they enjoy, you'll find that it's in human nature to share freely.</p>
<p>The insider scoop around here is that I pay $12 per year for my domain name and $4 per month for web hosting. For email I pay about $0.40 per month <a class="footnote_link" data-index="22" href="#footnote_text_22" id="footnote_link_22" title="[22] Can you believe that it only costs forty cents to get off of gmail? What are you waiting for??">[22]</a>. For storing large quantities of files I pay $0.015 per gigabyte per month as seen <a href="/writing/sharing_photos">here</a>. I run this website for cheap and I pass the savings on to you. If you scoff at this feeble blog and dream of something more impactful, you should know that Hacker News, one of the best forums I know of today, still <a href="https://news.ycombinator.com/item?id=28479595">runs on a single (good) box</a>, as it has for 15 years. <a href="https://news.ycombinator.com/item?id=32319147">Computers</a> are pretty <a href="https://news.ycombinator.com/item?id=28449162">good</a> at what they <a href="https://news.ycombinator.com/item?id=31000450">do</a>, and excellent things can be made and shared on the internet without the help of advertisers. If only you choose to make it happen.</p>
<p>I now reuse this quote, that I might not bungle it:</p>
<blockquote><p>Writing for money and reservation of copyright are, at bottom, the ruin of literature. No one writes anything that is worth writing, unless he writes entirely for the sake of his subject. What an inestimable boon it would be, if in every branch of literature there were only a few books, but those excellent! This can never happen, as long as money is to be made by writing. It seems as though the money lay under a curse; for every author degenerates as soon as he begins to put pen to paper in any way for the sake of gain. The best works of the greatest men all come from the time when they had to write for nothing or for very little.</p>
<p><a href="https://en.wikisource.org/wiki/The_Art_of_Literature/On_Authorship">Arthur Schopenhauer, "On Authorship"</a></p>
</blockquote>
<p>I use adblock and I visit websites which are fueled by ads. I don't whitelist anybody. So I don't have a right to complain or fuss when they eventually shut down, since I was never helping them stay up. That's fine. That's why I <a href="/writing/download_podcasts">download</a> everything that I care about. Ad-supported services live on a treadmill, but I don't.</p>
<p>Suppose I get my wish and ads disappear forever, and every website becomes either purely-free, or subscription-based, or shuts down entirely. Which ones would I pay for? Out of all the ad-supported websites and services that I use today, the only one with content that I consider worth paying for would be Youtube, because video is my favorite medium and I'm well aware that hosting video costs money <a class="footnote_link" data-index="23" href="#footnote_text_23" id="footnote_link_23" title="[23] If I were to pay for Youtube, I'd want the money to be used only for hosting the videos, not for paying the creators. Youtube has gone through periods of prioritizing video length, or watch duration as a percentage, or publication frequency, etc. for controlling the algorithm and payout. Goodhart tells us that distributing the money based on any of these factors will make the creators change their behavior and poison the system. If I want to give the creators any money, I'd use Patreon to pay them directly, and I have done so. The cesspool channels that no one is willing to directly fund, unable to survive without advertisements, would go extinct. We'd also lose some genuinely good creators who can't devote their time to making free videos, and that's a bummer, but it's a sacrifice I'm willing to make in exchange for the higher median quality level.">[23]</a>. If reddit were to die I'd be 50/50 bummed and relieved. <a href="https://pushshift.io/">Pushshift</a> has got it backed up anyway, so as far as historical knowledgebase goes we wouldn't be losing much. Hacker News is already free without ads, though subsidized by YC's business ventures.</p>
<p><a class="footnote_text" data-index="20" href="#footnote_link_20" id="footnote_text_20">[20]</a> I like Veritasium's videos but <a href="https://www.youtube.com/watch?v=S2xHZPH5Sng" title="Veritasium - Clickbait is Unreasonably Effective">his descent into clickbait</a> is a top 10 saddest anime moment for sure :(</p>
<p><a class="footnote_text" data-index="21" href="#footnote_link_21" id="footnote_text_21">[21]</a> I won't say that advertising and intolerance are directly causally linked, but I will say that <a href="/writing/advertixing/stormfront.html">stormfront.org has Google Analytics</a>.</p>
<p><a class="footnote_text" data-index="22" href="#footnote_link_22" id="footnote_text_22">[22]</a> Can you believe that it only costs forty cents to get off of gmail? What are you waiting for??</p>
<p><a class="footnote_text" data-index="23" href="#footnote_link_23" id="footnote_text_23">[23]</a> If I were to pay for Youtube, I'd want the money to be used only for hosting the videos, <strong>not</strong> for paying the creators. Youtube has gone through <a href="https://www.youtube.com/watch?v=Gi6FcI2wFrw" title="RubberNinja - Does Independent Animation Have a Future on YouTube?">periods</a> of prioritizing video length, or watch duration as a percentage, or publication frequency, etc. for controlling <em>the algorithm</em> and payout. Goodhart tells us that distributing the money based on any of these factors will make the creators change their behavior and poison the system. If I want to give the creators any money, I'd use Patreon to pay them directly, and I have done so. The cesspool channels that no one is willing to directly fund, unable to survive without advertisements, would go extinct. We'd also lose some genuinely good creators who can't devote their time to making free videos, and that's a bummer, but it's a sacrifice I'm willing to make in exchange for the higher median quality level.</p>
<p><img alt='A still frame from the film Shrek shows Farquad concluding his grand speech. This is the scene where he says "some of you may die, but that is a sacrifice I am willing to make."' loading="lazy" src="/writing/advertixing/someofyoumaydie.jpg"/></p>
<h3 id="you_paid_for_the_ads">You paid for the ads<a class="header_anchor_link" href="#you_paid_for_the_ads"> (§)</a></h3>
<p>I would like to quote a portion of this champion comment by Hacker News user eevilspock which permanently altered my perspective of advertising. It starts with the "if you're not paying, you're the product" mantra we all know and love, but then takes it a step further which I hadn't seen before:</p>
<blockquote><p>IT'S NOT FREE</p>
<p>We're not Facebook's customers, advertisers are. But we are the advertiser's customers, and the cost of the "free lunch" is simply shifted to the price of the things we buy from them. In other words we still end up paying for the full cost of Facebook. Costs may even shift regressively, to advertised products predominately consumed by those with lower incomes, in which case the poor are subsidizing the better off.</p>
<p>IT'S MORE EXPENSIVE</p>
<p>Not only are you still paying for the full cost of the Facebook product you use, you are paying for all the advertising overhead: the costs of its advertising technology and infrastructure (huge, btw), the agency and creative costs [...], and the advertiser's big marketing departments (that often outnumber and outspend the people making the product!).</p>
<p>[...]</p>
<p>Our identities and privacy are bought and sold to the highest bidders. And where do the bidders get their money? From us of course! A double whammy!</p>
<p><a href="https://news.ycombinator.com/item?id=7485773">https://news.ycombinator.com/item?id=7485773</a></p>
</blockquote>
<p>This comment left a big impact on me and I can't possibly discuss advertising without mentioning it. Whenever I imagine myself getting into a conversation about ads (which is often), I imagine myself paraphrasing this argument.</p>
<p><a href="/writing/advertixing/investopedia_coke.html">Investopedia says that Coca Cola spends $4 billion per year on advertising, out of their $35 billion revenue</a>. Where did Coke get 4 billion dollars to spend on ads? From the customers' pockets, of course. That's a percentage of the cost of every single drink that winds up going to their marketing department so they can make advertisements that you don't want to see. The idea that "ads allow publishers to make things available for free" is cumulatively false because any time you buy a Coke, your money is going to all of the publishers they sponsor (even the ones you don't read) <em>and</em> all of the operational and staffing overhead involved in the advertising machine.</p>
<p><img alt="Illustrated diagram depicts the relationship between Readers, Websites, Companies, and Advertisers. The Reader buys a product from the Company in exchange for three dollar bills. The Company gives one dollar bill to the Advertiser as a salary. The Company gives another dollar bill to the Website as CPI. The Website sends an article to the Reader and the Advertiser sends an advertisement to the Reader. Bright red handwritten text is scrawled across the diagram, &quot;Now that's what I call free&quot;." loading="lazy" src="/writing/advertixing/nowthatswhaticallfree.png"/></p>
<p>Earlier in the article, I said "by displaying a sponsor's advertisement alongside your product, you can earn more money without having to make your product better". In that section I wanted to focus on the publisher's perspective, but there's an interesting dynamic here that we can evaluate from the sponsor's perspective. After all, both parties are hoping to increase their revenue, but they approach it in opposite ways: the publisher reduces the price of their product, possibly down to free, and "makes it up in volume" with the help of the sponsor; meanwhile the sponsor is dishing out money to the publisher, so they need to recoup that cost somehow. Isn't that a bit strange? What techniques are they using to earn that money back, and why couldn't the publisher apply those techniques to their own product in the first place, so they could earn their way without showing ads? Why are so many publishers unable to get enough money from customers' pockets to stay afloat, while Coke is pulling in enough money to support both themselves and the publishers?</p>
<p>It is a brain-wrinkler for sure. I have not figured it out. Perhaps it is like the phrase "those who can, do; those who can't, teach". The alpha males who know how to sell a product become the sponsors, the beta males who can't sell their product take on sponsors. Of course, the sponsors are the ones coming up with disgusting, manipulative psychological tactics to do their selling, so it is not exactly an honorable title. Many of them wouldn't be able to survive without stooping to new lows every week <a class="footnote_link" data-index="24" href="#footnote_text_24" id="footnote_link_24" title="[24] When I see or hear children performing advertisements on tv or radio, it makes my skin crawl. I wasn't sure where else in the article to mention this, so I'm putting it here. It's low.">[24]</a>, but I guess being abusive, uncaring, and ready to kill is what makes one an alpha.</p>
<p>Part of the problem, which I touched on earlier, is that people have been conditioned to not pay for software or websites, whereas we're already accustomed to paying for sodas. But I don't think that's the full answer, because the internet is young compared to the usual suspects of sponsorship advertisements: tv, radio, newspapers, magazines. Television and radio were uniquely dependent on sponsorship revenue because it's not really possible to charge someone for access to a radio frequency unless you encrypt the datastream and sell them the key, which wasn't developed at the time. But print media was, and still is, something that the reader paid for, yet it became swamped with ads quite a long time ago. Were they just too beta to compete the normal way? I don't know yet.</p>
<p>Here is another take by bondarchuk,</p>
<blockquote><p>"What about the revenue the city gets from advertising space?"</p>
<p>Someone pays the city to show me something. That means the ability to show it to me is worth more to them than what they pay the city. It also means that at the end of the day, the money is somehow coming from me, and this amount could be larger than what the city gets out of it, even. Therefore I would actually save money if the city abolished advertising and just raised taxes a little.</p>
<p><a href="https://news.ycombinator.com/item?id=27193190">https://news.ycombinator.com/item?id=27193190</a></p>
</blockquote>
<p>If ads were eliminated from the world, everything could hypothetically be several percent cheaper and:</p>
<ol>
<li><p>You could instead give your money to the publisher directly, which would definitely be more than they get from the CPI of advertising to you, but you only have to pay them if you think their publications are worth buying.</p>
</li>
<li><p>The sponsor would have to focus on building a strong reputation and making a good product, instead of designing ads that manipulate people into thinking they have a good product.</p>
</li>
<li><p>The sponsors who cannot maintain a customerbase without the help of advertisements would go extinct.</p>
</li>
<li><p>The publishers whose products are not good enough to pay for on their own would go extinct.</p>
</li>
<li><p>New businesses would have a hard time getting their first customers, I admit.</p>
</li>
</ol>
<p><img alt="A colorful illustration from the National Science Foundation shows a dead dinosaur lying on its back, its mouth open and foaming green. The land is burnt and trees are reduced to charcoal. In the distance, multiple active volcanoes spew smoke, fire, and lava." loading="lazy" src="/writing/advertixing/extinct.jpg"/></p>
<p>Could this really happen? If the marketing departments vanished overnight, would product sellers actually reduce the cost of their product to match their reduced expenditure? No. Customers have already demonstrated that they are willing to buy it at the current price. But São Paulo has shown that legislators can force the ads to come down. Once the brand is physically unable to buy ad space, they're going to have to redirect their marketing budget somewhere. Sure, they might just hoard the extra cash. But I do think that if a new generation of customers were to be raised in an ad-free world, and a new generation of brands were to be formed with no marketing expenditure, they would see the opportunity to undercut the incumbent brands who forgot to lower their prices, and a shift may occur.</p>
<p>Regarding point 5, it may be reasonable to legislate a maximum advertising expenditure, instead of forcing it all the way down to zero. Suppose we allow businesses to have advertising budgets, but we clamp it down so low as to stay in the "Visit Farmer John's farm for some tasty corn" territory. That is to say, businesses would not be able to spread themselves thin trying to advertise to the whole nation or world, so they'd naturally have to stay more local, putting young businesses on more equal footing with larger brands and re-igniting a real sense of competition over the quality of the product instead of the psychoterroristic manipulation of the advertisement. I'm still glad to have a global internet, of course, but it would be word of mouth that spreads your product far and wide, not your advertisement.</p>
<p>Making this change is like planting a tree: the best time to do it was 20 years ago, the second best time was 19 years ago, the... um... it's better today than never.</p>
<p>I'm sure you will want to remind me of <a href="https://en.wikipedia.org/wiki/Economies_of_scale">economies of scale</a>, and that advertisements help companies reach large scales which bring their unit costs down, thus the price of the product can't necessarily be reduced by exactly the amount of the marketing budget if the marketing department were dissolved. I get it.</p>
<p><a class="footnote_text" data-index="24" href="#footnote_link_24" id="footnote_text_24">[24]</a> When I see or hear children performing advertisements on tv or radio, it makes my skin crawl. I wasn't sure where else in the article to mention this, so I'm putting it here. It's low.</p>
<h2 id="unspoken_agreement_between_publishers_and_visitors">Unspoken agreement between publishers and visitors<a class="header_anchor_link" href="#unspoken_agreement_between_publishers_and_visitors"> (§)</a></h2>
<p>Although I am vehemently against ads, it's time for me to distance myself from one of the common anti-advertisement arguments. I am not a zealot and I will not blindly agree with any anti-advertising stance that comes my way.</p>
<p>Scenario: A website publishes articles and has ads on the page. A user enables adblock and reads the article with no ads. Is this user in the moral right or wrong?</p>
<p>There are some proponents of adblock who will assert that they are in the right because it's their computer and they should have the power to decide what their computer does. In the very same way that I as a human reader can choose to not read paragraphs that begin with the word "But", I should be allowed to have my browser block anything that calls itself <code>&lt;div class="ad"&gt;</code>, and I should be allowed to prevent any <code>ads.js</code> from being executed.</p>
<p><strong>I think this is absolutely true</strong>. It's my computer, it's my electricity, it's my processor cycles, and it's my eyeballs. Nobody should have the right to run unscrupulous code on my computer just because I visited them once. I am under no obligation to see that div if I don't want to. On that front, this argument is sound.</p>
<p><strong>But</strong>, this argument is only good for approximately a single visit before it runs out of steam. When I go to a website for the first time, I don't know how many <code>ads.js</code> they're going to try to hit me with, and I have every right to armor up before clicking the link. For every visit after that, though, the justification is all but lost. You've seen what they're sending you and you don't like it. Why do you keep coming back? You're not obligated to see that div, but you're not obligated to visit that website, either. You're freeloading. It is immensely obvious to me as a reader that the publisher is only allowing me to visit this page because they assume I will see the ads along with it. It is obvious to me that if they could <a href="https://news.ycombinator.com/item?id=37793375" title="Ad blockers are not allowed on YouTube">physically prevent me</a> from reading the page without ads, they would do so.</p>
<p>This is not the same as a reader skipping over paragraphs that start with "But" because those paragraphs are probably not uniquely responsible for the author's income when compared with the other paragraphs. The divs marked <code>class="ad"</code> are uniquely responsible for their income when compared with the other divs. Where do you think the arms race of adblock-block-block-blockers comes from? It is obvious to me that they did not intend for me to read the page for free, and in doing so I am violating the trust they had in my readership.</p>
<p>Notice that word, "trust". Anybody who perpetuates this "it's my computer" argument is being willfully disingenuous and approaching what is obviously a social problem, trust, with a purely technical solution, adblockers. "Your computer sent my computer a bunch of different bytes, and I had my computer filter out some particular bytes before showing it to me, because I prefer reading it that way. It's not my fault that those particular bytes are the ones that make you money. They're just ones and zeroes why do you care so much~".</p>
<p>Using a technological bypass around the social matter of trust does not put you in the moral right, even if you think a page containing ads deserves to be violated. You're not "getting back" at them for wronging you. You could achieve that by leaving, never to return. Even though I've always got my adblocker on, there is a growing list of sites that I simply do not click on, because I resent what they try to send me.</p>
<p>I think there are some cyborgs out there who do not make the link to the social element of this problem, and only see it as a tech issue. These cyborgs are the ones who go around offering technical solutions to the publisher, like suggesting that they should either suck it up or put in a paywall if they want to keep out freeloaders so much. But that's like telling someone they should have locked their doors better after you've wandered around inside their house, and that they should have known someone would sneak in. It is logically accurate but not morally right.</p>
<p>I started by calling this an unspoken agreement, but when you start seeing "please disable adblock to view this page", then it's very much spoken, I think you'll agree.</p>
<p>Do I still use adblock on ad-fueled sites anyway? Yes! Do I treat the "please disable adblock" popups with scorn? Yes!! But you won't see me using this "it's my computer" argument to defend that practice. I'm freeloading because I like freeloading and am willing to recognize it as such. And if being called a freeloader when you use adblock offends you, then I guess you'll have to stop doing it or grow thicker skin.</p>
<h2 id="hailcorporate">HailCorporate<a class="header_anchor_link" href="#hailcorporate"> (§)</a></h2>
<p>There is a subreddit called <a href="https://old.reddit.com/r/HailCorporate">/r/HailCorporate</a>, whose stated purpose is to point out posts on reddit that <em>act as advertisements</em>. This means giving a brand excessive or undue attention, framing photos the way an ad or product placement shot might frame them, and mentioning brand names when they aren't actually relevant to the event at hand. For example, "My box of Toasty Bites fits perfectly between two of the shelves in my pantry!" could have just said "My box of cereal".</p>
<p>The phrase "act as advertisements" is key. Some outsiders visit the subreddit assuming that the purpose of HailCorporate is to identify posts that are actual, paid, what you might call traditional native advertisement posts. Then they see HC users talking about posts which <em>aren't</em> traditional paid ads, and assume HC users are idiots for thinking that those posts <em>are</em> traditional paid ads. You can see how the logic goes, but it's frustrating how many people don't understand the original premise of HC <a class="footnote_link" data-index="25" href="#footnote_text_25" id="footnote_link_25" title="[25] Well, it doesn't help that HC's current tab-title is &quot;ads, ads, everywhere&quot;...">[25]</a>. HC is not about thinking that Toasty Bites literally paid someone to take a photo of their pantry, it's that the photographer had no reason to call the cereal by name but did it anyway. Here are some other values we can learn from HailCorporate:</p>
<ol>
<li><p>You should take pride in what you do, not what you buy. There are a <strong>lot</strong> of posts on reddit that are just pictures of products that the user purchased, still in their boxes, without any subsequent pictures of the products being put to good use. This is sometimes called box posting. People post pictures of unopened hard drives on <a href="https://old.reddit.com/r/datahoarder">/r/datahoarder</a>, new and untouched headphones on <a href="https://old.reddit.com/r/headphones">/r/headphones</a>, unused pens on <a href="https://old.reddit.com/r/pens">/r/pens</a>, translations of Harry Potter in <a href="https://old.reddit.com/r/languagelearning">/r/languagelearning</a>, etc. Like, wow, you... spent money? Wouldn't it be more personal, meaningful, and interesting to the hobby community to share what you actually make and do with these things, rather than just the fact that you bought them? Here's an <a href="https://old.reddit.com/r/HailCorporate/comments/gqeb9o">HC post</a> about a <a href="https://old.reddit.com/r/povertyfinance/comments/gpstkm/">povertyfinance post</a> in which the OP shares a <em>screenshot of the store page</em> for a stove they bought. It's not a box post, it's not even a receipt post, it's just the product listing! How eager for internet affirmation must you be to do this, that you can't even wait until it arrives and is installed <a class="footnote_link" data-index="26" href="#footnote_text_26" id="footnote_link_26" title="[26] For clarity, I'm not questioning the discussion of the stove itself. Home appliances are significant, meaningful purchases, and the whole point of the povertyfinance community is to do well with less. No, my criticism here is that OP could have taken a picture of themselves making a delicious home-cooked meal on their new stove, but they just couldn't wait for that and had to talk about the act of buying instead. This is something we should all learn from, and consider what it is we care about enough to share.">[26]</a>?</p>
<p>Why do people make these posts? First and foremost it's because buying is easy and doing is hard, and people will make posts that are easy to make. Box posts will make the community regulars groan, but sharing something you've actually made opens the door for people to criticize you and your work and the value of your life. Box posting requires no vulnerability. Everyone in the <a href="https://old.reddit.com/r/pens">/r/pens</a> community will like looking at fancy new pens, but they might not like looking at the bad drawings you made with those pens, and that makes box posting the safest option.</p>
<p>I also think a lot of us fall into the mental trap that we're not <strong>real</strong> artists without the best brand of pens; not <strong>real</strong> hikers without the best boots and backpacks; not <strong>real</strong> music enthusiasts without the best headphones. We look at the people doing work we envy, and see that they use expensive equipment, and deduce that the equipment made the work. But this is putting the cart before the horse. Most professionals buy the expensive equipment <em>after</em> they've devoted significant time and energy to the craft.</p>
<p>You've probably heard about people who buy lottery tickets knowing full well they'll never net any money, but they do it because the price of the ticket is worth the small moment they can spend dreaming about winning. This really applies to other purchases too: spend $X00 on something online and enjoy the next 6-8 business days dreaming about all the cool stuff you'll do with it when it arrives... whether or not that actually pans out in the end. Buying is easy and doing is hard.</p>
</li>
<li><p>All publicity is good publicity &amp; Mindshare. Sometimes, a post will come up in HailCorporate where a brand name is juxtaposed with something lewd or offensive. Imagine that someone decides to mock a company by taking a picture of Nazis <a class="footnote_link" data-index="27" href="#footnote_text_27" id="footnote_link_27" title="[27] inb4 Godwin's law.">[27]</a> and replacing the swastikas with the company's logo. Of course it's not a real ad for the company. They didn't pay someone to draw them as Nazis. But it can <em>act as an ad</em> by bringing the brand into the viewer's mind.</p>
<p>Perhaps you've heard of the <a href="https://en.wikipedia.org/wiki/Streisand_effect">Streisand Effect</a>, named after Barbra Streisand after she tried to prevent some photos of her house from being published, but in her efforts attracted more attention to them. Nowadays, the people who know the term Streisand Effect surely outnumber the people who knew or cared about the house. The context for the original publicity can be completely forgotten while the publicity itself remains, and people remember Streisand's name.</p>
<p>Publicity with regards to brands works in the same way. Maybe that company did something bad and the author was inspired to depict them as Nazis for their actions. The author's intention may have been to shame or mock the company, but it doesn't matter. For every 1 person that knows the details of the situation, there are 10 or 100 people who chuckle at the funny picture and move on, but don't otherwise care, and won't internalize the bad thing the company did, and represent a +1 exposure event for the brand. This is especially true when the post gets a lot of upvotes that carry it out of the topic group and into the general sphere of everybody else. Even if the author of the Nazi photo decides to continue mocking the brand and "voting with their wallet" by not buying their products, they've created a huge attention multiplier in favor of the brand.</p>
<p>It's like a spinoff of the <a href="https://en.wikipedia.org/wiki/Miranda_warning">Miranda warning</a>: "anything you say or do can and will be used to help promote the brand". When all is said and done, the offensive "can't possibly be an ad" content still acts like an ad by making people think of the brand when they otherwise wouldn't have, and the impression can remain after the bad part is forgotten <a class="footnote_link" data-index="28" href="#footnote_text_28" id="footnote_link_28" title="[28] One last note: advertisers don't expect ads to make you immediately jump out of your seat to buy something. People like to make fun of car commercials because &quot;Wow, look how happy this family is! I should buy a car!&quot;. No, the point is that when the time comes, the first options that come to your mind will be the ones you've seen the most frequently. Unfortunately for the Nazi photo editor, bad exposures contribute to this frequency just as well as the good ones.">[28]</a>.</p>
<p>Is this to say that we shouldn't speak up when a brand does something bad? It's a tricky subject. If the goal is only to hurt the company, I believe the safest course of action is simply to never utter their name again. Brands hate nothing more than not being talked about, and you've got the right to remain silent. Earlier I talked about recognizing our limits, and in this case we should accept that most of us aren't capable of launching a crusade against a brand without accidentally creating more converts for them. If the problem is a specific product they've made, then a review video clearly demonstrating the failure can be effective, but for abstract topics I'd stay clear.</p>
<p>On the other hand, if the goal is to rescue people who have been duped by the company, proceed with caution. It's hard to get publicity out about the company's bad deed without creating disproportionately more exposure events on the fringes. I don't have an answer here, but my advice would be to stick to well-written and well-documented text content rather than images, since images are more easily consumed by the passersby.</p>
</li>
<li><p>Ads have trained us how to take pictures of objects. That is, with the logo facing the camera. If you notice that your box of Toasty Bites fits perfectly on your pantry shelf, take a moment to think before snapping the picture and drafting a title. You've found a funny coincidence involving the size of two things. Does anybody else on the planet care that one of those things happens to be Toasty Bites, or is it sufficient for them to know that it's cereal? Other than scientific reproducibility, what does advertising the brand name contribute to this charming coincidence you've discovered in your kitchen? I for one am at a complete loss as to why people do this, and yet it's amazingly prevalent <a class="footnote_link" data-index="29" href="#footnote_text_29" id="footnote_link_29" title="[29] Before you think I'm strawmanning, here's one, two, three, four, five, six, seven posts on /r/Perfectfit within a 24 hour period! Big shoutout to this dude who resisted the temptation.">[29]</a>.</p>
<p>I am reminded of Tom Scott's video about the <a href="https://www.youtube.com/watch?v=IJEaMtNN_dM">cooperative principle</a> of language, which discusses the balance of explicit and implicit information in our words. Interesting that the shelf never gets proper attribution for its role in the event, right? Where are all the "My box of Toasty Bites fits perfectly in my Home&amp;House pantry" posts? Ah, but the pantry doesn't have a logo on it <a class="footnote_link" data-index="30" href="#footnote_text_30" id="footnote_link_30" title="[30] Take a look at the things around your house, and notice what has a conspicuous logo or maker's mark, and what doesn't. I find that when something is ubiquitous, essential, or adds obvious value to our lives, it is less likely to have a logo. The less inherently valuable something is, the more likely it will feel the need to aggressively advertise itself.">[30]</a>. We've been trained by advertisements to think that if a product is in frame, it ought to be turned to the camera and the name ought to be read out loud. Advertisers do it that way because they're paid to, but you're not. Feel free to shoot the back side of the cereal box next time.</p>
</li>
</ol>
<p>Once you've gotten past the "awareness" stage of HC, there's not much point visiting the subreddit any more. To do so is a little self-defeating: a bunch of anti-ad people gathered around to look at pictures of brands. In the act of collecting links for this article I've exposed myself to more radiation than I would have received over a normal week. Besides, I personally am no longer interested in reddits-about-reddit. It's the kind of subreddit that you read for a little while and then leave, and that's okay because you'll be leaving with a new perspective on inadvertent advertising.</p>
<p>These days I make a very conscious effort to de-brand my vocabulary. And by conscious I mean that it really does require me to slow down and think about what I say. I no longer use "Google" as a verb, I just say "search the internet" or "search for" or even just "look it up" <a class="footnote_link" data-index="31" href="#footnote_text_31" id="footnote_link_31" title="[31] Context is important, and I'm not so dogmatic as to let this get in the way of communicating my point. For people who are not tech savvy, &quot;go ahead and google xxxxx&quot; is more easily understood than &quot;go ahead and search for xxxxx&quot; because they might not know what kind of search I'm talking about. Remember to know your audience.">[31]</a>. Of course I'm aware of <a href="https://en.wikipedia.org/wiki/Generic_trademark">brand genericization</a>, so maybe I could help accelerate the effect by using the brand name more often, but, eh, no thanks. It does lead to an interesting dissonance where the genericizations that occurred before I knew them feel normal, but the ones which occur now or in the future feel gross. One of my current borderline examples is photoshop, which I hesitate to reduce to just "photo editing" because I want to distinguish between more sophisticated edits and what the average Joe can get out of <a href="https://en.wikipedia.org/wiki/Kid_Pix">Kid Pix</a>.</p>
<p><a class="footnote_text" data-index="25" href="#footnote_link_25" id="footnote_text_25">[25]</a> Well, it doesn't help that HC's current tab-title is "ads, ads, everywhere"...</p>
<p><a class="footnote_text" data-index="26" href="#footnote_link_26" id="footnote_text_26">[26]</a> For clarity, I'm not questioning the discussion of the stove itself. Home appliances are significant, meaningful purchases, and the whole point of the povertyfinance community is to do well with less. No, my criticism here is that OP could have taken a picture of themselves making a delicious home-cooked meal on their new stove, but they just couldn't wait for that and had to talk about the act of buying instead. This is something we should all learn from, and consider what it is we care about enough to share.</p>
<p><a class="footnote_text" data-index="27" href="#footnote_link_27" id="footnote_text_27">[27]</a> inb4 <a href="https://en.wikipedia.org/wiki/Godwin%27s_law">Godwin's law</a>.</p>
<p><a class="footnote_text" data-index="28" href="#footnote_link_28" id="footnote_text_28">[28]</a> One last note: advertisers don't expect ads to make you immediately jump out of your seat to buy something. People like to make fun of car commercials because "Wow, look how happy this family is! I should buy a car!". No, the point is that <em>when the time comes</em>, the first options that come to your mind will be the ones you've seen the most frequently. Unfortunately for the Nazi photo editor, bad exposures contribute to this frequency just as well as the good ones.</p>
<p><a class="footnote_text" data-index="29" href="#footnote_link_29" id="footnote_text_29">[29]</a> Before you think I'm strawmanning, here's <a href="https://old.reddit.com/r/Perfectfit/comments/grju19/" title="This Guinness in my fridge...">one</a>, <a href="https://old.reddit.com/r/Perfectfit/comments/grzlv1/" title="My Nintendo consoles in my new entertainment center">two</a>, <a href="https://old.reddit.com/r/Perfectfit/comments/gryx0a/" title="Papa John's sauce in the bottom of my cup">three</a>, <a href="https://old.reddit.com/r/Perfectfit/comments/griiaq/" title="A box of Chex perfectly fits">four</a>, <a href="https://old.reddit.com/r/Perfectfit/comments/grq6lh/" title="O'Reilly Auto Parts got game.">five</a>, <a href="https://old.reddit.com/r/Perfectfit/comments/grqk3b/" title="Charger Doctor in the house!">six</a>, <a href="https://old.reddit.com/r/Perfectfit/comments/gqybac/" title="Sold this online, and received a package from Amazon today, and the box was the perfect fit for it. So Satisfying!!">seven</a> posts on <a href="https://old.reddit.com/r/Perfectfit">/r/Perfectfit</a> within a 24 hour period! Big shoutout to <a href="https://old.reddit.com/r/Perfectfit/comments/gs6xxe/" title="My pantry shelf and this bottle of vinegar.">this dude</a> who resisted the temptation.</p>
<p><a class="footnote_text" data-index="30" href="#footnote_link_30" id="footnote_text_30">[30]</a> Take a look at the things around your house, and notice what has a conspicuous logo or maker's mark, and what doesn't. I find that when something is ubiquitous, essential, or adds obvious value to our lives, it is less likely to have a logo. The less inherently valuable something is, the more likely it will feel the need to aggressively advertise itself.</p>
<p><a class="footnote_text" data-index="31" href="#footnote_link_31" id="footnote_text_31">[31]</a> Context is important, and I'm not so dogmatic as to let this get in the way of communicating my point. For people who are not tech savvy, "go ahead and google xxxxx" is more easily understood than "go ahead and search for xxxxx" because they might not know what kind of search I'm talking about. Remember to know your audience.</p>
<h2 id="hall_of_shame">Hall of shame<a class="header_anchor_link" href="#hall_of_shame"> (§)</a></h2>
<p>An advertising hall of shame could be infinitely long. This is simply a short list of material I came across or was reminded of while working on this article that I think deserve special disdain.</p>
<p>General internet:</p>
<ul>
<li><p>Facebook, Twitter, Instagram, etc. don't want you to see posts in chronological order, because then you'd know exactly when to stop browsing: when you see something from last time! They'd prefer to scramble things up a little to prioritize popular lowest-common-denominator posts, prevent you from ever feeling truly caught up, and hide ads in the mix all the while.</p>
</li>
<li><p>Mobile games have devolved into <a href="https://www.youtube.com/watch?v=gvQxtotEX-M" title="Tristan Harris on CBS with Anderson Cooper">slot machines</a> with delays, timers, and special events to keep people returning to them frequently throughout the day, achieving enough in each play session to strengthen the addiction but not enough to feel done with the game.</p>
</li>
<li><p>Low quality articles or listicles are often split over several pages so that you can get a fresh load of ads on each page and they can measure how far people are reading (then they can know which corners to cut next time). I'm already sick of pathetic holdovers from physical print in the digital era anyway, but paged online articles are egregiously useless.</p>
</li>
<li><p>Any website that dresses advertisement as user-submitted material:</p>
<p><img alt="A screenshot of The Leica Forum at l-camera-forum.com. A user named humerc asks the question &quot;how to remove white lettering on M10-D?&quot;. Below this, an advertisement appears which looks like a reply. It says &quot;Hi humerc, Take a look here How to remove white lettering on M10-D. I'm sure you'll find what you're looking for!&quot; and it is a link to Amazon wtih an affiliate code. The advertisement says the word &quot;Advertisement&quot; in the place where the username would be, but otherwise looks exactly like a genuine comment, including a bogus post timestamp." loading="lazy" src="/writing/advertixing/l_camera_forum.png"/></p>
</li>
</ul>
<p>Google:</p>
<ul>
<li><p>AMP pages are pages which Google has downloaded from the publishing website and saved in their own caches, so they can serve the content to the user via Google servers. The stated purpose is to make web browsing faster for the end user (because Google's servers are faster than yours). One way to make your website faster and more AMP-eligible is to use sanctioned ad distributors, say for example, oh how about Google Ads? And because the user is actually visiting Google's servers and not yours, Google gets first pickings on all the metrics they want to harvest from the user. Don't worry, publishers, no one's forcing you to use AMP, but oh don't forget that AMP pages will rank higher in search than non-AMP pages because Google owns the search too :-).</p>
</li>
<li><p>Google brought updates to Chrome and AMP to make <a href="https://news.ycombinator.com/item?id=20256917">AMP URLs appear as if they were being served from the original domain</a>. This continues their mission of keeping people comfortably swaddled in Google-hosted content without giving their poor fragile hearts a scare by showing them the actual google.com/amp URL they're visiting.</p>
</li>
</ul>
<p>Microsoft:</p>
<ul>
<li><p>Windows start menu advertisements:</p>
<p><img alt='A screenshot of the Windows start menu includes multiple advertisements for games and software under the labels "Explore" and "Play"' loading="lazy" src="/writing/advertixing/windows_start_menu.jpg"/></p>
</li>
<li><p><a href="https://news.ycombinator.com/item?id=30388788">Outlook just asked me if I want to upgrade to bigger ads</a></p>
<p><img alt='A screenshot of Microsoft Outlook. A dialog presents the user with a choice. "Choose the ads experience that is right for you on web and mobile." The option called "Maximum screen space" reads "This experience maximises screen space by showing ads in your mailbox. Outlook web will load faster". The option called "Bigger ads on web" reads "This experience will show multiple ads on the sides of the screen on web. Outlook web may load more slowly".' loading="lazy" src="/writing/advertixing/outlook_inline_ads.jpg"/></p>
</li>
<li><p><a href="/writing/advertixing/bleepingcomputer_windows_explorer.html">Microsoft is testing ads in the Windows 11 File Explorer</a></p>
<p><img alt='A screenshot of Windows Explorer. Above the list of files, an important-looking banner with a triangle exclamation mark alert symbol reads "Write with confidence across documents, email, and the web with advanced writing suggestions from Microsoft Editor".' loading="lazy" src="/writing/advertixing/windows_explorer.png"/></p>
</li>
</ul>
<p>Youtube, the system:</p>
<ul>
<li><p>"The algorithm" takes by <a href="https://www.youtube.com/watch?v=KW0eUrUiyxo">CGP Grey</a>, <a href="https://www.youtube.com/watch?v=BSpAWkQLlgM">Tom Scott</a>, <a href="https://www.youtube.com/watch?v=LKp2gikIkD8">Folding Ideas</a>.</p>
</li>
<li><p><a href="https://www.youtube.com/watch?v=L-x8DYTOv7w">YouTubers have to declare ads. Why doesn't anyone else?</a> by Tom Scott.</p>
<p>I'd like to take this opportunity to <del>advertise</del> <em>tell you about</em> my own program, <a href="https://git.voussoir.net/voussoir/ycdl">YCDL</a>, which presents me with a custom interface for subscribing to, watching, and downloading videos. Imagine watching youtube without a "recommendation" feed, autoplay, unrelated spam, or algorithmic determination of what does or doesn't show in the sub box. As long as you can tolerate the slower channel refresh cycle.</p>
<p>I'd also like to <del>advertise</del> spread the word about <a href="https://sponsor.ajay.app/">SponsorBlock</a>, a browser extension which automatically skips in-video sponsorship segments based on crowdsourced reports. The database can be freely downloaded so you could hypothetically implement a system for sponsorblocking locally saved videos. This would be great, since I was just about ready to starting excising them with ffmpeg.</p>
</li>
</ul>
<p>Youtubers, the people:</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Elsagate">Elsagate</a> (<a href="https://www.youtube.com/watch?v=LKp2gikIkD8" title="Weird Kids' Videos and Gaming the Algorithm">Folding Ideas</a>).</li>
<li><a href="https://www.youtube.com/watch?v=tSI-kj9A_pc" title="STOP DOING THIS - Strange Asian Holes - iDubbbz">Strange Asian Holes</a>.</li>
<li>Five minute crafts (<a href="https://www.youtube.com/watch?v=pvqa8dsBtno" title="Debunking Fake Videos &amp; WHO'S behind 5-min crafts?">How To Cook That</a>, <a href="https://www.youtube.com/watch?v=4EXVrzOACv4&amp;t=15m42s" title="Cooking Food On The Internet For Fun And Profit">Folding Ideas</a>).</li>
<li><a href="https://www.youtube.com/results?search_query=primitive+technology">Copycats</a> riding on the coattails of <a href="https://youtube.com/channel/UCAL3JXZSzSm8AlZyD3nQdBA">Primitive Technology</a>. Notice their awkward titles creaking under the weight of SEO keywords, their clickbaity photoshopped thumbnails, and their "child holding item to camera with a Wow face" cheapshots. OG PT would never do this. (<a href="https://www.youtube.com/watch?v=RiGDwQy6eoE">JonTron</a>). (Temporal note: youtube has reduced the search ranking of the copycats since I included this so you will have to scroll down a bit. Great!)</li>
<li><p>Linus Tech Tips descends into thumbnail hell.</p>
<p><img alt="" loading="lazy" src="/writing/advertixing/linustechtips.jpg"/></p>
</li>
</ul>
<p>Reddit:</p>
<ul>
<li><p><a href="https://old.reddit.com/r/modnews/comments/704bt8/experiment_new_and_improved_onboarding_for_reddit/dn0a7yu/">In 2017</a>, reddit removed the word "(optional)" from the email field of their registration form, despite the fact that it's still optional. One justification is password recovery, the other is advertising and data collection.</p>
</li>
<li><p>reddit now places advertisements (oops, I mean, "promoted posts" (promoted by advertisers)) in line with real posts. I don't know when this started, but ads used to be relegated to the sidebar only.</p>
</li>
<li><p>Newreddit is designed mobile-first and media-first, designed for scrolling through images and videos on your phone. The <a href="http://www.paulgraham.com/hackernews.html">Fluff Principle</a> says that easy-to-judge content will dominate a vote-based system, and reddit is more than happy to enable that.</p>
</li>
<li><p>Newreddit has implemented a feature where clicking on the "X comments" link from a listing page will display the comment thread in a sort of modal, and clicking outside the modal will close the comments and show the listing again (in the <a href="https://en.wikipedia.org/wiki/Single-page_application">SPA</a> style where you've never actually navigated off the first page). They want it to be as easy as possible for you to bail on a topic and come back to the firehose laced with <del>ads</del> promoted posts.</p>
</li>
<li><p>Newreddit likes to show a measly two comments to logged-out users before suggesting that they redirect to another post, because dilly-dallying in the comments section doesn't make them money. This isn't on on some kind of overview page, this is on the actual /comments URL where you'd expect all 51 comments to be visible. This example gets bonus points for the fact that they're suggesting I leave a text post to see a fluff image post.</p>
<p><img alt="A screenshot from reddit.com shows a post. The interface says that there are 51 comments, but there are only two comments shown. A button at the bottom is available to load the rest. Below this, a different post from the subreddit is slightly visible. The design of the webpage encourages the reader to scroll down to the next post instead of reading the comments of the post they're already on." loading="lazy" src="/writing/advertixing/newreddit_only_two_comments.png"/></p>
</li>
<li><p>Moderators begged site staff for multiple <em>weeks</em> to have more control over the kinds of awards that can be put on posts, because some awards are being used to troll sensitive topics (<a href="https://old.reddit.com/r/ModSupport/comments/fut93p/please_consider_giving_subs_the_ability_to/">one</a>, <a href="https://old.reddit.com/r/ModSupport/comments/ghn9be/inappropriate_reddit_community_awards_used_for/">two</a>, <a href="https://old.reddit.com/r/ModSupport/comments/gj3h05/now_getting_harassing_message_sent_through_reddit/">three</a>, <a href="https://old.reddit.com/r/ModSupport/comments/gve2id/can_the_admins_please_disable_certain_awards/">four</a>, <a href="https://old.reddit.com/r/ModSupport/comments/hc4efv/reddit_community_awards_continue_to_be_used_for/">five</a>, <a href="https://old.reddit.com/r/ModSupport/search?q=awards&amp;restrict_sr=on&amp;include_over_18=on&amp;sort=relevance&amp;t=all">you get the point</a>). After hemming and hawing and espousing continued "support" and "appreciation" and "we hear you"s, staff have finally put the Yikes award <a href="https://old.reddit.com/r/ModSupport/comments/gwlvtq/put_your_money_where_your_mouth_is_remove_the/">on pause</a>. Just that one, and not the others. It only took them an unjust death and nationwide protesting and rioting to finally lift their finger towards disabling a single source of income <a class="footnote_link" data-index="32" href="#footnote_text_32" id="footnote_link_32" title="[32] You might think that reddit gold and their other newfangled abominations don't belong on an article about advertising, since it's a form of direct monetization for the site, essentially a donation. That's partially true, but the important difference between reddit gold and just donating money to reddit is the visibility of that golden badge. When you see someone else's post with a nice shiny gold on it, that's a prominent reminder that regular people, just like you!, can make a post so cool or funny that it earns a gold star from a total stranger. Gee whiz, if only I were that cool or funny! I'd better stay on reddit and keep trying until I get one too! Many young people will get sucked into the trap of striving for this pseudonymous congratulations and fame, and making ad impressions the whole while. As if the upvotes weren't bad enough.">[32]</a>.</p>
</li>
<li><p>In <a href="https://old.reddit.com/r/modnews/comments/hmd17x/karma_experiment/">2020</a>, site staff started an experiment that adds "award karma" as a separate karma category. "Our goals with this change are to recognize awarding as a key part of the Reddit community and to drive more of it, ... Awarding is an important part of our direct-to-consumer revenue; it complements advertising revenue and gives us a strong footing to pursue our mission into the future. By giving awards, users not only recognize others but also help Reddit in its mission to bring more community and belonging to the world". Oh, so that's what the awards system developers have been working on while ignoring all the other issues. Got it.</p>
</li>
</ul>
<p>Video games:</p>
<ul>
<li>Nakey Jakey put together a video on <a href="https://www.youtube.com/watch?v=q7PBNHyaoDc">ads in games</a> featuring games that are nothing but ads as well as PP in ordinary games.</li>
</ul>
<p>Smart appliances:</p>
<ul>
<li><p><a href="https://www.youtube.com/watch?v=N9kiSEhbLXs" title="Samsung Ads Life Runs Through Us Web">"At Samsung, life runs through us. Your advertising should too."</a></p>
<p><img alt="Still frame from Samsung's video. Four adults and three children are on the couch, excitedly smiling, jumping, and raising their hands in the air. Superimposed text reads &quot;At Samsung, life runs through us&quot;." loading="lazy" src="/writing/advertixing/samsung_advertising_1.jpg"/></p>
<p><img alt="Still frame from Samsung's video. A television is shown. The television shows a skier on a mountain slope, but the lower half of the screen is obscured by large interface elements and an advertisement." loading="lazy" src="/writing/advertixing/samsung_advertising_2.jpg"/></p>
<p><a href="/writing/advertixing/samsungads.html">No one knows the Samsung household better</a>. Not even the families that live there.</p>
<p><img alt="A screenshot from Samsung's business page. A man and his son are in the kitchen with a large television hanging on the wall. Beside the photo is a caption reading &quot;Audience is Everything. The Samsung Ads audience has everything you need ... young families, millennials, auto intenders, and more — no one knows the Samsung household better.&quot;" loading="lazy" src="/writing/advertixing/samsung_advertising_3.png"/></p>
</li>
<li><p><a href="https://9to5google.com/2020/08/18/android-tv-homescreen-ads-turn-off-staff-picks/">Android TV's homescreen ads are rolling out</a></p>
<p><img alt="A screenshot from 9to5google's article. A television shows a main menu for choosing channels and apps. The upper third of the screen is occupied by an ad for the film Moana." loading="lazy" src="/writing/advertixing/android_tv.png"/></p>
</li>
<li><p><a href="/writing/advertixing/vizio_jump_ads.html">Vizio TVs are now showing banner ads over live TV</a></p>
<p><img alt="A screenshot of flatpanelhd's article showing so-called Jump Ads, a banner advertisement superimposed over a television show." loading="lazy" src="/writing/advertixing/vizio_jump_ads.png"/></p>
</li>
</ul>
<p>Retail IRL:</p>
<ul>
<li><p><a href="/writing/advertixing/coolerscreens.html">Cooler Screens</a> creates giant display screens that cover up the refrigerators in grocery stores so they can <del>show advertisements instead of what's actually in the fridge</del> provide the retail experience consumers want and deserve.</p>
<p><img alt="A screenshot of coolerscreens.com. A retail store refridgerator is shown with a large screen occupying the whole front of each refridgerator door. The screen shows idealized photos of products that are presumably inside the refridgerator. Some of the screens have banner ads at the top highlighting particular brands." loading="lazy" src="/writing/advertixing/cooler_screens.png"/></p>
</li>
<li><p>Other destruction of public space:</p>
<p><img alt="A photo of a gas pump at a gas station. On top of the pump is a screen showing an ad for hot sauce." loading="lazy" src="/writing/advertixing/mobil_gas.jpg"/></p>
<p><img alt="A photo of four urinals in a public restroom. Each of the urinals has a digital screen integrated into the body of the urinal, angled upward towards the guest. The screens show products and branding." loading="lazy" src="/writing/advertixing/urinals.jpg"/></p>
<p>The subway stations in Toronto, Canada <a href="https://www.youtube.com/watch?v=tXcmyUtCmCo" title="Designing Better Next Train Arrival Screens - RMTransit">show advertisements</a> on the signs that are supposed to help you find your train. The vestigial timing clock is relegated to a third of the screen.</p>
<p><a href="https://www.youtube.com/watch?v=tXcmyUtCmCo"><img alt="A photo taken inside a subway station. A digital screen hangs from the ceiling. The left two thirds of the screen are an advertisement for a restaurant. The right one third of the screen shows the time of the next arriving train and the weather." loading="lazy" src="/writing/advertixing/toronto_subway.jpg"/></a></p>
</li>
</ul>
<p>Here's a fun comment from Hacker News user skizm that I wasn't sure where else in this article to quote:</p>
<blockquote><p>I really do feel like there are two versions of the internet. One for people who aggressively use ad-blockers, pay for premium (non-ad) versions of things, manage their inboxes well, and generally are tech savvy enough to avoid 95% of unwanted advertising. Then there's everyone else who just accept the hundreds of ads washing over them at all times, that 60% of their screen real-estate is for ads, are completely comfortable with auto-playing videos, that are okay sitting through 30-second ads before watching a random funny video on youtube, etc. The second category can be sub-divided by motivations (some don't know there's a better way, some don't think it's worth the effort, etc.), but the resulting experience is the same no matter where you fall in group 2.</p>
<p>Here's the (a?) kicker: advertisers are willing to pay orders of magnitude more to get ads in front of group 1. They'll pour so many resources into it that they'll make everything "worse" for group 2. Group 1 adjusts their filters (both technical and mental), get back to neutral, but the rest of the internet is just a little worse off going forward because advertisers and publishers saw a very slight up tick in clicks after their scorched earth campaign to reach group 1. Rinse and repeat until we find ourselves where we are now.</p>
<p>I used to think that over time group 2 members would trickle into group 1, sort of like how programmers and hackers were using Google before it was cool and slowly the world followed, but that doesn't seem to be happening. Personally I'm seeing the groups continuing to divide. Group 2 really just doesn't see the problems, doesn't care, or isn't willing to put in the slightest effort to improve their interactions with technology and the internet.</p>
<p>My "favorite" outcome of all this is when a member of group 1 is forced to use a device owned by someone in group 2 and are horrified at what they see (favorite because it is equal parts sad and funny).</p>
<p><a href="https://news.ycombinator.com/item?id=31070801">https://news.ycombinator.com/item?id=31070801</a></p>
</blockquote>
<p><a class="footnote_text" data-index="32" href="#footnote_link_32" id="footnote_text_32">[32]</a> You might think that reddit gold and their other newfangled abominations don't belong on an article about advertising, since it's a form of direct monetization for the site, essentially a donation. That's partially true, but the important difference between reddit gold and just donating money to reddit is the visibility of that golden badge. When you see someone else's post with a nice shiny gold on it, that's a prominent reminder that regular people, just like you!, can make a post so cool or funny that it earns a gold star from a total stranger. Gee whiz, if only I were that cool or funny! I'd better stay on reddit and keep trying until I get one too! Many young people will get sucked into the trap of striving for this pseudonymous congratulations and fame, and making ad impressions the whole while. As if the upvotes weren't bad enough.</p>
<h2 id="enacting_change">Enacting change<a class="header_anchor_link" href="#enacting_change"> (§)</a></h2>
<p>I believe that the world is simple and there really aren't that many underlying, secret forces. The big things in our world are simply made of smaller things. Advertising is not an indivisible phenomenon that we can pack away into a clean little box and banish from society. It is an emergent property of incentives, <a href="https://en.wikipedia.org/wiki/Game_theory">game theory</a>, <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar's number</a>, psychology, information, trust, greed, and consumers who don't stand up for themselves. It is difficult to stamp out because it is a result of our natural traits.</p>
<p>But we have a lot of natural traits that we suppress in the name of decency or common good. We don't pee on the ground, for one. We have outlawed murder, burglary, kidnapping. We don't even allow child labor. These things are crimes because even though a few members of society benefit from them, the majority of society doesn't, and the majority got together and put it on the books. Advertising is similar. The beneficiaries are few, the violated are many, we just have to do something about it.</p>
<p>Some will say that banning advertisements is impossible because we run into challenges regarding the nature of free speech. What, am I not allowed to say I like a product any more? This is the kind of question people will smugly ask when you suggest that ads should be banned, because it's an easy strawman and the answer is no. I will continue to be in favor of word of mouth. But as soon as the brand starts paying people to say those things, or giving them free items in return, it's advertising. Others will say that there is no point in banning advertising since it would go underground and be hard to audit. To this, I remind you that we already ban other kinds of fraud and bribery, and I think it will be difficult for Coke to spend four billion dollars underground. <a href="https://en.wikipedia.org/wiki/Pareto_principle">The Pareto principle</a> reassures us that we can make a big difference without auditing 100% of everything.</p>
<p>Outlawing advertisements, or at least clamping advertising expenditure, will not happen quickly. In the meantime, we as the public should block as many advertisements from our lives as we can, to reduce the amount of money the publishers and sponsors earn and drive them into the ground unless they get their act together. If they have any survival instincts, they'll come up with a new plan. If they don't, RIP.</p>
<p>I have said much about banning advertisements, or legislating limitations against them. Indeed, it is easy to sit back and pray that an abstract legislative force from on high will come and solve the problem for us. But I spent some time thinking about <a href="/writing/everything_is_politics">politics</a> recently, and I want to say again here that there is no politics external from ourselves. We are the politics and we are the legislation. If you stop watching ads, and teach your children to not watch ads, and they teach their children to not watch ads, the next generations of politicians will be politicians against ads. Be a role model.</p>
<p>Please,</p>
<ul>
<li>Install <a href="https://github.com/gorhill/uBlock">an adblocker</a>.</li>
<li>Install <a href="https://sponsor.ajay.app/">SponsorBlock</a>.</li>
<li>Use tools to <a href="/writing/download_podcasts#cutting_ads">cut advertisements out</a> of other forms of media.</li>
<li>Stop reading, watching, and listening to publishers that make their ads unskippable.</li>
<li>Download the things you care about to preserve them from tomorrow's link rot.</li>
<li>Donate a few dollars to people who make things you like.</li>
<li>Encourage others to do the same.</li>
</ul>
<p>In discussions of politics, you will sometimes hear people say "if you don't like it, get out". This is a <a href="https://en.wikipedia.org/wiki/Thought-terminating_clich%C3%A9">small-minded position</a>, and if you've read the 23,000 words leading up to this point in the article, you probably don't say that. These people think that the past <a href="https://en.wikipedia.org/wiki/Cradle_of_civilization">twelve thousand years</a> of tumultuous human history have come to a sudden stop, and the present situation will remain static from here on out. Unlikely. In a sense, installing an adblocker is one part of "getting out". It is removing myself from the environment where I see ads. I did not need to write this article. I could have sat down and shut up and turned off my computer and stopped going outside, and I'd be "out". But I'm not content with that. The world is not static, it is going to change, and I'd like to contribute to the way it changes.</p>
<p>Are ads truly necessary for our survival? If everyone followed these steps, would the world grind to a halt, burst into flames, go up in smoke, go down the drain? There's only one way to find out! Follow your heart. Don't waste your time thinking about whether you have some moral obligation to watch an advertisement in order to keep the world functioning properly. If you don't want to see ads, then stop seeing ads. Let the rest of the world figure out for themselves how they're going to keep their blood pumping. Their income is not your responsibility.</p>
<p>Here's a message from Jackie Chan, <a href="https://www.youtube.com/watch?v=Z1PCtIaM_GQ&amp;t=8m16s" title="Every Frame a Painting - Jackie Chan - How to Do Action Comedy">speaking to filmmakers</a>:</p>
<blockquote><p>Whatever you do, do the best you can, because the film lives forever. "No, because, that day was raining, and the actor didn't have time...". Would you go to every theater to tell the audience? No! The audience sees in the theater: good movie, bad movie, that's all.</p>
</blockquote>
<p>I think about this quote very often because it applies to every kind of published work and, indeed, our whole economy. As agents in a free market, we do not need to contort ourselves into sympathizing with whatever decisions led to the inclusion of advertisements in a product; we just need to say "bad movie" and pick something else. It is the seller's responsibility to make good work and earn our favor.</p>
<h2 id="my_virtues">My virtues<a class="header_anchor_link" href="#my_virtues"> (§)</a></h2>
<p>Here are my promises to you, reader.</p>
<p>If I come up with a program or website that I think is a worthy venture to make money from, I'll do so via one-time purchases, well-justified subscriptions, or <a href="/donate">donations</a>, not advertisements. And as you know I publish plenty of what I make <a href="https://git.voussoir.net/voussoir">for free</a>.</p>
<p>The website you are reading now will always be free of third-party ads. If your adblocker ever reports more than 0 hits, it's probably due to URL patterns or CSS names, so please let me know and I will fix it. Obviously this is a website about myself so in a sense I'm generally advertising myself, but it's your choice to come here and read about me.</p>
<p>I would like to try my hand at making videos from time to time again, and I have thoughts about getting into other forms of online media like podcasting or making short films. If and when I do, they'll be free of ads.</p>
<p>Will I ever work for a company that makes some of its money from ads? Almost certainly yes, since that's the state of almost every organization and unfortunately I can't let my idealism keep me incomeless. But I will seek organizations and positions that provide value to the world, and will avoid those that seem corrupt.</p>
<h2 id="conclusion">Conclusion<a class="header_anchor_link" href="#conclusion"> (§)</a></h2>
<p>I started working on this article in March 2020, and I'm very glad to be through with it. It's one of the reasons I started writing at all. I've picked it up and put it down and felt guilty about not completing it too many times. One of the things I find difficult about writing is that because I spend so much time thinking about the topic, by the time I'm done I feel like the ideas are boring or lame. I have to remind myself that the creators of the stuff I watch and read probably feel the same way, and I should finish this article instead of sitting on it forever. I hope at least some part was interesting or new to you. Or maybe it is lame!</p>
<p>I honestly think that enforcing a maximum dollar cap on advertising expenditure is worth a try. I'm willing to accept that some amount of advertising is necessary for businesses to exist, and for me to be able to buy things instead of having to grow my own food and make my own furniture and invent my own internet; but we need to keep them on a leash. So many of us are sick of mega-billion dollar companies ruining the world and then publishing ads of smiling babies. The amount of advertising we are subjected to is not fundamentally necessary, and any claims that it is are pure spin. As they say "it is difficult to make a man understand something if his salary depends on his not understanding it".</p>
<p>Marry and reproduce.</p>

<hr/>
<p><a href="https://git.voussoir.net/voussoir/voussoir.net/commits/master/voussoir.net/writing/advertixing/advertixing.md">View this document's history</a></p>
<ul>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/24b897115615531bb24581fde300adf50f691362"><time datetime="2023-12-18T19:45:01-08:00">2023-12-18</time> Add link to Accursed Farms covid bleep.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/c513e38a9388ddcaab9e46e12eecb50808a736d2"><time datetime="2023-12-17T12:41:53-08:00">2023-12-17</time> Minor prose changes, and re-recorded entire narration.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/e897cbda011a6890e293687a86d620a23ce29ea5"><time datetime="2023-09-18T21:10:58-07:00">2023-09-18</time> Add l-camera-forum.com to the hall of shame.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/3475cb0abf63172e6392487ffaf41755f71a18e3"><time datetime="2023-09-18T21:01:09-07:00">2023-09-18</time> Replace github links with git.voussoir.net.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/666367782964a4878e58187366b6ddf450328833"><time datetime="2023-09-12T19:05:29-07:00">2023-09-12</time> Add link to my spam page.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/3311eb00ae75f114a6c014bda079b6d846dff342"><time datetime="2023-07-02T21:24:54-07:00">2023-07-02</time> Rewrite the section on cookies.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/b3331453f5ce07ae90e31a607bcd6d8787eddded"><time datetime="2023-06-04T14:28:28-07:00">2023-06-04</time> Add link to view_in_app.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/83c384b864c13b3bdce84b93e555ad73b8a704fa"><time datetime="2023-05-15T20:54:59-07:00">2023-05-15</time> Add link to freetelly.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/0eca048df691834681798ac896bf1718806a4376"><time datetime="2023-05-15T20:49:28-07:00">2023-05-15</time> Add LTT to hall of shame.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/fd3ecf90da4f410820fe5f44e0f85f29fa43f5bf"><time datetime="2023-05-15T20:47:13-07:00">2023-05-15</time> Change link to e_unibus_pluram.html.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/5349b2a43dd32c1ed2dbfadd2abead0cc804a6ee"><time datetime="2023-04-02T17:01:49-07:00">2023-04-02</time> Add link to Maslow's hierarchy of needs.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/18df1a56827029357e0ba4366f62a82b2de10293"><time datetime="2023-02-24T19:47:31-08:00">2023-02-24</time> Add advertixing.flac, img alttext, and many text changes.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/fcf4f522120d5b61e81ace20f54e1f1fb5d1c9a0"><time datetime="2023-01-01T14:07:15-08:00">2023-01-01</time> Add Nakey Jakey video.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/4557150dda9f0e701b57146f229c1776e739e597"><time datetime="2022-09-15T22:11:35-07:00">2022-09-15</time> Fix typo "if you think".</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/4599f2b824e01335bff4ee061e69d1c17027b1ff"><time datetime="2022-06-12T12:07:59-07:00">2022-06-12</time> Add link to Wikipedia "Cradle of civilization".</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/fe628838a39fbf6e89375cf4dce7663d384a8f51"><time datetime="2022-06-12T10:52:36-07:00">2022-06-12</time> Fix mismatched tense "make deals ... and performing".</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/0f7e59ed02c23611d2b3036317dc58acefca060e"><time datetime="2022-06-12T10:46:46-07:00">2022-06-12</time> Add skizm's comment.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/2fad01d10e09e08bbe5ddb6db35f66c1c69c0373"><time datetime="2022-06-12T10:45:27-07:00">2022-06-12</time> Add link to Creator Insider's profanity video.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/93ad7923f688f123ab043a659b2bb47f8cda9113"><time datetime="2022-04-13T22:10:09-07:00">2022-04-13</time> Fix typo "povertyfinance post post".</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/ca6cfd72fadc0783f5bea36942abb473c5f51c96"><time datetime="2022-04-13T11:52:50-07:00">2022-04-13</time> Add cookies section.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/9875bc696fb3242dae035bf3f72b7ba036cfd1e5"><time datetime="2022-04-13T11:35:38-07:00">2022-04-13</time> Add Jackie Chan quote.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/2b966be6357c073043dc2b5b64edc448a559a43b"><time datetime="2022-04-07T02:28:48-07:00">2022-04-07</time> I messed up my own link!</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/d0b1276c85768163826a076ca5c33b7fe3088150"><time datetime="2022-04-02T12:50:22-07:00">2022-04-02</time> Add more faff about smart TVs.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/bcdbf0cf34d262a49c9e6c3dee0ee1e8a36c02e8"><time datetime="2022-03-20T02:38:15-07:00">2022-03-20</time> Add RMTransit subway screenshot.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/3eca89902b1f675ac050486226aeac3552cfaa6c"><time datetime="2022-03-19T21:54:25-07:00">2022-03-19</time> I mixed up Zipf's law and the Pareto principle.</a></li>
<li><a href="https://git.voussoir.net/voussoir/voussoir.net/commit/aa6f5dfae739d2b628a4916660fecc790aaaf856"><time datetime="2022-03-15T18:00:09-07:00">2022-03-15</time> Add advertixing.md.</a></li>
</ul>
<address>Contact me: writing@voussoir.net</address>
<p>If you would like to subscribe for more, add this to your RSS reader: <a href="/writing/writing.atom" rel="alternate" type="application/atom+xml">https://voussoir.net/writing/writing.atom</a></p>
</article>
            
            


