Browse Source

automated update from build.py

main
Colin McMillen 1 year ago
parent
commit
c9fe2bd34f
  1. 25
      blog/20070502-robot-behaviors-python.html
  2. 25
      blog/20070522-emacs-tips.html
  3. 25
      blog/20070522-gnokii-tips.html
  4. 25
      blog/20070522-latex-tips.html
  5. 25
      blog/20070807-vim-tips.html
  6. 25
      blog/20190403-update.html
  7. 25
      blog/20200209-sneak.html
  8. 25
      blog/20210721-downvotes-considered-harmful.html
  9. 88
      blog/20221107-goodbye-twitter.html
  10. 82
      blog/index.html
  11. 25
      drafts/test.html
  12. 31
      feed.atom
  13. 58
      index.html
  14. 25
      publications.html
  15. 25
      resume.html
  16. 25
      sigbovik/index.html
  17. 2
      sitemap.txt

25
blog/20070502-robot-behaviors-python.html

@ -22,7 +22,28 @@
<meta name="twitter:description" content="Generators are a powerful feature of the Python programming language. In a nutshell, generators let you write a function that behaves like an iterator. The standard approach to programming robot behaviors is based on state machines. However, robotics code is full of special cases, so a complex behavior will typically end up with a lot of bookkeeping cruft. Generators let us simplify the bookkeeping and express the desired behavior in a straightforward manner. (Idea originally due to Jim Bruce.)">
</head>
<body>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
@ -204,7 +225,7 @@
<div id="footer">
<div class="content">
&copy; 2021 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>

25
blog/20070522-emacs-tips.html

@ -22,7 +22,28 @@
<meta name="twitter:description" content="These are some emacs keybindings (and other functions) that I once found useful. I’ve mostly used Sublime Text for the last few years, however. Editing">
</head>
<body>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
@ -69,7 +90,7 @@
<div id="footer">
<div class="content">
&copy; 2021 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>

25
blog/20070522-gnokii-tips.html

@ -22,7 +22,28 @@
<meta name="twitter:description" content="I own a Nokia 6102i phone (provided by Cingular). gnokii is a Linux program that lets me interface with the phone. Here are some recipes: File I/O">
</head>
<body>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
@ -69,7 +90,7 @@ VLC seems to be able to play <code>.3gp</code> files, but the audio doesn&rsquo;
<div id="footer">
<div class="content">
&copy; 2021 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>

25
blog/20070522-latex-tips.html

@ -22,7 +22,28 @@
<meta name="twitter:description" content="Note that these instructions are over a decade old. Some documentation may be out of date. :) Embedding fonts in PDFs">
</head>
<body>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
@ -66,7 +87,7 @@ PJQNOS+CMSY10 Type 1 yes yes no 12 0
<div id="footer">
<div class="content">
&copy; 2021 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>

25
blog/20070807-vim-tips.html

@ -22,7 +22,28 @@
<meta name="twitter:description" content="Here’s some links about learning/mastering vim. Why use vim?">
</head>
<body>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
@ -52,7 +73,7 @@
<div id="footer">
<div class="content">
&copy; 2021 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>

25
blog/20190403-update.html

@ -22,7 +22,28 @@
<meta name="twitter:description" content="It’s been nearly two months since my last day at Google, so I guess I should finally make use of this newsletter :) I wrote a paper which was published on April 1st as part of SIGBOVIK 2019: “93% of Paint Splatters are Valid Perl Programs”. In this paper, I answer a long-standing open problem in the programming languages community: is it possible to smear paint on the wall without creating valid Perl?">
</head>
<body>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
@ -79,7 +100,7 @@
<div id="footer">
<div class="content">
&copy; 2021 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>

25
blog/20200209-sneak.html

@ -22,7 +22,28 @@
<meta name="twitter:description" content="I can’t believe it’s here so quickly, but: today marks a year since my last day at Google. That seemed like a good occasion to dust off this newsletter &amp; let you know what I’ve been up to: making a videogame! I’m working on a stealth-based 2D platformer where you don’t have to kill anyone unless you want to. It’ll be possible to get through every level by sneaking and misdirection, but it’ll require you to be careful and tactical to do so… and of course if that doesn’t work out, you can always draw your swords and go in fighting! So far I’ve given it “Sneak” as a codename, but that’s definitely a placeholder until I can flesh out more of the world.">
</head>
<body>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
@ -53,7 +74,7 @@
<div id="footer">
<div class="content">
&copy; 2021 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>

25
blog/20210721-downvotes-considered-harmful.html

@ -22,7 +22,28 @@
<meta name="twitter:description" content="If you’re letting users rank content, you probably don’t need and don’t want downvotes. Here’s why. (This post inspired by news that Twitter is considering adding “Dislikes” to Tweets.)">
</head>
<body>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
@ -84,7 +105,7 @@
<div id="footer">
<div class="content">
&copy; 2021 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>

88
blog/20221107-goodbye-twitter.html

@ -0,0 +1,88 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/png" href="/favicon.ico">
<link rel="canonical" href="https://www.mcmillen.dev/blog/20221107-goodbye-twitter.html">
<link rel="alternate" type="application/atom+xml" href="https://www.mcmillen.dev/feed.atom" title="Colin McMillen's Blog - Atom">
<title>Goodbye Twitter, Hello Blog! | Colin McMillen</title>
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Quicksand:wght@500;700&display=block" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Fira+Mono:500&display=block" rel="stylesheet">
<link rel="stylesheet" href="/pygments.css">
<link rel="stylesheet" href="/style.css">
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@mcmillen">
<meta name="twitter:title" content="Goodbye Twitter, Hello Blog! | Colin McMillen">
<meta name="twitter:description" content="It’s quickly become clear that the acquisition of Twitter by Elon Musk means the end of the site as I’ve known it since 2008. Instead I’m going to collect all the stuff I would have tweeted about &amp; post it to this blog roughly once a week. If you have an RSS reader you can follow along there. I’ve also created a subreddit where I’ll link to each post, so that folks can follow via Reddit if they prefer, and also comment on what I’ve written. I’d also appreciate comments over email! My goal is to post fewer things, more thoughtfully, to a smaller audience for a while, and see how that goes.">
</head>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
<div id="header">
<div class="content">
<a href="/" class="undecorated">Colin McMillen</a>
<span style="float: right;"><a href="/feed.atom"><img src="/img/rss.svg" alt="Atom feed" style="width: 17px; height: 17px; margin-bottom: 1px;"></a></span>
<span style="float: right;"><a href="https://twitter.com/mcmillen"><img src="/img/twitter.svg" alt="@mcmillen"></a></span>
</div>
</div>
<div class="content">
<h1 id="goodbye-twitter-hello-blog">Goodbye Twitter, Hello Blog!</h1>
<p><em>Posted 2022-11-07.</em></p>
<p>It&rsquo;s quickly become clear that the acquisition of Twitter by Elon Musk means the end of the site as I&rsquo;ve known it since 2008. Instead I&rsquo;m going to collect all the stuff I <em>would</em> have tweeted about &amp; post it to this blog roughly once a week. If you have an RSS reader you can <a href="https://mcmillen.dev/feed.atom">follow along there</a>. I&rsquo;ve also created a <a href="https://www.reddit.com/r/mcmillen">subreddit</a> where I&rsquo;ll link to each post, so that folks can follow via Reddit if they prefer, and also comment on what I&rsquo;ve written. I&rsquo;d also appreciate comments over <a href="mailto:email@example.com">email</a>!</p>
<p>My goal is to post <strong>fewer things, more thoughtfully, to a smaller audience</strong> for a while, and see how that goes.</p>
<h2 id="deleting-your-twitter-responsibly">Deleting your Twitter responsibly</h2>
<p>I&rsquo;d figured Elon Musk&rsquo;s &ldquo;free speech idealism&rdquo; was code for a slow regression back to a Nazi-sympathetic swamp of toxicity, but I hadn&rsquo;t quite expected him to <em>immediately</em> light user trust on fire. Musk seems to be determined to squeeze every drop of revenue from the site in order to make up for his foolhardy acquisition, so I think it&rsquo;s only a matter of time before he starts selling user data to third-party companies.</p>
<p>So instead of just deleting my Twitter account wholesale, I&rsquo;ve <a href="https://help.twitter.com/en/managing-your-account/how-to-download-your-twitter-archive">downloaded my Twitter archive</a> and set up <a href="https://tweetdeleter.com/">TweetDeleter</a> to delete almost all my data, including Tweets, Retweets, and Likes. Right now I have it set up to automatically delete anything older than 2 days old. I expect that after a month passes I&rsquo;ll be posting to Twitter a lot less (if at all) and will just manually remove old content then.</p>
<p>I&rsquo;m intending to keep my Twitter account registered and to occasionally log in, rather than deleting it entirely. That way I can maintain a pointer to this blog in my bio, and not have to worry about someone impersonating me if Twitter someday decides to reap &amp; reissue old usernames.</p>
<p>For a more nuanced approach to deleting your Twitter content than &ldquo;burning all of it as quickly as possible&rdquo;, consider <a href="https://twitter.com/ryanqnorth/status/1418543853167071232">this 2021 thread from Ryan North</a>.</p>
<h2 id="hows-your-blog-work">How&rsquo;s your blog work?</h2>
<p>This site is authored with Markdown. I have a short Python script that converts the entire thing to static HTML, so I can still author posts in my favorite text editor (<a href="https://www.sublimetext.com/3">Sublime Text 3</a>) or even draft things on-the-go with a Markdown app like <a href="https://joplinapp.org/">Joplin</a>. This means I&rsquo;m not reliant on anyone else&rsquo;s fancy GUI editor, and also means it&rsquo;s pretty future-proof in case I ever <em>do</em> want to move my content to another site for some reason.</p>
<h2 id="why-not-substack-medium-etc">Why not Substack / Medium (etc)?</h2>
<p>Many people have moved to tools like Substack &amp; Medium for writing longer-form articles. I&rsquo;ve definitely considered those sites as well, but it&rsquo;s hard to be sure that they won&rsquo;t <em>also</em> go &ldquo;boom&rdquo; due to reasons entirely outside my control sometime in the next few years. There&rsquo;s already something like a 15-year-long gap in my online presence due to Google+ and Twitter melting down in various ways. I&rsquo;d feel like a bit of a sucker to be relying on anyone other than myself to host my content, at this point.</p>
<h2 id="why-not-mastodon">Why not Mastodon?</h2>
<p><a href="https://joinmastodon.org/">Mastodon</a> seems like the most obvious choice as a Twitter replacement, but I&rsquo;m not actually sure that I <em>want</em> a Twitter replacement. As I said up top, I&rsquo;m gonna try posting fewer things, more thoughtfully. A new app that lets me rapidly tap out hot takes isn&rsquo;t exactly a good way of supporting that.</p>
<p>I might eventually make a Mastodon account to <em>follow</em> other folks who&rsquo;ve departed Twitter, so I&rsquo;m not counting out the idea entirely. :)</p>
<h2 id="comments">Comments?</h2>
<p>Chime in on <a href="">this article&rsquo;s Reddit thread</a> or send me an <a href="mailto:email@example.com">email</a>.</p>
</div>
</div>
<div id="footer">
<div class="content">
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>
</body>
</html>

82
blog/index.html

@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/png" href="/favicon.ico">
<link rel="canonical" href="https://www.mcmillen.dev/https://mcmillen.dev/blog/">
<link rel="alternate" type="application/atom+xml" href="https://www.mcmillen.dev/feed.atom" title="Colin McMillen's Blog - Atom">
<title>Colin McMillen's Blog</title>
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Quicksand:wght@500;700&display=block" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Fira+Mono:500&display=block" rel="stylesheet">
<link rel="stylesheet" href="/pygments.css">
<link rel="stylesheet" href="/style.css">
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@mcmillen">
<meta name="twitter:title" content="Colin McMillen's Blog">
<meta name="twitter:description" content="Colin McMillen's Blog">
</head>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
<div id="header">
<div class="content">
<a href="/" class="undecorated">Colin McMillen</a>
<span style="float: right;"><a href="/feed.atom"><img src="/img/rss.svg" alt="Atom feed" style="width: 17px; height: 17px; margin-bottom: 1px;"></a></span>
<span style="float: right;"><a href="https://twitter.com/mcmillen"><img src="/img/twitter.svg" alt="@mcmillen"></a></span>
</div>
</div>
<div class="content">
<h1 id="mcmillens-blog">mcmillen&rsquo;s blog</h1>
<p>Don&rsquo;t forget to follow with your favorite <a href="https://mcmillen.dev/feed.atom">RSS reader</a>!</p>
<h3 id="goodbye-twitter-hello-blog-2022-11-07"><a href="20221107-goodbye-twitter.html">Goodbye Twitter, Hello Blog!</a> (2022-11-07)</h3>
<p>It’s quickly become clear that the acquisition of Twitter by Elon Musk means the end of the site as I’ve known it since 2008. Instead I’m going to collect all the stuff I would have tweeted about &amp; post it to this blog roughly once a week. If you have an RSS reader you can follow along there. I’ve also created a subreddit where I’ll link to each post, so that folks can follow via Reddit if they prefer, and also comment on what I’ve written. I’d also appreciate comments over email! My goal is to post fewer things, more thoughtfully, to a smaller audience for a while, and see how that goes.</p>
<h3 id="downvotes-dislikes-considered-harmful-2021-07-21"><a href="20210721-downvotes-considered-harmful.html">Downvotes &amp; Dislikes Considered Harmful</a> (2021-07-21)</h3>
<p>If you’re letting users rank content, you probably don’t need and don’t want downvotes. Here’s why. (This post inspired by news that Twitter is considering adding “Dislikes” to Tweets.)</p>
<h3 id="a-new-year-a-sneaky-new-project-2020-02-09"><a href="20200209-sneak.html">A new year &amp; a sneaky new project</a> (2020-02-09)</h3>
<p>I can’t believe it’s here so quickly, but: today marks a year since my last day at Google. That seemed like a good occasion to dust off this newsletter &amp; let you know what I’ve been up to: making a videogame! I’m working on a stealth-based 2D platformer where you don’t have to kill anyone unless you want to. It’ll be possible to get through every level by sneaking and misdirection, but it’ll require you to be careful and tactical to do so… and of course if that doesn’t work out, you can always draw your swords and go in fighting! So far I’ve given it “Sneak” as a codename, but that’s definitely a placeholder until I can flesh out more of the world.</p>
<h3 id="my-first-paper-in-10-years-2019-04-03"><a href="20190403-update.html">My first paper in 10 years?!</a> (2019-04-03)</h3>
<p>It’s been nearly two months since my last day at Google, so I guess I should finally make use of this newsletter :) I wrote a paper which was published on April 1st as part of SIGBOVIK 2019: “93% of Paint Splatters are Valid Perl Programs”. In this paper, I answer a long-standing open problem in the programming languages community: is it possible to smear paint on the wall without creating valid Perl?</p>
<h3 id="93-of-paint-splatters-are-valid-perl-programs-2019-04-01"><a href="https://www.mcmillen.dev/sigbovik/">93% of Paint Splatters are Valid Perl Programs</a> (2019-04-01)</h3>
<p>TLDR: read the paper and view the gallery of pretty Perl programs. In this paper, we aim to answer a long-standing open problem in the programming languages community: is it possible to smear paint on the wall without creating valid Perl?</p>
</div>
</div>
<div id="footer">
<div class="content">
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>
</body>
</html>

25
drafts/test.html

@ -22,7 +22,28 @@
<meta name="twitter:description" content=" Test Page">
</head>
<body>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
@ -182,7 +203,7 @@ vim config.yml
<div id="footer">
<div class="content">
&copy; 2021 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>

31
feed.atom

@ -4,7 +4,7 @@
<title>Colin McMillen's Blog</title>
<link href="https://www.mcmillen.dev"/>
<link rel="self" href="https://www.mcmillen.dev/feed.atom"/>
<updated>2021-07-21T20:53:40-04:00</updated>
<updated>2022-11-07T15:10:00-04:00</updated>
<author>
<name>Colin McMillen</name>
</author>
@ -487,4 +487,33 @@ PJQNOS+CMSY10 Type 1 yes yes no 12 0
<updated>2021-07-21T12:00:00-04:00</updated>
</entry>
<entry>
<title>Goodbye Twitter, Hello Blog!</title>
<id>https://www.mcmillen.dev/blog/20221107-goodbye-twitter.html</id>
<link rel="alternate" href="https://www.mcmillen.dev/blog/20221107-goodbye-twitter.html"/>
<content type="html">
<![CDATA[
<h1 id="goodbye-twitter-hello-blog">Goodbye Twitter, Hello Blog!</h1>
<p><em>Posted 2022-11-07.</em></p>
<p>It&rsquo;s quickly become clear that the acquisition of Twitter by Elon Musk means the end of the site as I&rsquo;ve known it since 2008. Instead I&rsquo;m going to collect all the stuff I <em>would</em> have tweeted about &amp; post it to this blog roughly once a week. If you have an RSS reader you can <a href="https://mcmillen.dev/feed.atom">follow along there</a>. I&rsquo;ve also created a <a href="https://www.reddit.com/r/mcmillen">subreddit</a> where I&rsquo;ll link to each post, so that folks can follow via Reddit if they prefer, and also comment on what I&rsquo;ve written. I&rsquo;d also appreciate comments over <a href="mailto:email@example.com">email</a>!</p>
<p>My goal is to post <strong>fewer things, more thoughtfully, to a smaller audience</strong> for a while, and see how that goes.</p>
<h2 id="deleting-your-twitter-responsibly">Deleting your Twitter responsibly</h2>
<p>I&rsquo;d figured Elon Musk&rsquo;s &ldquo;free speech idealism&rdquo; was code for a slow regression back to a Nazi-sympathetic swamp of toxicity, but I hadn&rsquo;t quite expected him to <em>immediately</em> light user trust on fire. Musk seems to be determined to squeeze every drop of revenue from the site in order to make up for his foolhardy acquisition, so I think it&rsquo;s only a matter of time before he starts selling user data to third-party companies.</p>
<p>So instead of just deleting my Twitter account wholesale, I&rsquo;ve <a href="https://help.twitter.com/en/managing-your-account/how-to-download-your-twitter-archive">downloaded my Twitter archive</a> and set up <a href="https://tweetdeleter.com/">TweetDeleter</a> to delete almost all my data, including Tweets, Retweets, and Likes. Right now I have it set up to automatically delete anything older than 2 days old. I expect that after a month passes I&rsquo;ll be posting to Twitter a lot less (if at all) and will just manually remove old content then.</p>
<p>I&rsquo;m intending to keep my Twitter account registered and to occasionally log in, rather than deleting it entirely. That way I can maintain a pointer to this blog in my bio, and not have to worry about someone impersonating me if Twitter someday decides to reap &amp; reissue old usernames.</p>
<p>For a more nuanced approach to deleting your Twitter content than &ldquo;burning all of it as quickly as possible&rdquo;, consider <a href="https://twitter.com/ryanqnorth/status/1418543853167071232">this 2021 thread from Ryan North</a>.</p>
<h2 id="hows-your-blog-work">How&rsquo;s your blog work?</h2>
<p>This site is authored with Markdown. I have a short Python script that converts the entire thing to static HTML, so I can still author posts in my favorite text editor (<a href="https://www.sublimetext.com/3">Sublime Text 3</a>) or even draft things on-the-go with a Markdown app like <a href="https://joplinapp.org/">Joplin</a>. This means I&rsquo;m not reliant on anyone else&rsquo;s fancy GUI editor, and also means it&rsquo;s pretty future-proof in case I ever <em>do</em> want to move my content to another site for some reason.</p>
<h2 id="why-not-substack-medium-etc">Why not Substack / Medium (etc)?</h2>
<p>Many people have moved to tools like Substack &amp; Medium for writing longer-form articles. I&rsquo;ve definitely considered those sites as well, but it&rsquo;s hard to be sure that they won&rsquo;t <em>also</em> go &ldquo;boom&rdquo; due to reasons entirely outside my control sometime in the next few years. There&rsquo;s already something like a 15-year-long gap in my online presence due to Google+ and Twitter melting down in various ways. I&rsquo;d feel like a bit of a sucker to be relying on anyone other than myself to host my content, at this point.</p>
<h2 id="why-not-mastodon">Why not Mastodon?</h2>
<p><a href="https://joinmastodon.org/">Mastodon</a> seems like the most obvious choice as a Twitter replacement, but I&rsquo;m not actually sure that I <em>want</em> a Twitter replacement. As I said up top, I&rsquo;m gonna try posting fewer things, more thoughtfully. A new app that lets me rapidly tap out hot takes isn&rsquo;t exactly a good way of supporting that.</p>
<p>I might eventually make a Mastodon account to <em>follow</em> other folks who&rsquo;ve departed Twitter, so I&rsquo;m not counting out the idea entirely. :)</p>
<h2 id="comments">Comments?</h2>
<p>Chime in on <a href="">this article&rsquo;s Reddit thread</a> or send me an <a href="mailto:email@example.com">email</a>.</p>
]]>
</content>
<updated>2022-11-07T12:00:00-04:00</updated>
</entry>
</feed>

58
index.html

@ -22,7 +22,28 @@
<meta name="twitter:description" content="Previously at Google, reCAPTCHA, &amp; Carnegie Mellon. ">
</head>
<body>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
@ -42,31 +63,17 @@ Previously at Google, reCAPTCHA, &amp; Carnegie Mellon.</p>
<p><a href="https://twitter.com/mcmillen"><img alt="@mcmillen" src="/img/twitter.svg"></a> <a href="https://twitter.com/mcmillen">@mcmillen</a></p>
<p><a href="mailto:email@example.com"><img alt="email" src="/img/email.svg"></a> <a href="mailto:email@example.com">colin at mcmillen dot dev</a></p>
<p><a href="https://git.mcmillen.dev/mcmillen?tab=activity"><img alt="Git" src="/img/git.svg"></a> <a href="https://git.mcmillen.dev/mcmillen?tab=activity">git.mcmillen.dev</a></p>
<p>For more details, check my <a href="resume.html">resumé</a> &amp; <a href="publications.html">publications</a>.</p>
<script>
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
</script>
<!-- [![Git](/img/git.svg)](https://git.mcmillen.dev/mcmillen?tab=activity) [git.mcmillen.dev](https://git.mcmillen.dev/mcmillen?tab=activity) -->
<p>Check out my <a href="blog/">blog</a>, <a href="resume.html">resumé</a>, &amp; <a href="publications.html">publications</a>.</p>
<h2 id="latest-updates">Latest Updates</h2>
<p>Sign up for updates via my <a href="https://tinyletter.com/mcmillen">email newsletter</a> or your favorite <a href="/feed.atom">RSS reader</a>.</p>
<p>Sign up for updates via your favorite <a href="/feed.atom">RSS reader</a>.</p>
<ul>
<li>
<p><a href="blog/20221107-goodbye-twitter.html">Goodbye Twitter, Hello Blog!</a>, 2022-11-07.<br>
Why I&rsquo;m deleting my Tweets and moving elsewhere.</p>
</li>
<li>
<p><a href="blog/20210721-downvotes-considered-harmful.html">Downvotes &amp; Dislikes Considered Harmful</a>, 2021-07-21.<br>
If you&rsquo;re letting users rank content, you probably don&rsquo;t need and don&rsquo;t want downvotes. Here&rsquo;s why.</p>
</li>
@ -88,7 +95,7 @@ Previously at Google, reCAPTCHA, &amp; Carnegie Mellon.</p>
</li>
</ul>
<h2 id="videogames">Videogames</h2>
<p>Currently playing: <strong>Persona 5</strong>, <strong>Monster Hunter Rise</strong>, &amp; <strong>Slipways</strong>.<br>
<p>Currently playing: <strong>Death Stranding</strong>, <strong>Triangle Strategy</strong>, and <strong>Divinity: Original Sin 2</strong>.<br>
Sometimes I stream on Twitch!</p>
<p><a href="https://twitch.tv/FamiColin"><img alt="Twitch" src="/img/twitch.svg"></a> <a href="https://twitch.tv/FamiColin">FamiColin</a></p>
<p><a href="https://steamcommunity.com/id/FamiColin/"><img alt="Steam" src="/img/steam.svg"></a> <a href="https://steamcommunity.com/id/FamiColin/">FamiColin</a></p>
@ -103,9 +110,6 @@ Sometimes I stream on Twitch!</p>
<p>I proposed to my spouse in <a href="https://www.perlmonks.org/?node_id=384100">obfuscated Perl</a>, which got illustrated in <a href="http://phdcomics.com/comics/archive.php?comicid=824">PHD Comics</a>.</p>
</li>
</ul>
<h2 id="recent-photo">Recent Photo</h2>
<p><img alt="Park At Dusk" src="https://pbs.twimg.com/media/E3K1nuHXwAEYWIh?format=jpg&amp;name=large"></p>
<p>Park at dusk, 2021-06-05 from my <a href="https://twitter.com/mcmillen/status/1401382131117531137">#dailyphoto</a> thread on Twitter.</p>
<h2 id="news-articles">News Articles</h2>
<p>A selection of news articles &amp; books in which I&rsquo;ve been featured or quoted:</p>
<ul>
@ -190,7 +194,7 @@ Sometimes I stream on Twitch!</p>
<div id="footer">
<div class="content">
&copy; 2021 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>

25
publications.html

@ -22,7 +22,28 @@
<meta name="twitter:description" content="Thresholded-Rewards Decision Problems: Acting Effectively in Timed Domains. Colin McMillen.">
</head>
<body>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
@ -102,7 +123,7 @@ Proceedings of the International Conference on Intelligent Autonomous Systems, M
<div id="footer">
<div class="content">
&copy; 2021 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>

25
resume.html

@ -22,7 +22,28 @@
<meta name="twitter:description" content="Lead Developer February 2020 – Present">
</head>
<body>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
@ -57,7 +78,7 @@ September 1999 &ndash; May 2003</p>
<div id="footer">
<div class="content">
&copy; 2021 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>

25
sigbovik/index.html

@ -22,7 +22,28 @@
<meta name="twitter:description" content="TLDR: read the paper and view the gallery of pretty Perl programs. In this paper, we aim to answer a long-standing open problem in the programming languages community: is it possible to smear paint on the wall without creating valid Perl?">
</head>
<body>
<script>
function fixEmails() {
const mailtoArray = [
'm', 'a', 'i', 'l', 't', 'o', ':',
'c', 'o', 'l', 'i', 'n', '@',
'm', 'c', 'm', 'i', 'l', 'l', 'e', 'n',
'.', 'd', 'e', 'v'];
const mailtoLink = mailtoArray.join('');
const anchors = document.getElementsByTagName('a');
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.href == 'mailto:email@example.com') {
anchor.href = mailtoLink;
if (anchor.innerText == 'colin at mcmillen dot dev') {
anchor.innerText = mailtoLink.substring(7);
}
}
}
}
</script>
<body onload="fixEmails()">
<div id="page-container">
<div id="content-wrap">
@ -61,7 +82,7 @@
<div id="footer">
<div class="content">
&copy; 2021 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
&copy; 2022 <a href="/" class="undecorated">Colin McMillen</a>. No cookies, no tracking.
</div>
</div>
</div>

2
sitemap.txt

@ -6,6 +6,8 @@ https://www.mcmillen.dev/blog/20070807-vim-tips.html
https://www.mcmillen.dev/blog/20190403-update.html
https://www.mcmillen.dev/blog/20200209-sneak.html
https://www.mcmillen.dev/blog/20210721-downvotes-considered-harmful.html
https://www.mcmillen.dev/blog/20221107-goodbye-twitter.html
https://www.mcmillen.dev/blog/index.html
https://www.mcmillen.dev/index.html
https://www.mcmillen.dev/language_checklist.html
https://www.mcmillen.dev/papers/Drenner-2002-ICRA-final.pdf

Loading…
Cancel
Save