<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Steve Klabnik — Life</title><description>Personal reflections, life updates, and non-technical writing.</description><link>https://steveklabnik.com/</link><item><title>Ten Years of Ru...ewriting my website</title><link>https://steveklabnik.com/writing/ten-years-of-ru---ewriting-my-website/</link><guid isPermaLink="true">https://steveklabnik.com/writing/ten-years-of-ru---ewriting-my-website/</guid><description>December 21 is the anniversary of when I first heard about Rust way back in 2012. I used to write yearly posts about it; the last time I did was in 2018 . That makes today ten years. I thought I’d have something big to say here, but… I just don’t. Part of that is because I…</description><pubDate>Wed, 21 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;December 21 is the anniversary of when I first heard about Rust way back in
2012. I used to write yearly posts about it; the last time I did was &lt;a href=&quot;../six-years-with-rust&quot;&gt;in
2018&lt;/a&gt;. That makes today ten years. I thought I’d have
something big to say here, but… I just don’t.&lt;/p&gt;
&lt;p&gt;Part of that is because I haven’t written a blog post since late 2020.
Part of &lt;em&gt;that&lt;/em&gt; is well, &lt;em&gt;gestures wildly at everything&lt;/em&gt;, but another part of it
is that the way I had set up my website was cool, but fragile, and I didn’t have
the time or energy to keep up with it.&lt;/p&gt;
&lt;p&gt;You see, last time I had basically taken a starter project for a new framework
I had never used before, and just kinda wrote code until it works. That’s one
of the joys of having your own website; you can do whatever you want with it,
including things you wouldn’t do in a professional context. The downside is that
you can do whatever you want with it, including things you wouldn’t do in a
professional context. My RSS feed has been broken for who knows how long, and
I just couldn’t muster up the effort to fix it.&lt;/p&gt;
&lt;p&gt;So last night, I did something new: I did the tutorial for a new framework I
had never used before, and wrote code until it works.&lt;/p&gt;
&lt;p&gt;Yeah yeah that’s funny and all, but I actually feel much better about things
this time. We’ll see how I feel in six months. The framework this time is
&lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;, and I think it’s really neat. At some point after
I do some more with it and digest some more of the way that it works, I’ll give
a more thorough writeup, but I find the &lt;a href=&quot;https://docs.astro.build/en/concepts/why-astro/&quot;&gt;Why Astro?&lt;/a&gt; page on their
site does a good job of explaining.&lt;/p&gt;
&lt;p&gt;Why not a Rust based framework? I want to do more in that space too, but the goal
here is to stretch my legs, and using a language (TypeScript, in this case) that
I don’t use often is more interesting than the thing I use daily.&lt;/p&gt;
&lt;p&gt;However, one little thing did come up during the development of this project
that I thought was kind of amusing, in a ‘compare and contrast’ kind of way.&lt;/p&gt;
&lt;p&gt;I like for my blog to have entries grouped by year. There’s no database in this
project, so I have to sort things myself. Here’s the relevant code as it stands
today, with some small omissions for clarity:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;astro&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import type { MarkdownInstance } from &quot;astro&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;const allPosts = await Astro.glob(&apos;../pages/writing/*.md&apos;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;let allPostsByDate = (() =&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; posts&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { [&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; MarkdownInstance&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Record&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;any&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&gt;[] } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    allPosts.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; year &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Date&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(post.frontmatter.pubDate).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getFullYear&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; array &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; posts[year.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        // if this is the first post of this year, we have to create the inner array&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;array &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;array.&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            posts[year.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        posts[year.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(post);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; posts;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;})();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;const years = Object.keys(allPostsByDate).reverse();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;BaseLayout&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;This is my blog.&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {years.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;year&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;{year}&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            {allPostsByDate[year].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;BlogPost&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; url&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{post.url} &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{post.frontmatter.title} /&gt;)}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ))}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;BaseLayout&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I’m sure there’s like, ten thousand things wrong with this code; like I said,
TypeScript beginner over here. I figured this stuff out myself, there’s
probably a better way to do these things, but this works. (Okay, actually while
writing this I realized I didn’t sort &lt;em&gt;within&lt;/em&gt; the years, so the real code now
handles that too, but I left it out because it’s not super relevant to the issue
at hand here.)&lt;/p&gt;
&lt;p&gt;This is a pretty classic “I’m doing something in a scripting language” style
setup: you make some sort of data structure out of maps (or objects in this
case, of course) and arrays, and then spit it out in some form. But TypeScript
prefers types, it’s right there in the name! And I had configured TypeScript
to be in its strictest mode, becuase I like types too. Here’s the one big type
annotation I had to use:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; posts&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { [&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; MarkdownInstance&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Record&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;any&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&gt;[] } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If I didn’t put a type on &lt;code&gt;posts&lt;/code&gt;, it complains later in the program:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;`Element implicitly has an &apos;any&apos; type because expression of type &apos;string&apos; can&apos;t be used to index type &apos;{}&apos;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  No index signature with a parameter of type &apos;string&apos; was found on type &apos;{}&apos;.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It needs a bit of help to figure out the type here. Figuring out how to say
“hey this is on object with string keys and arrays of &lt;code&gt;MarkdownInstance&lt;/code&gt; as
values” took me a second, but it’s not too bad. But I did struggle with it a bit,
first to figure out why I was getting the error in the first place, and second
so that I could fix it. I kinda laughed at struggling with types in this dymanic
feeling context.&lt;/p&gt;
&lt;p&gt;So anyway, I also had to do a bit of translating markdown files; I had exported
all of my old posts from Notion, but I couldn’t just plop them in and expect
them to work; Notion doesn’t give you the metadata in a frontmatter block, for
starters. I have something like 200 posts, so doing this by hand is &lt;em&gt;just&lt;/em&gt;
annoying enough that I said “I bet I can code this up faster than if I did it
all by hand, even with a vim macro.”&lt;/p&gt;
&lt;p&gt;But by now, I was in “get stuff done” mode, so I decided to switch back to Rust.
The program I wrote needed to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open each markdown file in the directory.&lt;/li&gt;
&lt;li&gt;Try to parse out the metadata.&lt;/li&gt;
&lt;li&gt;use that metadata to write out a new file, with a new filename, and the
metadata in a more friendly format.&lt;/li&gt;
&lt;li&gt;Delete the old file.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is a classic scripting task! But at this point, I know how to do it in Rust
easier than in a scripting language. I started like this:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;console&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt; cargo new migrate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt; cd migrate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt; cargo add anyhow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt; cargo add walkdir&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt; code &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And ended up writing this:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;rust&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; anyhow&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Result&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Write&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    fs&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;File&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    path&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;PathBuf&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; walkdir&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;WalkDir&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;()&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; from &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;skip&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;from: {}&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, from);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; entry &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; WalkDir&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(from) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; entry &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; entry&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Processing: &apos;{}&apos;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, entry&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;display&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; entry&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;file_type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;is_dir&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            continue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; contents &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; fs&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;read_to_string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(entry&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;())&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;contents[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;---&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;            println!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;already migrated, skipping&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            continue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; header&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Vec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;_&gt; &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; contents&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lines&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;take&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;collect&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;header[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;# &quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;            eprintln!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;couldn&apos;t read title, skipping&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            continue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; title &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;header[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;header[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Blog: &quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;            eprintln!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;couldn&apos;t read blog, skipping&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            continue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; blog &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;header[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;to_ascii_lowercase&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos; &apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;-&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;header[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Date: &quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;            eprintln!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;couldn&apos;t read date, skipping&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            continue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; date &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;header[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;header[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Slug: &quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;            eprintln!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;couldn&apos;t read slug, skipping&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            continue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; slug &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;header[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        dbg!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(slug);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; mut&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; slug &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; PathBuf&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(slug);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        slug&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;set_extension&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;md&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; output &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; entry&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; output_path &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; output&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(slug);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;writing to: {}&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, output_path&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;display&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; mut&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; output &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; File&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;output_path)&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        write!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            output,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            &quot;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;layout: ../../layouts/MarkdownPostLayout.astro&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;title: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;pubDate: {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;blog: {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;---&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            title, date, blog&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        )&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; line &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; contents&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lines&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;skip&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;            writeln!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(output, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;{}&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, line)&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        fs&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;remove_file&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(entry&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;())&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    Ok&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;76 lines. Not too bad. This is &lt;em&gt;quick and dirty&lt;/em&gt;, it is not perfect. For
example, like ten of my posts had no ‘blog’ metadata (that tells me which of
my old blogs the post was originally written for), and so it didn’t work on
them. I still needed to do some small cleanup, but I wanted to double check
every post anyway, so that was fine.&lt;/p&gt;
&lt;p&gt;But there’s a few other things that are kind of amusing to me about this code:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I struggled with types in the scripty scenario above, but I did not here. I
am more experienced with Rust so that’s probably it, but I needed to annotate
one type, just like in the TypeScript.&lt;/li&gt;
&lt;li&gt;I didn’t deal with lifetimes at all. Owned values, baby! And passing references
to some functions.&lt;/li&gt;
&lt;li&gt;I didn’t deal with memory at all. No borrow checker complaints, none of that.
It didn’t take me any extra time to “think about ownership and borrowing.”&lt;/li&gt;
&lt;li&gt;It didn’t take me that long to write this. You can actually see a vestigial
thing of how it was implemented, can you spot the &lt;code&gt;dbg!&lt;/code&gt; statement? I wrote
each part in sequence, printing out the information to manually validate that
it looked correct, and then eventually adding the “write new file” and
“delete old file” stuff when I was sure the process would complete correctly.
Lots of copy/paste there too, as you can see. I don’t care. I’m never using
this code again now that the migration is done. That’s also why I didn’t try
to do some sort of struct and “deserialize” the contents, instead just
parsing it out like I’d never heard of the term “parsing” before. It’s fine.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So yeah, I had too many type problems in my ‘real’ JavaScript program, and no
type problems in my script-y Rust. Kinda funny.&lt;/p&gt;
&lt;p&gt;I guess I have ended up making this a post about Rust anyway, even though I
didn’t think I had much to say when I started. Now that Rust has grown so much,
people who love it are using it for all kinds of things, and sometimes that
seems to piss some people off. “You can’t use a systems language for scripting
tasks, nooo!!” they cry. If you had asked me ten years ago if I should write web
backends in Rust or replace shell scripts with Rust, I’d have said the same
thing. But now that I’ve used Rust enough, a lot of those sort of generic
complaints about Rust don’t speak to my actual experience: I had a problem, I
wrote ~70 lines of code in not very much time, problem solved. Seems like Rust
worked just as well as anything else would have. Yes, it’s true that maybe if
you’ve just picked up the language, you’d have written that code much more
slowly than in another language you’re more familiar with, or maybe you’d have
hit some sort of error that was confusing and took up a bunch of time, just like
I did with my TypeScript. But just because you may have those problems, doesn’t
mean that everyone does. And, it also means that in the future, if you stick with
it, you won’t have those problems either! Or at least, it’s possible not to. Not
every tool clicks with every person.&lt;/p&gt;
&lt;p&gt;Here’s to another ten years.&lt;/p&gt;</content:encoded></item><item><title>Today is my first day at Oxide Computer Company</title><link>https://steveklabnik.com/writing/today-is-my-first-day-at-oxide-computer-company/</link><guid isPermaLink="true">https://steveklabnik.com/writing/today-is-my-first-day-at-oxide-computer-company/</guid><description>Today is my first day at Oxide Computer Company , where I will be doing engineering work. When Oxide introduced themselves to the world, I saw a lot of folks who were pretty confused. At its core, what Oxide is doing is very straightforward: you give Oxide money, and Oxide gives…</description><pubDate>Mon, 15 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;Oxide Logo&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;348&quot; height=&quot;124&quot; src=&quot;/_astro/oxide.CGXdNDFe_1Sv18Y.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Today is my first day at &lt;a href=&quot;https://oxide.computer/&quot;&gt;Oxide Computer Company&lt;/a&gt;, where I will be doing engineering work.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;When Oxide introduced themselves to the world, I saw a lot of folks who were pretty confused. At its core, what Oxide is doing is very straightforward: you give Oxide money, and Oxide gives you a computer. This company sells goods, for money. That raises the issue of what kind of computer, and why would you want one?&lt;/p&gt;
&lt;p&gt;In the late 90s and early 2000s, if you were running a web service of some kind, you’d have a server sitting in a rack in a data center somewhere. Got a lot of traffic? You’d buy a bigger, beefier server. This was the era of “vertical scaling.” Servers were big, expensive, and hard to manage, so you didn’t buy more servers, you bought bigger servers.&lt;/p&gt;
&lt;p&gt;That started changing. In 2006, you saw a bunch of articles like &lt;a href=&quot;https://www.networkworld.com/article/2304459/google-builds-own-servers-for-efficiency.html&quot;&gt;this one&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Google, typically tight-lipped about the technology behind its data centers, builds its own servers to save costs and because standard products don’t exactly meet its needs, Google’s senior vice president of operations said on Thursday.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This era saw companies like Google start to reject the notion of “Server grade” hardware, and rely purely on cheaper, consumer-grade hardware. As the quote said, this required building a bunch of software that would make the cluster of servers more reliable.&lt;/p&gt;
&lt;p&gt;But eventually, there were downsides to this approach, as well. As these companies grew, so did a new generation of companies building “the cloud” as we know it today. And once you start managing that many computers, possibilities open up to gain certain efficiencies and cut costs. Years later, we see stuff &lt;a href=&quot;https://www.geekwire.com/2017/amazon-web-services-secret-weapon-custom-made-hardware-network/&quot;&gt;like this&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s not unusual for internet and software giants to design and even make their own hardware, to increase efficiency and build a competitive advantage. Google custom-designs its own servers, filling them with millions of chips from Intel, and announced in May that it has designed its own application-specific integrated circuit (ASIC) for use on neural networks. Facebook uses its own switches in its data centers. But market-leading public-cloud company Amazon Web Services may have gone farthest down this path — designing not only its own routers, chips, storage servers and compute servers but also its own high-speed network.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The cloud was printing money, and folks were running into scaling issues. The solution was pretty straightforward: hire some people to build amazing infrastructure. Why not just buy it? Well, it simply didn’t exist for purchase in the first place. The current crop of computer companies really grew up in the vertical scaling era. But beyond that, you also have to remember that this stuff was pretty &lt;em&gt;new&lt;/em&gt; at that time. The Cloud was still cutting-edge, and so the requirements weren’t really known. There was a lot of R&amp;#x26;D work to figure out what things would actually work in these environments. It turns out that a lot of it was not just hardware, but the software too. There is a ton of junk and waste in off-the-shelf server systems today, in all parts of the system.&lt;/p&gt;
&lt;p&gt;Because these developments were proprietary, it also meant that if you weren’t willing to build your own hardware, the only way you could get access to this new tech was by renting it. The public cloud’s usage-based billing model is pretty standard, and pretty lucrative. Custom hardware helped dig an even deeper moat around cloud providers. If you want to actually own computers, your options are to use previous-generation tech, or hire a team and try to catch up to the big players. So the world kind of split in two: the hyperscalers and everyone else.&lt;/p&gt;
&lt;p&gt;There is a &lt;strong&gt;ton&lt;/strong&gt; more to say here, but this is the short of it: what Oxide is doing is building computers that are suitable for hyperscalers, but selling them, rather than building another public cloud. These computers will have hardware and software designed together to create excellent systems. Or I should say “will be selling them,” it is still early days.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I do not come from a hardware background. But there’s a lot more to a system than hardware. And as you might guess from the name of the company, Oxide will be building a lot of software in Rust. I also have known two of the three founders of the company for a while, and they are folks I respect and whose work I admire.&lt;/p&gt;
&lt;p&gt;I am also looking forward to doing engineering work again. I still love doing product work, but I think I prefer it in a small company setting. In a new company, engineers can still have a lot of ownership over product, so I won’t be giving that up completely. But I’m excited to finally have a job where I get to write Rust code as a direct responsibility. It’s not like I’ve not written any Rust over the past few years, but I’m looking forward to writing more of it, regardless.&lt;/p&gt;
&lt;p&gt;Finally, I’m excited to continue to help others as well; Oxide cannot only hire folks who are already Rust experts. There just aren’t enough of them yet, and there’s folks who do fantastic work who don’t yet write Rust. I’ll be helping to bridge that gap.&lt;/p&gt;
&lt;p&gt;There is so much work to do. It’s almost 9am. Time to get started.&lt;/p&gt;</content:encoded></item><item><title>The next iteration of my blogs</title><link>https://steveklabnik.com/writing/the-next-iteration-of-my-blogs/</link><guid isPermaLink="true">https://steveklabnik.com/writing/the-next-iteration-of-my-blogs/</guid><description>I’ve had a few different blogs over the years. Every so often, I change things. One of the nice things about having your own site is that you can do whatever you want! So, I’m folding my old blogs’ content into my main website. I’m sick of adding new subdomains, and it all feels…</description><pubDate>Mon, 08 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve had a few different blogs over the years. Every so often, I change things. One of the nice things about having your own site is that you can do whatever you want! So, I’m folding my old blogs’ content into my main website. I’m sick of adding new subdomains, and it all feels better in one place these days. The old URLs will redirect to posts on steveklabnik.com, but I wanted to record what they looked like at the time.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;My oldest blog that’s survived is &lt;a href=&quot;https://web.archive.org/web/20200519230707/http://blog.steveklabnik.com/&quot;&gt;Literate Programming&lt;/a&gt;. It looked like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;The Literate Programming home page: a serif two-column layout with a Welcome heading and a sidebar linking All Posts and Feed&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1512&quot; height=&quot;486&quot; src=&quot;/_astro/untitled.CcmMMRip_2dTOgE.webp&quot;&gt;
&lt;img alt=&quot;Literate Programming’s Archive page, listing posts including “Announcing emoji 1.0” and “Removing Turbolinks from Rails 4”&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;897&quot; height=&quot;709&quot; src=&quot;/_astro/untitled-1.CBqf00eu_Z1XQ3M5.webp&quot;&gt;
&lt;img alt=&quot;A Literate Programming post, “Redcarpet Is awesome!”, with a sidebar table of contents and a syntax-highlighted Ruby snippet&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1531&quot; height=&quot;927&quot; src=&quot;/_astro/untitled-2.BxxVFLqC_Z15r4B1.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;This was my own static site generator! I loved making that table of contents stuff over on the left.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Then, there’s &lt;a href=&quot;https://web.archive.org/web/20200604152340/https://words.steveklabnik.com/&quot;&gt;words&lt;/a&gt;. This used &lt;a href=&quot;https://svbtle.com/&quot;&gt;Svbtle&lt;/a&gt;, which is a great platform. I liked the Meeple, and the red, and the Kudos button that made random internet people &lt;em&gt;so mad&lt;/em&gt; for some reason. Anyway, it looked like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;The words home page on Svbtle: the red Meeple logo, an Emma Goldman epigraph, and the post “How often does Rust change?”&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1867&quot; height=&quot;1509&quot; src=&quot;/_astro/untitled-3.DX6CxkvQ_2f5Gaf.webp&quot;&gt;
&lt;img alt=&quot;A words post, “‘C is not how the computer works’ can lead to inefficient code”, in Svbtle’s bold sans layout&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1858&quot; height=&quot;926&quot; src=&quot;/_astro/untitled-4.DqVsRW2C_ZeDPBC.webp&quot;&gt;
&lt;img alt=&quot;The foot of a words post, showing Svbtle’s Kudos button at 822 and a “Now read this” recommendation&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1860&quot; height=&quot;907&quot; src=&quot;/_astro/untitled-5.D3pk13aT_1U8gDJ.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;The kudos count does nothing, other than record that you did it. The style was really nice, it was easy to write Markdown. Then Medium got popular. Oh well.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Now, I’m writing this in &lt;a href=&quot;https://www.notion.so/&quot;&gt;Notion&lt;/a&gt;. I really, really like writing in Notion. Someone put together &lt;a href=&quot;https://github.com/ijjk/notion-blog&quot;&gt;some code&lt;/a&gt; to use Notion like a headless CMS. Exactly what I wanted. I’ve modified it a bunch, I’m using I’m using &lt;a href=&quot;https://concrete.style/&quot;&gt;concrete.css&lt;/a&gt; as the base of my look, for example. They’re using &lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js&lt;/a&gt; and &lt;a href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt;. I’ve been a fan of those folks (and pretty much everyone in the JAMStack space, to be honest) for a while, so I’m giving that a go.&lt;/p&gt;
&lt;p&gt;I think it’s going pretty good so far.&lt;/p&gt;</content:encoded></item><item><title>Porting steveklabnik.com to Workers Sites and Zola</title><link>https://steveklabnik.com/writing/porting-steveklabnik-com-to-workers-sites-and-zola/</link><guid isPermaLink="true">https://steveklabnik.com/writing/porting-steveklabnik-com-to-workers-sites-and-zola/</guid><description>One fun thing about having a personal domain is that you can keep the contents the same forever, but take a few days every so often to port it to some new stack you want to try out. A while back, I had my site on GitHub Pages using Jekyll . This has long been the sort of default,…</description><pubDate>Thu, 26 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One fun thing about having a personal domain is that you can keep the contents the same forever, but take a few days every so often to port it to some new stack you want to try out.&lt;/p&gt;
&lt;p&gt;A while back, I had my site on &lt;a href=&quot;https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt; using &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;. This has long been the sort of default, go-to stack for me. At some point, I decided to simplify even further, and wrote a small script to take the few Markdown files I have and just make HTML out of them. I then used &lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt; to do the hosting. I wanted to try out their legendary ease of use, and it was indeed super simple.&lt;/p&gt;
&lt;p&gt;Earlier this year, I &lt;a href=&quot;/writing/i-m-joining-cloudflare/&quot;&gt;took a job at Cloudflare&lt;/a&gt; to work on part of &lt;a href=&quot;https://workers.cloudflare.com/&quot;&gt;Cloudflare Workers&lt;/a&gt;. To get more familiar with the project I’d be working on, &lt;a href=&quot;https://www.cloudflare.com/products/workers-kv/&quot;&gt;Workers KV&lt;/a&gt;, I came up with a plan: I’d put the Markdown files into KV, and then write a worker in Rust and WebAssembly that would generate the HTML on the fly, and run that in a Worker. This worked really well, even though it was &lt;em&gt;incredibly&lt;/em&gt; overkill for a simple static site.&lt;/p&gt;
&lt;p&gt;Today we’re launching a new product, &lt;a href=&quot;https://blog.cloudflare.com/workers-sites/&quot;&gt;Workers Sites&lt;/a&gt;. You see, I wasn’t the only one who was interested in using Workers for static site hosting; I’d see tweets every so often where others were doing the same. But doing so was a completely manual process, you had to write the code on your own, you had to do all the setup yourself, and there was no assistance in doing so. Workers Sites changes this, and makes it easy to host your own site, if you’d like.&lt;/p&gt;
&lt;p&gt;The rest of this post is going to walk you through my porting process for &lt;a href=&quot;https://www.steveklabnik.com/&quot;&gt;steveklabnik.com&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I decided to go with &lt;a href=&quot;https://www.getzola.org/&quot;&gt;Zola&lt;/a&gt; for my static site generator, as it’s written in Rust. I’d been wanting to give Zola a try for a while, and this was a good excuse to do so.&lt;/p&gt;
&lt;p&gt;I needed these pre-requisites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zola, instructions &lt;a href=&quot;https://www.getzola.org/documentation/getting-started/installation/&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Wrangler, instructions &lt;a href=&quot;https://github.com/cloudflare/wrangler&quot;&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Cloudflare Workers account, &lt;a href=&quot;https://workers.cloudflare.com/&quot;&gt;here&lt;/a&gt; if you don’t have a Cloudflare account already, and if you do, you can click the Workers tab in your dashboard to set it up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, you need to have a $5/month subscription to Workers, to get access to Workers KV. I want us to offer a free tier of KV in the future, but we’re not there yet. That $5/month gets you a lot more than one site, to be clear, but this isn’t a completely free solution today.&lt;/p&gt;
&lt;p&gt;From there, it was time to make a new site with Zola:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; zola init steveklabnik.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; cd steveklabnik.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Zola places the contents of your site in the &lt;code&gt;contents&lt;/code&gt; directory. I only have one level for my site, so I dumped my two pages in there, as well as re-named &lt;code&gt;index.md&lt;/code&gt; to &lt;code&gt;_index.md&lt;/code&gt; to follow Zola convention.&lt;/p&gt;
&lt;p&gt;I had a few YAML headers on pages, I had to convert those to Zola’s TOML format:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;title = &quot;Deleuzional&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;I really like the writing of [Gilles Deleuze]. I need&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;+++&lt;/code&gt;s are like &lt;code&gt;---&lt;/code&gt; in Jekyll, and the metadata is in TOML instead of YAML. I only needed &lt;code&gt;title&lt;/code&gt; because I am keeping things very simple.&lt;/p&gt;
&lt;p&gt;I then needed to set up templates. Like most static site generators, the template forms the outer contents of the HTML on a page, and renders the Markdown into the middle somewhere. I have a slightly different template for my root than the other two pages, and Zola handles this pretty well.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; ls .\templates\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Directory: C:\Users\Steve Klabnik\src\steveklabnik.com\templates&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Mode                LastWriteTime         Length Name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;----                -------------         ------ ----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-a----        9/25/2019   5:28 PM           1288 index.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-a----        9/25/2019   5:28 PM           1234 page.html&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;index.html&lt;/code&gt; is for the root page, and &lt;code&gt;page.html&lt;/code&gt; is for the other pages. This is a Zola convention.&lt;/p&gt;
&lt;p&gt;Zola templates are written in &lt;a href=&quot;https://tera.netlify.com/docs/templates/&quot;&gt;Tera&lt;/a&gt;, which is sorta like &lt;a href=&quot;https://shopify.github.io/liquid/&quot;&gt;Liquid&lt;/a&gt; or &lt;a href=&quot;https://jinja.palletsprojects.com/en/2.10.x/&quot;&gt;Jinja2&lt;/a&gt;. Here’s a snippit of my template:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;body&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &amp;#x3C;h2&gt;{{ page.title }}&amp;#x3C;/h2&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      {{page.content | safe}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &amp;#x3C;/body&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;| safe&lt;/code&gt; bit says that it shouldn’t escape the HTML produced by &lt;code&gt;page.content&lt;/code&gt;, which is the rendered contents of the Markdown pages.&lt;/p&gt;
&lt;p&gt;Finally, I have some static assets for the site: a CSS file, some JS, and the favicon, etc. These get dumped in the &lt;code&gt;static&lt;/code&gt; directory, and Zola will copy them over when I build the site.&lt;/p&gt;
&lt;p&gt;Previewing during this process is very useful:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; zola serve&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It took me a bit to figure out the conventions and get everything in place, and being able to change the contents and watch my browser refresh was invaluable.&lt;/p&gt;
&lt;p&gt;Once I had my site ported to Zola, it’s time to deploy it to Workers Sites!&lt;/p&gt;
&lt;p&gt;Wrangler is the command-line tool for Cloudflare Workers. If you haven’t used it before, you’ll have to log in:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; wrangler config&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To check that your auth is set up correctly, you should run this command:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; wrangler whoami&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  You are logged in with the email &apos;steve@steveklabnik.com&apos;.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Of course, this should show your own email, not mine.&lt;/p&gt;
&lt;p&gt;Let’s add Workers Sites to our project:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; wrangler init --site website&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This creates two main things: &lt;code&gt;wrangler.toml&lt;/code&gt;, used to configure Wrangler, and &lt;code&gt;workers-sites&lt;/code&gt;, a directory with your worker in it. I used the extra &lt;code&gt;website&lt;/code&gt; parameter to wrangler becuase it defaults to the name of the subdirectory, and the period in &lt;code&gt;steveklabnik.com&lt;/code&gt; is invalid in a worker name, so I chose &lt;code&gt;website&lt;/code&gt;. You can put whatever you’d like.&lt;/p&gt;
&lt;p&gt;We need to set up &lt;code&gt;wrangler.toml&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; code wrangler.toml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mine looks like this:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;account_id = &quot;f5518bfbf88c230551a64797c221c7da&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;name = &quot;website&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;type = &quot;webpack&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;route = &quot;www.steveklabnik.com/*&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;zone_id = &quot;9359b254c46ff9f5c546203686794862&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;workers_dev = false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[site]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;bucket = &quot;./public&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;entry-point = &quot;workers-site&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All of these IDs are fine to be public; &lt;code&gt;wrangler&lt;/code&gt; stores your sensitive stuff in &lt;code&gt;~/.wrangler&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Important bits:&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;route&lt;/code&gt; needs to be set up properly; this one means that the worker will serve everything on &lt;code&gt;www.steveklabnik.com&lt;/code&gt;. My account and zone IDs are needed; you can find these on the Cloudflare dashboard on the bottom right of the main page for it. &lt;code&gt;workers_dev&lt;/code&gt; is false; I’m deploying to my site, not to a subdomain of &lt;code&gt;workers.dev&lt;/code&gt;. If we did, we wouldn’t need the &lt;code&gt;zone_id&lt;/code&gt;, or &lt;code&gt;route&lt;/code&gt;. Finally, the &lt;code&gt;bucket&lt;/code&gt; setting needs to be set to whatever your site generator’s output directory is, which for Zola is &lt;code&gt;public&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;And that’s it! You can test out what this looks like:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; wrangler preview&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If that all looks good, we can deploy:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; zola build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; wrangler publish&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And that’s it! And wow is it fast:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://svbtleusercontent.com/hS1xpZgYuQ9sRhUxP1iqq20xspap_small.png&quot; alt=&quot;https://svbtleusercontent.com/hS1xpZgYuQ9sRhUxP1iqq20xspap_small.png&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;… well, we’re &lt;em&gt;almost&lt;/em&gt; done. Right now, this means I can only publish from my laptop. I’d prefer to have GitHub deploy this. We don’t have that as a built-in feature today, so I’d have to write an Action to do so. I haven’t yet, so I can’t blog about that. Maybe next time.&lt;/p&gt;
&lt;p&gt;Additionally, there’s one more twist. Zola generates different URLs than my previous ones. I had previously had &lt;code&gt;.html&lt;/code&gt; on the ends of my pages, but Zola does not do this.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;old: &lt;a href=&quot;https://www.steveklabnik.com/deleuzional.html&quot;&gt;https://www.steveklabnik.com/deleuzional.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;new: &lt;a href=&quot;https://www.steveklabnik.com/deleuzional/&quot;&gt;https://www.steveklabnik.com/deleuzional/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think I’d prefer the new style anyway, so rather than figure out how to get Zola to do this, let’s set up some redirects. This is one cool thing about using Workers for this kind of task; while it’s slightly more manual, we can also make customizations very easily. The contents of the Worker that serves up the site lives in &lt;code&gt;workers-sites/index.js&lt;/code&gt;. It’s very short.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import { getAssetFromKV } from &quot;@cloudflare/kv-asset-handler&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;addEventListener(&quot;fetch&quot;, event =&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  event.respondWith(handleEvent(event));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;async function handleEvent(event) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  try {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return await getAssetFromKV(event);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  } catch (e) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    let pathname = new URL(event.request.url).pathname;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return new Response(`&quot;${pathname}&quot; not found`, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      status: 404,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      statusText: &quot;not found&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Given that I only have two URLs, rather than doing something big and fancy, I did something dumb and straightforward:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import { getAssetFromKV } from &quot;@cloudflare/kv-asset-handler&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;addEventListener(&quot;fetch&quot;, event =&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  event.respondWith(handleEvent(event));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;async function handleEvent(event) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // redirect some old URLs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  let pathname = new URL(event.request.url).pathname;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  if (pathname === &quot;/security.html&quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return Response.redirect(&quot;https://www.steveklabnik.com/security/&quot;, 301);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  } else if (pathname === &quot;/deleuzional.html&quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return Response.redirect(&quot;https://www.steveklabnik.com/deleuzional/&quot;, 301);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  try {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return await getAssetFromKV(event);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  } catch (e) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    let pathname = new URL(event.request.url).pathname;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return new Response(`&quot;${pathname}&quot; not found`, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      status: 404,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      statusText: &quot;not found&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I’m constructing &lt;code&gt;pathname&lt;/code&gt; twice here, but I just don’t care enough to bother to refactor this out. Additionally, it’s nice to purely add, rather than customize what was generated too much.&lt;/p&gt;
&lt;p&gt;But with that, and another &lt;code&gt;zola build &amp;#x26;&amp;#x26; wrangler publish&lt;/code&gt;, I have the redirects set up for my site.&lt;/p&gt;</content:encoded></item><item><title>I&apos;m joining Cloudflare</title><link>https://steveklabnik.com/writing/i-m-joining-cloudflare/</link><guid isPermaLink="true">https://steveklabnik.com/writing/i-m-joining-cloudflare/</guid><description>Yesterday, I signed an offer letter from Cloudflare. I’ll be the product manager of Storage, which is the part of the company that’s working on data storage products for the Cloudflare Workers platform. I’ll be starting at the end of the month. I think a lot of you will say “that…</description><pubDate>Fri, 05 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://svbtleusercontent.com/jpH1brqXUvSAz1tNQ8uVKb0xspap_small.png&quot; alt=&quot;https://svbtleusercontent.com/jpH1brqXUvSAz1tNQ8uVKb0xspap_small.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Yesterday, I signed an offer letter from Cloudflare. I’ll be the product manager of Storage, which is the part of the company that’s working on data storage products for the &lt;a href=&quot;https://www.cloudflare.com/products/cloudflare-workers/&quot;&gt;Cloudflare Workers&lt;/a&gt; platform. I’ll be starting at the end of the month.&lt;/p&gt;
&lt;p&gt;I think a lot of you will say “that makes perfect sense,” but many more will say “wait, what?”. I hope this post will make things a bit more clear.&lt;/p&gt;
&lt;p&gt;Before we start, I also want to say that I’ll still be continuing my work on Rust, though obviously in a more limited capacity. I’ll still be working on revisions to &lt;a href=&quot;https://doc.rust-lang.org/stable/book/&quot;&gt;The Rust Programming Language&lt;/a&gt;, and doing core team work, for example.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Before I worked on Rust, I worked on and with Ruby on Rails. When I got out of the web application game, the hot topic was this new “platform as a service” stuff. I’ve been watching all of the latest changes from afar, and they’ve been quite interesting. I’ve always loved the web, and the people building it. In the last 18 months or so, I’ve also been extremely interested in WebAssembly. Working at Cloudflare is the intersection of four things for me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edge compute&lt;/li&gt;
&lt;li&gt;WebAssembly&lt;/li&gt;
&lt;li&gt;Rust&lt;/li&gt;
&lt;li&gt;Personal and career growth&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;edge-compute&quot;&gt;Edge Compute&lt;/h2&gt;
&lt;p&gt;There’s sort of been four eras of “how do I web server”:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Physical servers (“on premise”)&lt;/li&gt;
&lt;li&gt;Infrastructure as a service&lt;/li&gt;
&lt;li&gt;Platform as a service&lt;/li&gt;
&lt;li&gt;Function as a service&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A lot of people see the relationship between these things as “what you control” vs “what does the provider control”, but I don’t think that’s quite right. But I’m getting ahead of myself.&lt;/p&gt;
&lt;p&gt;Back in the day, if you wanted a web site, you bought a physical server, and you put it in a data center somewhere. I wasn’t around for those days. The point is, you managed everything: the hardware, the software. All of it.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.shapeways.com/blog/archives/305-CloudFab-Distributed-Fabrication-3D-printing,-Nick-Pinkston-interview.html&quot;&gt;my days as a startup CTO&lt;/a&gt;, my services were deployed to a Virtual Private Server. Instead of owning servers ourselves, we rented a virtual machine, running on someone else’s servers. This is “infrastructure as a service”; I didn’t have to worry about machines, I could just ask for one, and it’d be given to me. I still had to manage the operating system and everything above it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fun side note: CloudFab was a Rails application with a big C extension to do data processing that was too much for Ruby. This later informed a lot of my Rust work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Next up came “platform as a service.” To me, Heroku was the platonic ideal of this era. Now, you didn’t even need to manage servers. You got to worry about your application, and that’s it. Maybe you’d need to set a slider to scale during times of demand.&lt;/p&gt;
&lt;p&gt;I’ve been reading a lot about “functions as a service” over the past few years. Instead of deploying an entire application, each endpoint becomes an application, basically. This is where I think the previous thinking about the relationships between these categories of service is a little wrong. The actual underlying trend here is something else: what affordances do I have to scale?&lt;/p&gt;
&lt;p&gt;In the on-premise days, if I wanted to add capacity, I’d need to buy new servers, install them, set everything up. There’s a &lt;em&gt;lot&lt;/em&gt; of latency there. And if I need to remove capacity, well, I have to sell those servers? The move to infrastructure as a service was significant, because it more clearly separated concerns. Each company didn’t need a data center; a data center provides homogeneous compute. As a user, if I need to scale, I can spin up some more virtual servers much more quickly than I can physical ones. Managing that required a lot of tooling, however.&lt;/p&gt;
&lt;p&gt;This was the insight that led to platform as a service: by managing this tooling, you could make it even easier for users to scale. There’s a reason why the slider became the ubiquitous synonym with PaaS. There’s nothing that you could do with PaaS that was impossible with IaaS, but it was much, much easier.&lt;/p&gt;
&lt;p&gt;This brings us to Functions as a Service, also known as “serverless.” The reason that this architecture matters is one very similar to previous insights. By breaking your application into multiple functions, they can scale independently. This is one of the dreams of microservice architecture, but there’s a bit of a difference. Microservice architecture focuses on how you build your system, and how you split up components internally. FaaS focuses on how people interact with your system, and splits up the components according to that. This framing is a bit more significant to your ability to scale, because it means that during times of high load, you can scale only the parts under that load. In the same way that IaaS said “let’s not force people to buy servers to scale” and PaaS said “let’s not force people to build out infrastructure to scale”, FaaS says “let’s not force people to scale their help page to scale their shopping cart.”&lt;/p&gt;
&lt;p&gt;This brings us to edge compute. Edge compute is a particular kind of FaaS, but an interesting take on it. Here’s the concept: your users are all over the world. Why do their packets need to go to &lt;code&gt;us-east-1&lt;/code&gt; and back? To which you might say, “sure, that’s why we’ve developed our application to work in multiple regions.” That’s the same relationship between IaaS and PaaS. That is, why should you have to worry about making your application be available across multiple regions? You may not be worrying about individual physical servers anymore, but you’re still worrying about data centers. And some FaaS products, like AWS Lambda, can already run easily across multiple regions, and with some setup, go between them. However, Amazon has about 20 total regions.&lt;/p&gt;
&lt;p&gt;So how is edge compute different? Well, at some point, various CDN companies realized “wait a minute. We have severs around the world. Why can’t we run compute on them as well?”&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Side note: Cloudflare is not really a CDN company, though that’s how I always thought of them. They do a lot more stuff than CDNs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is interesting because, well, &lt;a href=&quot;https://aws.amazon.com/about-aws/global-infrastructure/&quot;&gt;here’s those 20 Amazon regions&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://svbtleusercontent.com/qxGa9h6TshtRrXZmh6tsRU0xspap_small.png&quot; alt=&quot;https://svbtleusercontent.com/qxGa9h6TshtRrXZmh6tsRU0xspap_small.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Compare this with &lt;a href=&quot;https://www.fastly.com/network-map&quot;&gt;Fastly’s network&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://svbtleusercontent.com/ePzMAv7Q4NVLARUKambWH80xspap_small.jpg&quot; alt=&quot;https://svbtleusercontent.com/ePzMAv7Q4NVLARUKambWH80xspap_small.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;And finally, &lt;a href=&quot;https://www.cloudflare.com/network/&quot;&gt;Cloudflare’s network&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://svbtleusercontent.com/bQzn9XqBY98mw269Q1tsdH0xspap_small.png&quot; alt=&quot;https://svbtleusercontent.com/bQzn9XqBY98mw269Q1tsdH0xspap_small.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;(the page is animated, so those highlighted ones don’t mean anything)&lt;/p&gt;
&lt;p&gt;You’re much likely to be physically closer to a Fastly or Cloudflare server than you are an AWS one. And that’s what we mean by “edge compute”, that is, you’re running your code on the edge, rather than in the data center.&lt;/p&gt;
&lt;p&gt;Now, I should also mention that there is a form of Lambda called Lambda@Edge that runs off of CloudFront locations, rather than the above map. So that looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://svbtleusercontent.com/vwJvtVvGK7DpGZYEPcrjzW0xspap_small.png&quot; alt=&quot;https://svbtleusercontent.com/vwJvtVvGK7DpGZYEPcrjzW0xspap_small.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Much better! My point about regions is more applicable to “edge compute” vs more general compute, than saying something about Lambda as a particular product.&lt;/p&gt;
&lt;p&gt;CloudFlare Workers don’t require you to think about where your service is deployed: when you upload it, it’s automatically running on all 175 locations, within minutes.&lt;/p&gt;
&lt;p&gt;I think this space is interesting and significant. Cloudflare has &lt;a href=&quot;https://www.cloudflare.com/products/cloudflare-workers/&quot;&gt;Workers&lt;/a&gt;, and Fastly has &lt;a href=&quot;https://wasm.fastlylabs.com/&quot;&gt;Terrarium&lt;/a&gt;. Amazon has &lt;a href=&quot;https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html&quot;&gt;Lambda@Edge&lt;/a&gt;. These are all very interesting platforms for building high performance applications.&lt;/p&gt;
&lt;p&gt;My role as part of Storage will be to consider “what does data access and storage look like in this world?” If your code is moved to the edge, but your data is still in a central server, you don’t gain the full benefit of having the code close to the client. There’s a lot of interesting stuff in this space!&lt;/p&gt;
&lt;h2 id=&quot;webassembly&quot;&gt;WebAssembly&lt;/h2&gt;
&lt;p&gt;Both ClouldFlare Workers and Fastly’s Terrarium use &lt;a href=&quot;https://webassembly.org/&quot;&gt;WebAssembly&lt;/a&gt; as a core part of the platform. And that’s significant:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If WASM+WASI existed in 2008, we wouldn’t have needed to created Docker. That’s how important it is. Webassembly on the server is the future of computing. A standardized system interface was the missing link. Let’s hope WASI is up to the task! &lt;a href=&quot;https://t.co/wnXQg4kwa4&quot;&gt;https://t.co/wnXQg4kwa4&lt;/a&gt;
— Solomon Hykes (@solomonstre) March 27, 2019&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In order for this stuff to work, you need a runtime for WebAssembly. One interesting thing we’re seeing in this space is sort of two parallel paths emerge: do you want to support JavaScript, or not? Recently, Fastly open sourced &lt;a href=&quot;https://www.fastly.com/blog/announcing-lucet-fastly-native-webassembly-compiler-runtime&quot;&gt;Lucet&lt;/a&gt;, the WebAssembly runtime that powers Terrarium. It’s an impressive bit of tech. There are others too, like &lt;a href=&quot;https://wasmer.io/&quot;&gt;Wasmer&lt;/a&gt; and &lt;a href=&quot;https://github.com/CraneStation/wasmtime&quot;&gt;Wasmtime&lt;/a&gt;. By focusing purely on WebAssembly, you can build specialized tech, and it can be really, really fast.&lt;/p&gt;
&lt;p&gt;However, you can’t compile JavaScript to WebAssembly. You can sort of do it with AssemblyScript, a TypeScript subset the compiles to wasm. But JavaScript is arguably the most popular programming language in the world. I personally believe in JavaScript, even with the rise of WebAssembly. And so Cloudflare is taking a different approach than those projects. Instead of building a wasm-only runtime, they’re building on top of Google’s V8. This means that they can support both WebAssembly and JavaScript in workers. Additionally, by leaning on V8, you can take advantage of all of the excellent engineering resources that Google pours into it, similar to how the Rust compiler gets to take advantage of people working on improving LLVM.&lt;/p&gt;
&lt;p&gt;Anyway, the point is, WebAssembly is core to this new edge compute world. And so I’m excited to be in the space. I know people that work at Fastly, wasmer, and Mozilla, and they’re all doing great work. I think there’s space for both approaches, but I’m mostly excited to be there and see how it all turns out.&lt;/p&gt;
&lt;p&gt;Oh, one other thing I wanted to say: right now, everything around Workers is closed source. Kudos to Fastly for open-sourcing Lucet. I asked about this in my interview, and Cloudflare is very interested in doing more open source work, and so I’m hoping it doesn’t take us long to catch up in this regard. We’ll see, of course, I haven’t actually started yet. But I think that this stuff needs to be open source, personally.&lt;/p&gt;
&lt;h2 id=&quot;rust&quot;&gt;Rust&lt;/h2&gt;
&lt;p&gt;You may remember a little story called &lt;a href=&quot;https://en.wikipedia.org/wiki/Cloudbleed&quot;&gt;CloudBleed&lt;/a&gt;. In short, Cloudflare had a pretty bad security bug in 2017. This bug happened because of a parser, written in Ragel. Here, &lt;a href=&quot;https://blog.cloudflare.com/incident-report-on-memory-leak-caused-by-cloudflare-parser-bug/&quot;&gt;I’ll let Cloudflare explain it&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Ragel code is converted into generated C code which is then compiled. The C code uses, in the classic C manner, pointers to the HTML document being parsed, and Ragel itself gives the user a lot of control of the movement of those pointers. The underlying bug occurs because of a pointer error.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;CloudBleed happened due to memory unsafety. When talking to Cloudflare today, it’s pretty clear that this bug was taken extremely seriously, to the point where it created a culture change inside the company itself. These days, it seems to me (I haven’t started yet, mind you) that you have to use a memory safe language by default, and only use a memory unsafe one if you have an extremely good justification. But Cloudflare needs to be able to have a lot of performance, and control latency, in much of their stack.&lt;/p&gt;
&lt;p&gt;Enter Rust. Cloudflare started exploring Rust after CloudBleed, and now uses a significant amount of Rust in production. They host the local Rust meetup here in Austin, and sometimes the one in San Francisco. I’m excited to help Cloudflare be successful with Rust, and to use that experience to help improve Rust too.&lt;/p&gt;
&lt;p&gt;My understanding is that I’ll be dealing with a bunch of TypeScript and possibly Go as well, which is also pretty cool.&lt;/p&gt;
&lt;h2 id=&quot;career-growth&quot;&gt;Career growth&lt;/h2&gt;
&lt;p&gt;Finally, the move to product management. I really enjoy product work, and have had several jobs that were sorta-kinda product jobs. I don’t think that management jobs are inherently better than engineer jobs, of course, but it’s a way for me to grow. My role at Balanced was sorta-kinda-PM-y, and I loved that job.&lt;/p&gt;
&lt;p&gt;I don’t have too much more to say about this, just that it’s a bit different, but something I’m really excited to do.&lt;/p&gt;
&lt;h2 id=&quot;im-excited-for-the-future&quot;&gt;I’m excited for the future&lt;/h2&gt;
&lt;p&gt;So yeah, that’s my extremely long-winded explanation of what’s going on. I’m not starting until the end of the month, so I’ve got a few weeks to purely enjoy. I’ll still be playing a lot of &lt;a href=&quot;http://www.celestegame.com/&quot;&gt;Celeste&lt;/a&gt; and Fortnite, writing blog posts, and working on some Rust open source. But then I get to get back to work. I’m pumped about all of this! New role, building some new tech with tech I already love.&lt;/p&gt;</content:encoded></item><item><title>thank u, next</title><link>https://steveklabnik.com/writing/thank-u-next/</link><guid isPermaLink="true">https://steveklabnik.com/writing/thank-u-next/</guid><description>I started working at 15, when I took a job as a pizza cook. Over the next seven years, I moved up the ranks, to a driver, shift manager, and then as part of the “new store opening team.” The franchise was growing, and we needed to help new franchisees open their new stores. I’d…</description><pubDate>Sun, 06 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I started working at 15, when I took a job as a pizza cook. Over the next seven years, I moved up the ranks, to a driver, shift manager, and then as part of the “new store opening team.” The franchise was growing, and we needed to help new franchisees open their new stores. I’d travel to where the new store was a week before they would open, help train the new staff, and then work their opening weekend. It was really fulfilling work; if pizza paid as well as tech, I’d seriously consider doing it forever.&lt;/p&gt;
&lt;p&gt;One time, somewhere in Maryland, I got a bit ill. It wasn’t a good idea for me to work the rest of the week, but the company’s top brass would usually visit to cut the ribbon on the store. It was about a four hour drive back to home, and our COO graciously agreed to let me come back to the ’burgh with him, so I could recover at home. On the drive, I asked him what he did before working here, and the answer really surprised me. “Oh, I was the CEO of American Eagle. I grew them from 20 locations to 200, and then decided to move on.” To a kid from the suburbs, being in charge of one of the most popular clothing brands among my peers seemed like a great gig. Why’d he quit? The answer is something that’s really stuck with me; this happened about fifteen years ago. What he told me was this: at each stage of a company’s growth, they have different needs. Those needs generally require different skills. What he enjoyed, and what he had the skills to do, was to take a tiny company and make it medium sized. Once a company was at that stage of growth, he was less interested and less good at taking them from there. And that was what he was trying to do for our pizza chain.&lt;/p&gt;
&lt;p&gt;I’ve mostly worked at small companies. I did a startup, then consulted, then worked for a series of companies with five to 15 people. I quit one of those jobs when I found Rust. What I saw in Rust was something that the world really &lt;em&gt;needed&lt;/em&gt;. And I wanted to help it get there. Beyond that, the only real way to get a job working on Rust was to work at Mozilla. And independently of Rust, that was something I’m really excited about.&lt;/p&gt;
&lt;p&gt;Here’s a poster on my wall:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://svbtleusercontent.com/x35Th9VqQFuuZ4SFBEsZkU0xspap_small.jpeg&quot; alt=&quot;https://svbtleusercontent.com/x35Th9VqQFuuZ4SFBEsZkU0xspap_small.jpeg&quot;&gt;&lt;/p&gt;
&lt;p&gt;I’ve been using Firefox before it was called Firefox. This poster is of a two-page ad that Mozilla took out in the New York Times to announce Firefox 1.0. I’ve long believed in Mozilla’s mission. This was an exciting opportunity!&lt;/p&gt;
&lt;p&gt;Fast forward a few years. Rust has been growing, we’re doing great things. I love my team. But every time that this means interacting with Mozilla more broadly, I end up being frustrated. I could say a lot of things here, but I won’t get into the details. What’s really important is this: I’m not proud to be a Mozillian anymore. A variety of incidents contributed to this, but at the end of the day, it’s what’s true. Furthermore, I don’t have any personal opportunity at Mozilla; I recently discovered I’m the lowest-paid person on my team, and Mozilla doesn’t pay particularly well in the first place. In order to have any kind of career growth, I would have to not do the work that aligns with my skills, and what I’m doing now is really how I can have the most impact on Rust moving forward.&lt;/p&gt;
&lt;p&gt;I don’t believe that Mozilla’s direction has any chance of changing; when I’ve tried to express my frustrations, I’ve only gotten disciplined. Mozilla is not interested in hearing what I have to say. And that’s fine, but when I take a step back and think about things, that means it’s time to go, for both my sake and Mozilla’s. So I’ve just put in my two weeks’ notice.&lt;/p&gt;
&lt;p&gt;So what’s next? Well, the first thing is that I don’t plan to stop working on Rust. How much I’ll be able to depends on what’s next, but that’s the great part about open source; I can continue to help the thing I love, even if it might not be full-time anymore.&lt;/p&gt;
&lt;p&gt;I’ve also been enamored with another technology recently: WebAssembly. 2019 is going to be a &lt;em&gt;huge&lt;/em&gt; year for WebAssembly, even if many people don’t know it yet, and may not see the effects until 2020. Once again, I find myself seeing something that the world needs, and I think I have the skills to help make that happen. Unlike with Rust, I don’t think that WebAssembly needs my help to actually work on it itself; I think it’s not yet found its killer application. I’d like to help find out what that is, and help both wasm and that application grow.&lt;/p&gt;
&lt;p&gt;There’s something similar in Google’s Fuchsia. I’ve worked with the web for a long time, but doing Rust for the last few years, I’ve also really enjoyed systems-level work. Fuchsia is very interesting and a bit of an enigma, but I can’t wait to see how it turns out. They use a lot of Rust, and plan to use more. I’m not really a kernel hacker, and I’m not sure that Fuchsia is far enough along to really need my skills, but it also really piques my interest.&lt;/p&gt;
&lt;p&gt;Additionally, I’m always open to other things. Before Rust, I worked at Balanced Payments, which was one of my favorite jobs I’ve ever had. I would have never thought I’d want to work at a payments company, but by being open to it, I found an awesome role, with fantastic co-workers. Maybe what I do next will be something completely different!&lt;/p&gt;
&lt;p&gt;In terms of the actual &lt;em&gt;work&lt;/em&gt; I would like to do, I don’t think a traditional engineering role really suits me. Don’t get me wrong, I love to write some code, but I don’t think that those kinds of roles really play to my unique strengths. What I really love to do is teaching, evangelizing, and growing something. I’ve done it with Rust, and I can do it again. I could see several roles or hybrid ones here, with titles like “developer evangelist,” “product manager”, or possibly even “VP of Growth.” I want something that challenges me, and where I can grow my career.&lt;/p&gt;
&lt;p&gt;So if you’re:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A company that wants to invest in Rust, or at Rust in your company&lt;/li&gt;
&lt;li&gt;A company that thinks they can take webassembly (and their product built on it) to the next level&lt;/li&gt;
&lt;li&gt;The Fuchsia team at Google&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;or something completely different that you think I’d be psyched about, please &lt;a href=&quot;mailto:steve@steveklabnik.com&quot;&gt;email me&lt;/a&gt; and let’s see where things go!&lt;/p&gt;</content:encoded></item><item><title>0b100000</title><link>https://steveklabnik.com/writing/2-sup-5/</link><guid isPermaLink="true">https://steveklabnik.com/writing/2-sup-5/</guid><description>As someone who has significantly different beliefs than Peter Thiel , today is likely my second-to-last power of two years alive. Two years ago, I wrote a post about turning 30 , and I pretty much feel the same way. Never enough time, tick tock, tick tock. I have today off…</description><pubDate>Thu, 25 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As someone who has &lt;a href=&quot;https://www.inc.com/jeff-bercovici/peter-thiel-young-blood.html&quot;&gt;significantly different beliefs than Peter Thiel&lt;/a&gt;, today is likely my second-to-last power of two years alive.&lt;/p&gt;
&lt;p&gt;Two years ago, &lt;a href=&quot;/writing/a-eulogy-for-my-20s/&quot;&gt;I wrote a post about turning 30&lt;/a&gt;, and I pretty much feel the same way. Never enough time, tick tock, tick tock. I have today off (thanks Mozilla!), but am still considering working anyway, because I really care about what I’m working on, and am excited about it. We’ll see.&lt;/p&gt;
&lt;p&gt;I feel like I have more to say here, but also don’t. So maybe let’s leave it at that.&lt;/p&gt;</content:encoded></item><item><title>A eulogy for my 20s</title><link>https://steveklabnik.com/writing/a-eulogy-for-my-20s/</link><guid isPermaLink="true">https://steveklabnik.com/writing/a-eulogy-for-my-20s/</guid><description>Today is the last day of my 29th year of existence. I’ve been thinking about it a lot, which is extra strange because I don’t generally care about birthdays. I’m not much of one for holidays in general. So why do I care about this one? My 20s have been an extreme period of…</description><pubDate>Sun, 24 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today is the last day of my 29th year of existence. I’ve been thinking about it a lot, which is extra strange because I don’t generally care about birthdays. I’m not much of one for holidays in general. So why do I care about this one?&lt;/p&gt;
&lt;p&gt;My 20s have been an extreme period of growth. At the start of it, I thought that I was going to live in my little farming town, get married to The Girl, go to mass every Sunday, and pretty much do exactly what everyone else I knew had done. If you’re reading this, well, you know a very different me. Before my 20s, I had only left the country once, a short trip to Toronto. I had barely even left my state. I was smart, but cocky, and incredibly sheltered. I was the very embodiment of a stereotype.&lt;/p&gt;
&lt;p&gt;I’ve come a long way.&lt;/p&gt;
&lt;p&gt;The root of my anxiety about being 30 comes from something that my brain is constantly whispering into my ear: “You don’t have enough time.” There’s sort of two sides to this; I think: the first is how much I’ve changed in this decade, and the second is a particularly toxic attitude of the industry I’ve immersed myself in.&lt;/p&gt;
&lt;p&gt;I feel pretty dumb about this post overall, but whatever. Please just take this as a brain dump from this morning, not some sort of grand, planned essay about how I know all the things or something.&lt;/p&gt;
&lt;h2 id=&quot;identity-is-a-function&quot;&gt;Identity is a function&lt;/h2&gt;
&lt;p&gt;Have you ever played around with &lt;a href=&quot;http://www.utdallas.edu/~gupta/courses/apl/lambda.pdf&quot;&gt;lambda calculus&lt;/a&gt;? I myself only know the basics, I’m not a particularly math-y person. Here’s a short introduction: say we have a function. This function is very simple, it returns its single argument. In other words, the identify function:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fn id(x) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return x;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(Making this syntax up, though it will look sort of like Rust without types.)&lt;/p&gt;
&lt;p&gt;We can write another function, &lt;code&gt;zero&apos;()&lt;/code&gt;, like this:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fn zero&apos;(f, g) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  return g();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In other words, &lt;code&gt;zero&apos;()&lt;/code&gt; takes two functions, &lt;code&gt;f&lt;/code&gt; and &lt;code&gt;g&lt;/code&gt;. It then calls &lt;code&gt;g()&lt;/code&gt;, ignoring &lt;code&gt;f()&lt;/code&gt;. This will make sense in a moment, we just need one more function: &lt;code&gt;succ()&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fn succ(f, g) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return f(g());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This function, short for “successor”, applies &lt;code&gt;f()&lt;/code&gt; to &lt;code&gt;g()&lt;/code&gt;, one time.&lt;/p&gt;
&lt;p&gt;With these tools, we can represent all of the natural numbers. This is called &lt;a href=&quot;https://en.wikipedia.org/wiki/Church_encoding#Church_numerals&quot;&gt;Church numerals&lt;/a&gt;, and here’s how it works:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;let zero = zero&apos;(succ, id); // zero any function applied to id zero times.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;let one = succ(succ, zero); // one is succ() applied to zero&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;let two = succ(succ, one); // two is succ() applied to one&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;let three = succ(succ, two); // three is succ() applied to two&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And so on. Now I have this crippling fear that I’ve messed up the notation, trying to transform it into something that looks more like “normal” programming. I’m sure that someone on the Internet is going to find some kind of flaw and call me an idiot over it.&lt;/p&gt;
&lt;p&gt;Ahem.&lt;/p&gt;
&lt;p&gt;Anyway, this is the core idea: you can count the number of times you’ve applied a function to identity, and that encodes the number you’re trying to represent. We don’t need state to represent numbers and counting, we can do it all through functions.&lt;/p&gt;
&lt;p&gt;The concept of “identity” is a really important one in philosophy. You can take all kinds of approaches here. One classic approach is called “Platonic idealism”, also known as “essentialism.” Essentialism states that you can tell the identity of something by the properties it has. For example, a chair is a chair because it has a platform for you to sit, it has four legs, and a back.&lt;/p&gt;
&lt;p&gt;The problem with essentialism is that well, there are things that you or I would reasonably call a chair that has three legs, or five or six. Not all things that have a place to sit can be called a chair, either. In other words, while it sounds reasonable at first, the real world absolutely destroys this kind of categorization, in my opinion.&lt;/p&gt;
&lt;p&gt;So what do you do? Another solution to this question is posed by a really broad family called ‘process philosophy.’ The solution to identity there is based around movement, change, becoming. Function application. A “chair” is a particular kind of object that participates in a world like other things that we call “chairs”. In other words, identity is something that comes out of &lt;em&gt;doing&lt;/em&gt;, not &lt;em&gt;being&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I am not the person I was ten years ago, quite literally. My body is made up of various kinds of cells, and they die at different rates. At a cellular level, I am quite literally dying all the time, in various microscopic places, and I am also regenerating. New cells are being produced. I am quite literally not my past self at a cellular level. And once I finally die, it’s not like my cells also instantly die either. Some of them will live for a period of time after I’m dead, though not for long. Bits of my body will actually out-live me.&lt;/p&gt;
&lt;p&gt;Life is full of growth and change. But at this point, the function has been applied so many times that I barely even recognize my past self. It makes me feel like I’m starting &lt;em&gt;now&lt;/em&gt;, so late into the game! I’ve wasted the earlier years of my life on all kinds of dumb and bad things.&lt;/p&gt;
&lt;p&gt;I constantly feel that I am running out of time, that I have not done enough, that I will be a failure. That my work will not be meaningful enough to be remembered, or worse, will be remembered as bad. When I express this kind of feeling, people often point this out:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://svbtleusercontent.com/yteofannex78va_small.png&quot; alt=&quot;https://svbtleusercontent.com/yteofannex78va_small.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;This doesn’t make me feel better, it makes me feel worse. There are so many things that I want to do that I’m &lt;em&gt;not&lt;/em&gt; working on. That hypermedia book still isn’t done. I have been a bad maintainer of Resque and all my other Ruby stuff. I didn’t listen to my friends in Greece, who told me to relax, and then the exact situation they predicted happened. I just hope I’m around long enough to make an impact on people and be a positive change in the world. We’ll see if I make it.&lt;/p&gt;
&lt;p&gt;There’s a whole ’nother rant here about Camus and Heidegger and absurd-ism and being-towards-death too. I will save that sophomoric rant for my “I’m turning 40” post.&lt;/p&gt;
&lt;h2 id=&quot;youth-cults&quot;&gt;Youth Cults&lt;/h2&gt;
&lt;p&gt;The second thing that’s making me feel terrible about turning 30 is the goddamn computer industry. It’s extra worse because historically, I have benefited from this particular terrible attitude. And that’s the worship of youth.&lt;/p&gt;
&lt;p&gt;I used to teach new programmers, and often give talks to classrooms full of them. They always want to know how I got started, and I always preface it with something like&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My story is one I don’t like to share, because I’m the living embodiment of a stereotype that I think is harmful to new programmers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I started with computers when I was seven. That shouldn’t matter. I’ve learned more about software in the last five years than I did from seven till I was 18. But we hold up these young genius whiz-kids (and let’s be serious, it’s not ‘kids’, it’s ‘boys’) as the epitome of what our industry can do. The heroic youth who understands computers better than those silly old people. What do they know, anyway?&lt;/p&gt;
&lt;p&gt;Age discrimination is real. It’s stupid, but it’s real. And even when you know that it’s stupid, it can still slip into your brain in a really terrible way. If I’m 30 and this is all I’ve done by now, well, why even bother?&lt;/p&gt;
&lt;p&gt;This is dumb. The attitude is dumb. That I disagree with it, yet still feel it at times, is dumb. Ideology is a motherfucker.&lt;/p&gt;
&lt;p&gt;So yeah, that’s it. My 20s are almost over. And I wasted some of the last bits of them writing this silly blog post. There’s no stopping it, just watching the clock tick forward, and doing my best as hard as I can until it’s all over. How many of these decades will I even get? My dad certainly thought he had a few more until that night he collapsed and found out that he had stage four, terminal cancer.&lt;/p&gt;
&lt;p&gt;Let’s see what I can do in the next ten years.&lt;/p&gt;</content:encoded></item><item><title>Hope</title><link>https://steveklabnik.com/writing/hope/</link><guid isPermaLink="true">https://steveklabnik.com/writing/hope/</guid><description>“The people are unstoppable / Another world is possible” This has long been my favorite protest chant. For me, it gets to the heart of the matter: another world is possible. If I’m honest with myself, most days, I don’t really believe that the world will get better. We often…</description><pubDate>Fri, 08 May 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;“The people are unstoppable / Another world is possible”&lt;/p&gt;
&lt;p&gt;This has long been my favorite protest chant. For me, it gets to the heart of the matter: another world &lt;em&gt;is&lt;/em&gt; possible. If I’m honest with myself, most days, I don’t really believe that the world will get better. We often present history as a kind of positive progression: the world has only been getting better, more tolerant, and less poor as the years go by. I don’t &lt;em&gt;feel&lt;/em&gt; that, though. What I see is imperialism, consolidation of power, and rampant racism/sexism/etc. Liberalism presents itself as an end of history, the final stop on the line. That’s unacceptable to me, but I usually feel like the only one.&lt;/p&gt;
&lt;p&gt;The start of this post sounds depressing, but I’m only writing it because I actually feel positive, invigorated. I’m writing this post from the Barcelona airport, about to board the plane home. It took me a while to figure this out, but what I realized is this: getting out of the US every once in a while really helps me feel better. This isn’t to say that things are actually &lt;em&gt;better&lt;/em&gt; in other places, that’s not my point. My point is that It’s not something like “European-style parlamentary democracy is better than a bicameral legislature” or something like that, just look at the UK election results. It’s that the street signs are different. The money isn’t the same. Familiar foods have changes. I see 漢字 instead of the Latin alphabet. Whatever is unusual about whatever part of the world I am in, it’s the smallest differences that have the largest impact on me and my state of mind.&lt;/p&gt;
&lt;p&gt;When I go somewhere else, I can &lt;em&gt;feel&lt;/em&gt; the difference. And difference is possibility. And possibility is hope, for a better world, for a better humanity.&lt;/p&gt;</content:encoded></item><item><title>I&apos;m going writeonly on Twitter for a while</title><link>https://steveklabnik.com/writing/im-going-writeonly-on-twitter-for-a-while/</link><guid isPermaLink="true">https://steveklabnik.com/writing/im-going-writeonly-on-twitter-for-a-while/</guid><description>This is something I’ve been joking about for a while, but I’ve decided for the near future, I’m just going to be posting things to Twitter, and not reading replies or anything. So, if you don’t get a fav or a reply or something, it’s nothing personal. There’s a lot going into…</description><pubDate>Wed, 03 Sep 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is something I’ve been joking about for a while, but I’ve decided for the near future, I’m just going to be posting things to Twitter, and not reading replies or anything.&lt;/p&gt;
&lt;p&gt;So, if you don’t get a fav or a reply or something, it’s nothing personal.&lt;/p&gt;
&lt;p&gt;There’s a lot going into this decision, but basically, I haven’t been actually doing a lot of things that I want to do because I’m super stressed out. Turns out Twitter is also a huge cause of stress in my life. Turns out Twitter is also a large part of my social interaction, so I’ve kept doing it even though I know it’s not great for me.&lt;/p&gt;
&lt;p&gt;So, we’ll see what a post-read/write Twitter is like. You know how to get a hold of me otherwise.&lt;/p&gt;</content:encoded></item><item><title>2013: year in review</title><link>https://steveklabnik.com/writing/2013--year-in-review/</link><guid isPermaLink="true">https://steveklabnik.com/writing/2013--year-in-review/</guid><description>Every year I try to do a “year in Review” blog post, and every year I realize I didn’t keep good notes. Sigh. Overall, this was a pretty… meh year, to be honest. :/ Don’t get me wrong, a lot of really, really good things happened, but as far as my grand strategic life goals go,…</description><pubDate>Tue, 31 Dec 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every year I try to do a “year in Review” blog post, and every year I realize I didn’t keep good notes. Sigh.&lt;/p&gt;
&lt;p&gt;Overall, this was a pretty… meh year, to be honest. :/ Don’t get me wrong, a lot of really, really good things happened, but as far as my grand strategic life goals go, this year was pretty much treading water, and in some cases, regressive. Oh well.&lt;/p&gt;
&lt;p&gt;So instead of doing as much of a review, I’m going to instead discuss what I’d like 2014 to be like:&lt;/p&gt;
&lt;h3 id=&quot;better-tracking&quot;&gt;Better tracking&lt;/h3&gt;
&lt;p&gt;In general, I don’t think I accomplished all I wanted to because I didn’t measure it at all. I’ve found that &lt;a href=&quot;http://beeminder.com/&quot;&gt;Beeminder&lt;/a&gt; has helped me track one or two of the things that I’ve really wanted to accomplish, and so I plan on making lots of use of that. It’s not perfect for everything, but it helps.&lt;/p&gt;
&lt;h3 id=&quot;reading&quot;&gt;Reading&lt;/h3&gt;
&lt;p&gt;I have so much I need to read. I think I’m going to start by recording chapters in Beeminder; books are too granular. I don’t think that a book every two weeks is an unreasonable goal, and I may turn it up if I get in the swing of things.&lt;/p&gt;
&lt;h3 id=&quot;writing&quot;&gt;Writing&lt;/h3&gt;
&lt;p&gt;I really need to finish off the hypermedia book, and the Rails 4 in Action book. R4IA should be easy, the hypermedia book will be harder.&lt;/p&gt;
&lt;h3 id=&quot;software&quot;&gt;Software&lt;/h3&gt;
&lt;p&gt;I want to contribute to Tor this year. I’ve been putting off contributing to Tor due to my paranoia about NSA stuff, but really, at this point, there’s nothing to worry about. I’m probably on all of those lists anyway. They’re watching everyone.&lt;/p&gt;
&lt;p&gt;In order to do that, I need to up my crypto game. I’d like to finish off the Matasano Crypto Challenge, and read a bunch more things.&lt;/p&gt;
&lt;p&gt;I also want to make lots of contributions to Rust this year, if not the language itself, the ecosystem. There’s so much work to be done.&lt;/p&gt;
&lt;h3 id=&quot;body&quot;&gt;Body&lt;/h3&gt;
&lt;p&gt;I’ve been trying to stay relatively fit, and it’s been okay, but I really need to get back on that train. I got a copy of “Starting Strength” for Christmas.&lt;/p&gt;
&lt;h3 id=&quot;languages&quot;&gt;Languages&lt;/h3&gt;
&lt;p&gt;I’m consistently embarassed that I only speak one language. I’ve been working on some German, and it’s been okay, but I need to take it more seriously. I’d also like to pick up the basic Japanese I had before.&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I think that’s it, at least for now. Let’s hope this next year is a good one.&lt;/p&gt;</content:encoded></item><item><title>Why I&apos;m partnering with Balanced</title><link>https://steveklabnik.com/writing/why-im-partnering-with-balanced/</link><guid isPermaLink="true">https://steveklabnik.com/writing/why-im-partnering-with-balanced/</guid><description>My next venture will be joining up with Balanced , an API for marketplace payments, and I’m really excited about it. To the tax man, of course, the title of this post is “Why I’m going to be an employee of Balanced,” but I like to think about it as a partnership. Why I Balanced I…</description><pubDate>Thu, 21 Nov 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;My next venture will be joining up with &lt;a href=&quot;https://www.balancedpayments.com/&quot;&gt;Balanced&lt;/a&gt;, an API for marketplace payments, and I’m really excited about it. To the tax man, of course, the title of this post is “Why I’m going to be an employee of Balanced,” but I like to think about it as a partnership.&lt;/p&gt;
&lt;h3 id=&quot;why-i-balanced&quot;&gt;Why I Balanced&lt;/h3&gt;
&lt;p&gt;I first heard of Balanced almost exactly a year ago. You see, my friend Chad had started this project called &lt;a href=&quot;https://www.gittip.com/&quot;&gt;Gittip&lt;/a&gt;. He was using Stripe to handle payments, but Gittip is a marketplace, and Stripe didn’t support marketplaces. So they gave Gittip a month to find another processor. So &lt;a href=&quot;https://github.com/gittip/www.gittip.com/pull/137&quot;&gt;a Balanced employee came along and submitted a pull request&lt;/a&gt;. I thought this was super awesome. So much so, that I tweeted it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;@jordanmessina It was like ‘hmm we can’t use stripe, who should we use?’ “oh hey, just swung by to integrate you with us. &amp;#x3C;3”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— Steve Klabnik (@steveklabnik) December 1, 2012&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;I still told people that story, but didn’t really think a whole lot more about Balanced than that. But every so often, I’d bump into them again. The next time Balanced came across my radar was when they &lt;a href=&quot;http://blog.balancedpayments.com/benefits-open-company-balanced/&quot;&gt;declared themselves an Open Company&lt;/a&gt;. Whoah. Now, don’t get me wrong: it’s not exactly socialism, but it &lt;em&gt;is&lt;/em&gt; super interesting. The idea of doing feature development and discussion out in the open is really interesting to me. For example, if you’re interested in seeing when Balanced supports international payments, you can check out &lt;a href=&quot;https://github.com/balanced/balanced-api/issues/23&quot;&gt;this Issue&lt;/a&gt;, and when the feature happens, you’ll know. That feature is obvious, but for less obvious ones, like &lt;a href=&quot;https://github.com/balanced/balanced-api/issues/204&quot;&gt;Bitcoin support&lt;/a&gt;, you can see that there’s real discussion, where the users who want a feature can help explain their use cases, Balanced will ask questions, and (hopefully) eventually it’ll get implemented.&lt;/p&gt;
&lt;p&gt;Anyway, so when I was looking for something new, Balanced seemed like a good fit. I dropped by their offices a few times, and met with the team. I was impressed when they included their intern, Matthew, in one of our meetings. Most companies I’ve seen treat their interns really poorly. When I mentioned that I was a Python newbie, Balanced’s CTO, &lt;a href=&quot;https://twitter.com/mahmoudimus&quot;&gt;Mahmoud&lt;/a&gt;, replied that that was perfect: if they only hired Python people, they’d only get Python answers, and monoculture is bad. During that discussion, I remembered my own startup, CloudFab, and remembered my cofounder’s issues getting us a bank account, because we were a marketplace. I had felt the pain Balanced is trying to solve before. At that point, I was in, but Mahmoud thanking me for my role in helping fight for equality in tech was extra icing on the cake.&lt;/p&gt;
&lt;h3 id=&quot;my-role&quot;&gt;My role&lt;/h3&gt;
&lt;p&gt;Anyway, that’s why I’m pumped about Balanced. So what exactly will I be doing? A few things, taken straight from my offer letter:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Design Balanced’s API based on the needs of our customers and the feedback of the team&lt;/li&gt;
&lt;li&gt;Lead Balanced’s path towards HTTP and JSON-API compliance&lt;/li&gt;
&lt;li&gt;Move standards forward to support Balanced’s innovation&lt;/li&gt;
&lt;li&gt;Build tools to allow Balanced and others to create standards compliant APIs&lt;/li&gt;
&lt;li&gt;Promote and evangelize the benefits of the Open Company philosophy&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To expand on these five steps:&lt;/p&gt;
&lt;p&gt;You can reach me at &lt;a href=&quot;mailto:steve@balancedpayments.com&quot;&gt;steve@balancedpayments.com&lt;/a&gt;. I have uploaded &lt;a href=&quot;http://pgp.mit.edu:11371/pks/lookup?op=vindex&amp;#x26;search=0x1782FE756ACC3706&quot;&gt;a PGP key&lt;/a&gt; to the MIT keyserver if that’s your jam.&lt;/p&gt;
&lt;p&gt;If you’re a Balanced customer and you have thoughts, good or bad, about Balanced, please get in touch.&lt;/p&gt;
&lt;p&gt;If you’re &lt;em&gt;not&lt;/em&gt; a Balanced customer, I’d love to hear why. Send me an email.&lt;/p&gt;
&lt;p&gt;I’ve joined the &lt;a href=&quot;http://www.w3.org/2001/tag/&quot;&gt;W3C TAG mailing list&lt;/a&gt;, and will be getting even more involved in the web standards process than I already am, to make sure that Balanced is keeping abreast of the latest standards, and to make sure that Balanced’s use-cases are properly advocated for as part of that process.&lt;/p&gt;
&lt;p&gt;I’ll be working hard on &lt;a href=&quot;http://jsonapi.org/&quot;&gt;JSON API&lt;/a&gt;, both with Balanced’s customers, our team, and with others who want to use the standard. Some tickets have been a bit stagnant: it’s now a part of my job to resolve them.&lt;/p&gt;
&lt;p&gt;I’ll be working on some tooling, hopefully with other companies that care about APIs, to build tooling that we all can use. If you’re in San Fransisco, I’d love to swing by your office and say hello. If not, email works too.&lt;/p&gt;
&lt;p&gt;If you want me to come speak to your usergroup, meetup, or conference about APIs, web standards, Open Companies, or payment systems, let me know, I really enjoy it.&lt;/p&gt;
&lt;p&gt;Expect to see a bunch of writing on the &lt;a href=&quot;http://blog.balancedpayments.com/&quot;&gt;Balanced blog&lt;/a&gt; from me on all of those topics, as well.&lt;/p&gt;
&lt;p&gt;I’m excited for the future. There’s so much work to do. Let’s all build some awesome APIs!&lt;/p&gt;</content:encoded></item><item><title>Keep Saturdays sacred</title><link>https://steveklabnik.com/writing/keep-saturdays-sacred/</link><guid isPermaLink="true">https://steveklabnik.com/writing/keep-saturdays-sacred/</guid><description>There are obviously a lot of factors that have contributed to my career as a programmer, but I think the most important one can be summed up in this sentence: Keep Saturdays sacred. You see, in college, my friends and I were moderately obsessed with writing software. We sorta…</description><pubDate>Sat, 28 Sep 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There are obviously a lot of factors that have contributed to my career as a programmer, but I think the most important one can be summed up in this sentence: Keep Saturdays sacred.&lt;/p&gt;
&lt;p&gt;You see, in college, my friends and I were moderately obsessed with writing software. We sorta stumbled onto a tradition of making sure that every Saturday, we got together and wrote code. At some point, we realized that this was the formula:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If none of us set our alarms, we’d all wander into the computer lab at 1pm Saturday.&lt;/li&gt;
&lt;li&gt;We then went and got some burritos from Chipotle.&lt;/li&gt;
&lt;li&gt;Once we were appropriately stuffed, we’d go back to the lab and hack on whatever.&lt;/li&gt;
&lt;li&gt;In our town, food was half off at certain restaurants after 11pm. So we’d code until then, and then go get some food, and then go home later.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Many people sifted in and out of this group over time, but a core was &lt;em&gt;always&lt;/em&gt; there. Every week. For two or three years. I was one of those people.&lt;/p&gt;
&lt;p&gt;Looking back, I think that time was where I grew the most as a software developer. I’ve been coding since I was very young, but didn’t really know what I was doing until that point. It’s where I tried out new stuff. Argued about methodology. Learned something about something.&lt;/p&gt;
&lt;p&gt;We weren’t even always working on the same projects. They were often quite different, and changed all the time. But it was a safe place to try things, a safe space to fail. A place to get support and help. To socialize and figure out just what the hell we were even doing.&lt;/p&gt;
&lt;p&gt;It was also an incredible privilege. Over the last few years, I’ve been too busy to keep that going. Life gets in the way. It’s hard when you don’t have that group. Maybe the solution, then, isn’t that it’s all day on a Saturday. Maybe it’s just finding &lt;em&gt;some&lt;/em&gt; kind of gap time, but doing it every week.&lt;/p&gt;
&lt;p&gt;Today, I’m doing work on &lt;a href=&quot;http://www.designinghypermediaapis.com/&quot;&gt;http://www.designinghypermediaapis.com/&lt;/a&gt; and the Rust compiler. What about you?&lt;/p&gt;</content:encoded></item><item><title>Thankfulness</title><link>https://steveklabnik.com/writing/thankfulness/</link><guid isPermaLink="true">https://steveklabnik.com/writing/thankfulness/</guid><description>I recently attended GoGaRuCo, which was a great conference. My favorite part, however, wasn’t directly attatched to the conf itself: it was a few moments of thankfulness. A lot of what I’ve been experiencing lately has been profoundly negative. That is what it is; there’s a lot…</description><pubDate>Tue, 24 Sep 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I recently attended GoGaRuCo, which was a great conference. My favorite part, however, wasn’t directly attatched to the conf itself: it was a few moments of thankfulness.&lt;/p&gt;
&lt;p&gt;A lot of what I’ve been experiencing lately has been profoundly negative. That is what it is; there’s a lot of realy negative things in the world. But I’ve been a bit… overloaded lately.&lt;/p&gt;
&lt;p&gt;The two moments tie into each other:&lt;/p&gt;
&lt;p&gt;I’m at the speaker dinner. I bumped into someone I hadn’t met or said hi to yet. “Oh hey Steve, I’m &lt;a href=&quot;https://twitter.com/samsaffron&quot;&gt;Sam&lt;/a&gt;.” “Oh hi! You don’t know how many times in the last few weeks I’ve said ‘Sam Saffron makes me so happy.’” You see, Sam works on &lt;a href=&quot;http://www.discourse.org/&quot;&gt;Discourse&lt;/a&gt;, and it’s a Rails app. Sam’s work on Discourse has identified some bugs and performance regressions in the Rails codebase, and Sam has been submitting some great pull requests upstream. Lately, I’ve been feeling like nobody who uses Rails actually cares how the sausage is made, and so Sam has been a bright spot in my day. So I told him so, straight to his face. It felt really good to say thanks, and I hope I made Sam’s day a bit brighter, as well.&lt;/p&gt;
&lt;p&gt;A couple times at the conference, someone would walk up to me and say basically the same thing for some other reason. It felt really good to have my work appreciated; the day-to-day grind of GitHub issue triaging can really make you feel crappy. Basically:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://s3.amazonaws.com/theoatmeal-img/comics/making_things/14.jpg&quot; alt=&quot;http://s3.amazonaws.com/theoatmeal-img/comics/making_things/14.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;negative comments&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://theoatmeal.com/comics/making_things&quot;&gt;The Oatmeal&lt;/a&gt; is often problematic, but this one really rings true.&lt;/p&gt;
&lt;p&gt;Anyway, I’m not trying to fish for compliments here. I have a fairly high profile, and I hear this more than most. What I &lt;em&gt;do&lt;/em&gt; want to emphasize, though, is that I’m sure it’s not just me that feels this way.&lt;/p&gt;
&lt;p&gt;So, if someone does something that you appreciate, please take a moment to say thank you. &lt;em&gt;Especially&lt;/em&gt; if they’re not someone who happened to get up on a stage and give a talk. Be specific: a generic ‘thanks for what you do’ is nice, but ‘oh man I lost two hours on that bug and your patch saved me’ is even nicer.&lt;/p&gt;
&lt;p&gt;You never know. They might have been having a bad day too, your thanks might turn their day around.&lt;/p&gt;</content:encoded></item><item><title>Twitter ghosts</title><link>https://steveklabnik.com/writing/twitter-ghosts/</link><guid isPermaLink="true">https://steveklabnik.com/writing/twitter-ghosts/</guid><description>I’ve been thinking about death more than usual lately; my father died just before Father’s Day a year ago, and so I remembered, then was constantly reminded again on that day. But there’s another death that’s recently happened that really bothers me. The Internet is a really…</description><pubDate>Sat, 22 Jun 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been thinking about death more than usual lately; my father died just before Father’s Day a year ago, and so I remembered, then was constantly reminded again on that day. But there’s another death that’s recently happened that really bothers me. The Internet is a really strange place.&lt;/p&gt;
&lt;p&gt;A few days ago, I was reading Twitter as I often do, and I saw a tweet that mentioned a death. I don’t remember which one it was, specifically, but I didn’t think a whole lot of it: death happens all the time, and this one referred to an accident. It basically just said something like “Whoah, Michael, it was way too soon to lose you. :(” I didn’t think much of it, but a few minutes later, I saw a few more tweets: “@mmhastings, amazing reporter, what a great guy, how tragic.” If a few of my followers all knew this dude, then he must be a good guy. So I clicked through to his Twitter profile:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/uy8cRbB.png&quot; alt=&quot;http://i.imgur.com/uy8cRbB.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Michael Hastings’ Twitter Profile&lt;/p&gt;
&lt;p&gt;Here’s what I noticed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;At least his last tweet is a nice one.&lt;/li&gt;
&lt;li&gt;He has 20,000 followers. Nice. And he’s only following 1,400 people, so it’s probably a legit number, not spammy.&lt;/li&gt;
&lt;li&gt;Oh, how weird, he’s from Hollywood. I lived there for half of last year, and am still in LA.&lt;/li&gt;
&lt;li&gt;Wait, he’s following &lt;em&gt;me&lt;/em&gt;? And I’m not following him?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As the day went on, more and more articles came out, and I read them all. Apparently, Michael Hastings was a really awesome guy. Apparently he was one of the few real reporters, the ones who dig in deep, aren’t afraid to speak about what they find, and never backed down. &lt;a href=&quot;http://www.rollingstone.com/politics/news/michael-hastings-rolling-stone-contributor-dead-at-33-20130618&quot;&gt;The story about his death in Rolling Stone&lt;/a&gt; says “Hastings’ hallmark as reporter was his refusal to cozy up to power.”&lt;/p&gt;
&lt;p&gt;So here’s what weirds me out about this situation:&lt;/p&gt;
&lt;p&gt;First of all, wow, life is short. At any given time, if I just got hit by a car and died, I probably wouldn’t be all that proud of my last tweet. Isn’t it weird, that when someone’s life gets cut short, we can see what they were up to right before their death? I can now read the words of a man I’d never spoken to, and see what he was up to and what he cared about. This isn’t new news, there’s even a 4chan meme (from back in the early days of /b/) about a kid who committed suicide and all of his friends writing eulogies on his MySpace page. This is one of the first times it’s (in)directly affected me, though, and so it’s taken on a different tone.&lt;/p&gt;
&lt;p&gt;Second, why didn’t I know who this was? Apparently this was a man who was a really great person, the kind I would have liked. And apparently he saw enough value in my random ramblings on Twitter to pay attention to me. But why didn’t I reciprocate? We lived in the same place. It wouldn’t have been hard to go grab a beer sometime. I walked past the intersection that he died many, many times. Would I have been friends with this person in some alternate universe?&lt;/p&gt;
&lt;p&gt;One of the things that I always said about my father’s death was that at least he had two months where he knew he was going to die. While it was an incredible stress on everyone involved, at least he was able to say everything to everyone he wanted to say something to, wrap up all his unfinished business, and make peace with the God he deeply believed in. Sudden deaths have their own entire element of terrible, where you don’t get that chance. I mean, I’ve been thinking about this situation basically nonstop for the last few days, and I didn’t even really know this person: I can’t imagine how horribly tragic this is for all of the people who were actually close to Michael. I saw what a toll my father’s death took on my mother, I can’t even imagine the grief his wife must be dealing with right now.&lt;/p&gt;
&lt;p&gt;So many questions. So few answers. So sad. All we can do is look at these digital remnants, wonder, and remember.&lt;/p&gt;</content:encoded></item><item><title>Closure</title><link>https://steveklabnik.com/writing/closure/</link><guid isPermaLink="true">https://steveklabnik.com/writing/closure/</guid><description>I spent six weeks of last December/January in my hometown. It was the first Christmas without my father, and it was cheap to stay, so I went back. It was my first time back in Pittsburgh since I’d moved away from the only place I’d ever lived. The trip was incredibly emotional…</description><pubDate>Fri, 19 Apr 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I spent six weeks of last December/January in my hometown. It was the first Christmas without my father, and it was cheap to stay, so I went back. It was my first time back in Pittsburgh since I’d moved away from the only place I’d ever lived.&lt;/p&gt;
&lt;p&gt;The trip was incredibly emotional for many reasons, but one of the best was when I decided to walk down the street to get a pizza. I had to wait ten minutes for it to cook, and so I decided to open up my web browser. Then I saw this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://svbtleusercontent.com/steveklabnik_24595149844116_small.png&quot; alt=&quot;https://svbtleusercontent.com/steveklabnik_24595149844116_small.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Whoah.&lt;/p&gt;
&lt;p&gt;You see, I’ve always had a complex relationship with _why. I had been dabbling in Ruby when he was still alive, and planned on dropping by this ART &amp;#x26;&amp;#x26; CODE thing I’d heard about over at CMU, but I was out of town that weekend, so I shrugged and didn’t think twice.&lt;/p&gt;
&lt;p&gt;Then he disappeared.&lt;/p&gt;
&lt;p&gt;I started looking into _why and what he was actually about. What I found was amazing, and you already know that part of the story. I thought Hackety Hack was a masterpiece, and decided to help maintain it. Unfortunately for me, nobody else did. I hadn’t done a whole lot of open source work before, and now I was maintaining a big, important project by one of the most well-known Rubyists of all time. Whoah.&lt;/p&gt;
&lt;p&gt;I cared about Hackety enough and felt inspired enough by _why that I actually quit my startup to spend more time working on it.&lt;/p&gt;
&lt;p&gt;Here’s the weird thing about someone disappearing: you can’t ask them questions. I had so many things that I wanted to ask, so many unresolved questions, so much I wanted to know. It’s really weird to take someone’s life’s work and make it your own. I spent a lot of that first year with crippling doubts about what I was doing, if _why would like it, if that even mattered, wondering why he’d abandoned something so important, why he’d abandoned &lt;em&gt;us&lt;/em&gt;. And I felt terrible that I &lt;em&gt;needed&lt;/em&gt; this from him. Why does he owe us all that? Who am I to impose?&lt;/p&gt;
&lt;p&gt;So I marked my calendar for the 18th, and waited. That was yesterday.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://distilleryimage6.s3.amazonaws.com/a8767b30a88f11e2896922000a1fbe1a_7.jpg&quot; alt=&quot;http://distilleryimage6.s3.amazonaws.com/a8767b30a88f11e2896922000a1fbe1a_7.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://distilleryimage11.s3.amazonaws.com/c22b37d2a8bc11e287e222000aaa0aa2_7.jpg&quot; alt=&quot;http://distilleryimage11.s3.amazonaws.com/c22b37d2a8bc11e287e222000aaa0aa2_7.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;It was… great. Just great. The stuff _why sent is basically everything I’d ever hoped. It’s got so much buried inside. An IF game, commentary on Jobs vs. Gates, a very person struggle with identity, a comment that he likes what we’ve done… it’s great. And it’s finally brought me some closure.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/steveklabnik/CLOSURE&quot;&gt;So, I’ve saved it all for &lt;em&gt;you&lt;/em&gt;. &amp;#x3C;3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://svbtleusercontent.com/steveklabnik_24595264609650_small.jpg&quot; alt=&quot;https://svbtleusercontent.com/steveklabnik_24595264609650_small.jpg&quot;&gt;&lt;/p&gt;</content:encoded></item><item><title>2012: year in review</title><link>https://steveklabnik.com/writing/2012-year-in-review/</link><guid isPermaLink="true">https://steveklabnik.com/writing/2012-year-in-review/</guid><description>I always enjoy reading patio11’s year in review posts , and while I didn’t take enough notes for this year to do a GOOD one, I figure that I should at least leave some notes so that when I do one next year, I’ll have something to benchmark against. Ruby This has been a whirlwind…</description><pubDate>Sat, 29 Dec 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I always enjoy reading &lt;a href=&quot;http://www.kalzumeus.com/2012/12/29/bingo-card-creator-and-other-stuff-year-in-review-2012/&quot;&gt;patio11’s year in review posts&lt;/a&gt;, and while I didn’t take enough notes for this year to do a GOOD one, I figure that I should at least leave some notes so that when I do one next year, I’ll have something to benchmark against.&lt;/p&gt;
&lt;h2 id=&quot;ruby&quot;&gt;Ruby&lt;/h2&gt;
&lt;p&gt;This has been a whirlwind year for my career. My work with Jumpstart Lab is incredibly fulfilling, and makes sure my bills get paid.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I flew all over the world. I’ve always wanted to travel, and while I complain about it a lot, it’s truly wonderful to be able to go places. I now have the second highest Delta frequent flyer tier memebership. If you’d told me that three years ago, I’d have laughed at you.&lt;/li&gt;
&lt;li&gt;I spoke at a &lt;em&gt;lot&lt;/em&gt; of conferences, and gave my first keynote. More lined up for next year already. Speaking is something I love to do.&lt;/li&gt;
&lt;li&gt;Teaching classes has been fantastic, and I’d love to do even more of it next year.&lt;/li&gt;
&lt;li&gt;I now have commit access to Rails. I put in a lot of work over the last few months, and this means a lot to me. Last step: core. We’ll see if I ever get there.&lt;/li&gt;
&lt;li&gt;I now have 22 gems, with Draper being my largest project, at almost 200,000 downloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unrelated to Ruby, I was able to contribute to a wide variety of projects in a few languages this year, and now have &lt;a href=&quot;http://github.com/steveklabnik&quot;&gt;116 repos on GitHub&lt;/a&gt;. A lot of those are abandoned or old, but still, they’re all something I was doing &lt;em&gt;something&lt;/em&gt; with this year.&lt;/p&gt;
&lt;h2 id=&quot;writing&quot;&gt;Writing&lt;/h2&gt;
&lt;p&gt;I finally made the &lt;a href=&quot;http://designinghypermediaapis.com/&quot;&gt;hypermedia book&lt;/a&gt; become a reality, and it’s done really well. Many people have told me that it has opened their eyes to a new way of doing things, and a bunch of startups have told me they’ll be releasing hypermedia APIs in 2013. Sales have been brisk: I don’t want to disclose exact numbers, but I will tell you that it’s in the 5 figure range. This has allowed me to start taking chunks out of my student loans: once they’re paid off, I will be super lean financially.&lt;/p&gt;
&lt;p&gt;I made it to the Svbtle blog network, which is invite-only. I’ve gotten mostly good feedback about everything I’ve done there, which is pleasing.&lt;/p&gt;
&lt;p&gt;I started &lt;a href=&quot;http://www.rustforrubyists.com/&quot;&gt;a book to learn Rust programming&lt;/a&gt; last week, as a way of helping myself learn Rust, making some more money, and testing out a publishing workflow that might influence the next iteration of Designing Hypermedia APIs. I like it a lot.&lt;/p&gt;
&lt;h2 id=&quot;reading&quot;&gt;Reading&lt;/h2&gt;
&lt;p&gt;I read a lot, though not as much as I’d like. I want to read 30 books this next year, and finally got into the habit of using GoodReads.&lt;/p&gt;
&lt;h2 id=&quot;etc&quot;&gt;Etc&lt;/h2&gt;
&lt;p&gt;I had a really good year in other regards: fulfilling relationships, fun times, good food… not everything was spectacular, but overall, really good. I moved out of my hometown, finally, and that’s been really great. I’m back now for the holidays, and it feels so small…&lt;/p&gt;
&lt;p&gt;The only really bad thing was the death of my father. That still has interesting effects on my life, but mostly in non-obvious ways. That’s all I’ll say about that.&lt;/p&gt;</content:encoded></item><item><title>Most things I do are interconnected</title><link>https://steveklabnik.com/writing/most-things-i-do-are-interconnected/</link><guid isPermaLink="true">https://steveklabnik.com/writing/most-things-i-do-are-interconnected/</guid><description>I work on a lot of different things. Sometimes I get asked how I find the time , but there’s another aspect not related to time management: most of my projects build off of each other. Draper and RequestStore This issue got filed in Draper. What Draper does isn’t important, but…</description><pubDate>Fri, 28 Dec 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I work on a &lt;em&gt;lot&lt;/em&gt; of different things. Sometimes I get asked &lt;a href=&quot;/writing/how-do-you-find-the-time/&quot;&gt;how I find the time&lt;/a&gt;, but there’s another aspect not related to time management: most of my projects build off of each other.&lt;/p&gt;
&lt;h2 id=&quot;draper-and-requeststore&quot;&gt;Draper and RequestStore&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/drapergem/draper/issues/390&quot;&gt;This issue&lt;/a&gt; got filed in Draper. What Draper does isn’t important, but it did have this code in it:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; self.current&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  Thread&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;current&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:current_view_context&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; build_view_context&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; self.current=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(context)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  Thread&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;current&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:current_view_context&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; context&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Basically, storing stuff in a &lt;code&gt;Thread&lt;/code&gt; local variable. This is great, normally, except when you run one of those new hot servers like Thin or Puma. They have a different concurrency model, and so while you’d normally expect this &lt;code&gt;Thread&lt;/code&gt; local to be &lt;code&gt;nil&lt;/code&gt; on each request, it will persist between requests.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;could&lt;/em&gt; have just fixed this bug in Draper, but I figured that it might be useful to someone else, so I whipped up a little gem to do it: &lt;a href=&quot;https://rubygems.org/gems/request_store&quot;&gt;request_store&lt;/a&gt;, and used the gem in Draper. I tweeted about it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;@steveklabnik Holy shit. I love you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— Dominic Dagradi (@dddagradi) December 17, 2012&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;Turns out that one of my friends had &lt;em&gt;exactly&lt;/em&gt; this problem, and wasn’t sure how to solve it. Now a bunch of people at Heroku are using my gem, and it’s helping them in their work.&lt;/p&gt;
&lt;p&gt;I wouldn’t have bothered building it if it didn’t scratch my itch, but by making it easy for other people to use, I helped them scratch their itch too.&lt;/p&gt;
&lt;h2 id=&quot;rust-for-rubyists-and-designing-hypermedia-apis&quot;&gt;Rust for Rubyists and Designing Hypermedia APIs&lt;/h2&gt;
&lt;p&gt;I’ve been working on a new iteration of &lt;a href=&quot;http://designinghypermediaapis.com/&quot;&gt;Designing Hypermedia APIs&lt;/a&gt; that is more linear and like a traditional book. The issue is that I’d built the entire platform for the project myself, and now spitting out ePUB and PDFs would be hard.&lt;/p&gt;
&lt;p&gt;Enter &lt;a href=&quot;http://www.rustforrubyists.com/&quot;&gt;Rust for Rubyists&lt;/a&gt;: I’d been learning Rust, and there are very few docs since it’s a new programming language. I had also seen Zed Shaw present at RuPy recently, and he showed off &lt;a href=&quot;http://orkestrix.org/&quot;&gt;Orkestrix&lt;/a&gt;, which let him generate a site and a book for music stuff.&lt;/p&gt;
&lt;p&gt;So I decided to write up what I’d learned as &lt;a href=&quot;http://www.rustforrubyists.com/&quot;&gt;a tutorial on programming in Rust&lt;/a&gt;, and built it using the Orkestrix gear. I also tried out &lt;a href=&quot;http://getdpd.com/&quot;&gt;DPD&lt;/a&gt; after seeing others use it. It’s only been up for two days, but I really like the combo, and today I pushed my first update out to the people who bought a copy already.&lt;/p&gt;
&lt;p&gt;This has given me the confidence that the tooling process is good enough to use for DHAs, so I’ll be doing all of that soon.&lt;/p&gt;
&lt;h2 id=&quot;rails-and-resque&quot;&gt;Rails and Resque&lt;/h2&gt;
&lt;p&gt;I started working on Resque because we needed to have a few production implementations of the new ActiveQueue system going before Rails 4 was released. I was already working on Rails to help get 4 out the door, and Terence was obviously swamped by all the things he works on. So helping out with Resque would help out with Rails.&lt;/p&gt;
&lt;h2 id=&quot;bring_back_snowman-and-configuration&quot;&gt;bring_back_snowman and configuration&lt;/h2&gt;
&lt;p&gt;When I don’t know how to do something, I often look at a gem that does what I’m interested in doing, and copy how it does it. I had never built a gem that allowed you to configure it using the &lt;code&gt;config.something&lt;/code&gt; pattern before, so I peeked at a few gems to learn how.&lt;/p&gt;
&lt;p&gt;I had also been thinking a lot about the Rails 4 release, and what was new since Rails 3. I was teaching a new batch of people Rails with &lt;a href=&quot;http://jumpstartlab.com/&quot;&gt;Jumpstart Lab&lt;/a&gt;, my employer, and was explaining why we have &lt;code&gt;form_for&lt;/code&gt; generate a ✔. This gave me an idea: What if you could configure what Rails used in this case?&lt;/p&gt;
&lt;p&gt;So I built &lt;a href=&quot;https://github.com/steveklabnik/bring_back_snowman&quot;&gt;bring_back_snowman&lt;/a&gt;. It’s not very &lt;em&gt;useful&lt;/em&gt;, but it is cute and fun, and more importantly, &lt;a href=&quot;https://github.com/steveklabnik/bring_back_snowman/blob/master/lib/bring_back_snowman.rb#L5-L13&quot;&gt;it serves as a concise example of how to build a configurable option into your gems&lt;/a&gt;. I can always look at that code if I forget how this works, or point others to it if they ask.&lt;/p&gt;
&lt;h2 id=&quot;many-many-more&quot;&gt;Many, many more&lt;/h2&gt;
&lt;p&gt;These are just the most recent examples I can think of. I’d really encourage you to try this sometime: if you want to learn something, make a new little project. Make it small. Make it focused. Make it help you out with something bigger.&lt;/p&gt;
&lt;p&gt;Pretty soon, you’ll feel mega-productive too.&lt;/p&gt;</content:encoded></item><item><title>I got hit by a car today</title><link>https://steveklabnik.com/writing/i-got-hit-by-a-car-today/</link><guid isPermaLink="true">https://steveklabnik.com/writing/i-got-hit-by-a-car-today/</guid><description>“Humans are really squishy, messy, complicated, and contradictory. That’s what makes life interesting.” Veggie Grill is damn delicious, but it’s hard to talk and eat at the same time. I’m usually trying to shovel my Santa Fe Chickin’ sandwich into my face as hard as possible.…</description><pubDate>Thu, 25 Oct 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;“Humans are really squishy, messy, complicated, and contradictory. That’s what makes life interesting.”&lt;/p&gt;
&lt;p&gt;Veggie Grill is damn delicious, but it’s hard to talk and eat at the same time. I’m usually trying to shovel my Santa Fe Chickin’ sandwich into my face as hard as possible. Today, though, there was a screw-up, and I didn’t get my food for a while. So I talked instead.&lt;/p&gt;
&lt;p&gt;“Do you know anything about Hegelian dialectics?”&lt;/p&gt;
&lt;p&gt;My friends are the best. Most people don’t put up with rambling, half-formed ideas, but mine generally entertain them, even though they haven’t read the books I’m talking about. I’m really grateful for this, as describing things really helps me sort them out in my head. The blank look and continued chewing meant that this was once again one of those times. Whatever.&lt;/p&gt;
&lt;p&gt;“Basically, dialectics are a method of finding the truth in a threefold process: First, a ‘thesis’ is presented, which makes some sort of statement about the world. Then, the ‘antithesis’ contradicts it in some fashion. Finally, a ‘synthesis’ is found which resolves the tension between the two opposing sides. It’s a really interesting way of looking at the world; I’ve found it’s way easier to find things that totally contradict each other than I thought. Synthesis is really hard, though. Think about a trial, for example: the story of the plaintiff is told, then the story of the defendant, then the jury figures out what actually happened. There’s three sides to every story.”&lt;/p&gt;
&lt;p&gt;Last week, I flipped over the handlebars of a bike. I was pumping as hard as I could, trying to make the light before it turned red, and the chain couldn’t take the tension any longer. It popped off, went between the back wheel and the frame, and stopped it cold. A few seconds later my eyebrows were scraping across the pavement. Lots of blood, but no serious injuries. I’m going to have a few sweet scars, though…&lt;/p&gt;
&lt;p&gt;“Anyway, we were talking about feelings and ways people act before, but it’s true of physical bodies as well. Sometimes, accidents happen, and before you can even react, you’re dead. Other times, you escape with very little damage. We’re simultaneously incredibly vulnerable and almost impervious. Some people get in a bike accident and their life is forever changed. Other times, like me last week, you get away with a few scrapes. Once I fell about 8 feet onto my knees. Landed right on some pavement. I walked away 5 minutes later, didn’t even have bruises. I still have no idea what the fuck happened there.&lt;/p&gt;
&lt;p&gt;I still haven’t found the synthesis yet.”&lt;/p&gt;
&lt;p&gt;After lunch, it’s time to bike home. It’s about 15 miles, which I can do pretty much at the drop of a hat nowadays. I really enjoy biking up Santa Monica Boulevard, but I hate it, too. It’s nice and broad, with two lanes, a bunch of green in the middle, and some bike lanes. Of course, it isn’t all like this, but much of it is. Especially on a day like today, around noon, it’s really pretty in places.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/commons/6/62/Santa_Monica_Boulevard_at_Thayer.jpg&quot; alt=&quot;http://upload.wikimedia.org/wikipedia/commons/6/62/Santa_Monica_Boulevard_at_Thayer.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;So I’m about 8 miles into my trip, and the next thing I know, I’m on the ground. Here’s the basic problem:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.examiner.com/images/blog/wysiwyg/image/car-in-bikelane-small.jpg&quot; alt=&quot;http://www.examiner.com/images/blog/wysiwyg/image/car-in-bikelane-small.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;Yeah. Bike lanes don’t help if someone wants to turn right. When alongside cars, it’s very, very important to keep alert for two things: Open doors from parked cars, and drivers who don’t use their turn signals. A few weeks ago, I almost got hit by someone in this same exact way, just a few blocks down the street. I was paying close attention, and actually guessed that they were going to turn before they did. Free driver psychoanalysis done here! But more seriously, this was in the middle of the block. This guy saw that there was a space at this parking garage, hit his breaks and turned right without looking.&lt;/p&gt;
&lt;p&gt;“YOU STUPID MOTHERFUCKER! WATCH WHERE THE FUCK YOU’RE GOING, YOU’RE GOING TO FUCKING KILL SOMEONE! JESUS!”&lt;/p&gt;
&lt;p&gt;I ran a systems diagnostic check, and I was good, but enraged. Some pedestrians were screaming, and one ran over and asked if I was okay. “I said, yes, thank you, at least until this guy fucking kills me or someone else,” got back on my bike, and drove off.&lt;/p&gt;
&lt;p&gt;At least my handlebars gave him a big long scratch the whole way up his car. Fucker.&lt;/p&gt;
&lt;p&gt;There’s also something else interesting in this story as well: Generally, in a car/human interaction, I am the squishy one, and the car is the tank. Yet, in this particular interaction, I basically escaped unscathed, while the car took some damage. Once again, life is surprising, producing an inversion of the expected circumstances.&lt;/p&gt;
&lt;p&gt;Anyway, if you drive a car, please, please, please watch what you’re doing. Pedestrians and cyclists don’t have thousands of pounds of metal surrounding them. Cyclists, please stay safe; it’s a jungle out there.&lt;/p&gt;
&lt;p&gt;Ultimately, life is made out of these little incidents. Each moment to the next, you have no idea what’s going to happen. It’s exciting, scary, and sloppy. But that’s what makes it interesting. And you also don’t know when it’s going to end.&lt;/p&gt;
&lt;p&gt;I still haven’t found that synthesis…&lt;/p&gt;</content:encoded></item><item><title>Living with a terrible taste in music</title><link>https://steveklabnik.com/writing/living-with-a-terrible-taste-in-music/</link><guid isPermaLink="true">https://steveklabnik.com/writing/living-with-a-terrible-taste-in-music/</guid><description>Music has always been very important to me. Throughout most of my life, I’ve listened to a lot of music, and it’s played a huge role in defining my personality at the time I listened to it. In many ways, the history of the music I’ve listened to is a history of me. Here’s a look…</description><pubDate>Fri, 12 Oct 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Music has always been very important to me. Throughout most of my life, I’ve listened to a lot of music, and it’s played a huge role in defining my personality at the time I listened to it. In many ways, the history of the music I’ve listened to is a history of me.&lt;/p&gt;
&lt;p&gt;Here’s a look at where I’ve been, and where I’m at now.&lt;/p&gt;
&lt;h2 id=&quot;country&quot;&gt;Country&lt;/h2&gt;
&lt;p&gt;My parents essentially listen exclusively to country music, and so it’s basically all I listened to for the first decade of my life. And when I say country, I don’t mean old stuff, I mean proto-pop country:&lt;/p&gt;
&lt;p&gt;Many, many people that I know now are quite surprised by this. Country is one of those genres that brings out a certain revulsion in people. It still comes up from time to time, and my understanding of country brings out a laugh. Once in college, I was in a friend’s hometown, the Middle of Nowhere, PA. His brother rolls up in his huge pickup truck, blasting some George Straight. My friend looks at me, and rolls his eyes. With a straight face, I start saying the words as George sings them. The look of shock and confusion on his face was priceless.&lt;/p&gt;
&lt;p&gt;In many ways, that’s exactly who I was destined to be: just a country boy gettin’ down on the farm.&lt;/p&gt;
&lt;p&gt;But then, I discovered skateboarding, and punk rock.&lt;/p&gt;
&lt;h2 id=&quot;punk&quot;&gt;Punk&lt;/h2&gt;
&lt;p&gt;Of course, it wasn’t even good punk music, either. See, I had always thought skateboarding was neat, but wasn’t never had one because there was nowhere to ride it. I lived on a farm, we didn’t have any pavement anywhere. So I forgot about skating. But then I got a call from a friend, he’d just gotten a new video game:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;thps 1 cover&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;317&quot; height=&quot;315&quot; src=&quot;/_astro/tonyhawksproskaterplaystation1.Cgvm_L4f_Z1j8PYi.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Here’s the soundtrack list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Police Truck” by the Dead Kennedys&lt;/li&gt;
&lt;li&gt;“Here and Now” by The Ernies&lt;/li&gt;
&lt;li&gt;“Vilified” by Even Rude&lt;/li&gt;
&lt;li&gt;“Superman” by Goldfinger&lt;/li&gt;
&lt;li&gt;“Jerry Was a Race Car Driver” by Primus&lt;/li&gt;
&lt;li&gt;“Screamer”/“Nothing to Me” by Speedealer&lt;/li&gt;
&lt;li&gt;“Cyco Vision” by Suicidal Tendencies&lt;/li&gt;
&lt;li&gt;“New Girl” by The Suicide Machines&lt;/li&gt;
&lt;li&gt;“Committed” by Unsane&lt;/li&gt;
&lt;li&gt;“Euro-Barge” by The Vandals&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pretty awesome. He also had this new album that came out at the same time…&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;enema of the state&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;500&quot; height=&quot;498&quot; src=&quot;/_astro/blink-182-enema-of-the-state-front.AjKPHrlt_1JNsMj.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;From there, it was all over. All this edginess combined with my (just budding, of course) testosterone meant I was pretty much set. The funniest part about this period of my life was that I actually wasn’t really a particularly rebellious child: I maintained pretty damn good grades, save for a few semesters, I still went to church, and I was generally a good kid. I didn’t even smoke pot! Yet even the act of possessing these albums was heinously offensive. I got grounded for half a year for possessing Blink182’s “Take off your Pants and Jacket” and Limp Bizkit’s “Three Dollar Bill, Y’all$.” This constant conflict over music with my parents dominates my memories at the time. I literally printed out all the lyrics and wrote two pages explaining why I should be allowed to own a copy of the Offspring’s “Americana” even though they said ‘shit’ a few times. Punk, even third generation pop-punk, really spoke to my desire for autonomy and my attempts to be my own person.&lt;/p&gt;
&lt;h2 id=&quot;metal&quot;&gt;Metal&lt;/h2&gt;
&lt;p&gt;Of course, slippery slopes are everywhere, and so I started searching for harder and harder music. Always the &lt;a href=&quot;/writing/how-do-you-find-the-time/&quot;&gt;min/maxer&lt;/a&gt;, I looked for loopholes in my parent’s rules. The biggest hole: anything from the Christian Family Bookstore was fair game. So I scoured it for anything awesome. That’s when I found Zao:&lt;/p&gt;
&lt;p&gt;Screw punk, metal was way more awesome. I grew my hair out long and learned to headbang.&lt;/p&gt;
&lt;p&gt;I don’t think I need to explain to you why metal is ridiculous. I mean, come on:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;dethklok&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;638&quot; height=&quot;359&quot; src=&quot;/_astro/dethklokbandfeb2024-638.4K824gGf_21GlOK.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;hardcore&quot;&gt;Hardcore&lt;/h2&gt;
&lt;p&gt;Of course, there has to be a way to reconcile all this, right? Take two steps forward, one step back? Well, that’s hardcore.&lt;/p&gt;
&lt;p&gt;My fascination with hardcore in late high school and early college was two-fold, like ‘hardcore’ itself: there’s ‘hardcore’ and then there’s ‘hardcore punk.’ Hardcore punk is a specific sub-genre of punk rock from the 80s, and hardcore is its continuation in the modern day, after that whole emo thing happened.&lt;/p&gt;
&lt;p&gt;To recap: hardcore punk:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;minor threat poster&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;347&quot; height=&quot;450&quot; src=&quot;/_astro/a18-minorthreat.DvkdAHvI_Z6zTTT.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;hardcore:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;slam dancing&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;360&quot; height=&quot;240&quot; src=&quot;/_astro/tumblr-lpqekrwmct1qh3e7yo1-400.DlpO9mi9_ZPXCWi.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Uuhhh yeah. Hardcore punk also brought me to straightedge, which leads to silliness like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;my straightedge tattoo&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;453&quot; height=&quot;604&quot; src=&quot;/_astro/kmcwp.CA3Rrtn6_Z1x9O3y.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;To this day, I still don’t regret this tattoo, and anyone that’s seen me at a Ruby conference knows that I’m not straightedge anymore. But this music and philosophy defined who I was for about 8 years, which was, at the end of it, about a third of my life. It changed my college experience. I’m (basically) permanently marked by it.&lt;/p&gt;
&lt;p&gt;But no, seriously:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;slam dancing&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;360&quot; height=&quot;240&quot; src=&quot;/_astro/tumblr-lpqekrwmct1qh3e7yo1-400.DlpO9mi9_ZPXCWi.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;party-rock&quot;&gt;Party Rock&lt;/h2&gt;
&lt;p&gt;Anyway, so nowadays, this is what I listen to:&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/edP0L6LQzZE?si=uTrbb2_tUchSk1FC&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/k0BWlvnBmIE?si=m4OITv0l29x0zot5&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;Here’s the thing: once I finally admitted to myself that I enjoy terrible pop music and stopped trying to apologize for my taste, I realized I was way more productive. Upbeat music with a vaguely positive vibe means I get shit done. Way better than the heavy, dreary, angry stuff I listened to in the past. I listen to hours of music a day, and I’d much rather have it be happy…&lt;/p&gt;
&lt;p&gt;But that’s when I realized I’ve basically always had bad taste in music.&lt;/p&gt;
&lt;p&gt;The thing is, that’s totally okay! Music has always provided an interesting backdrop for the rest of my life, and it’s fit whatever moment I was living. Writing this post was a blast, because I’d forgotten about half of this stuff, and re-living it is a good time. I can remember debating my friends about the Casualties being street punk or hardcore, if some band had really sold out, or if straightedge still matters now that Ian MacKaye smokes pot.&lt;/p&gt;
&lt;p&gt;I wonder what I’ll be listening to in five years.&lt;/p&gt;</content:encoded></item><item><title>New blog: Words</title><link>https://steveklabnik.com/writing/new-blog--words/</link><guid isPermaLink="true">https://steveklabnik.com/writing/new-blog--words/</guid><description>I’ve started a new blog: Words . You may have noticed that it’s a part of the Svbtle blogging network . I’m super excited about this, but you may be confused. Let me explain. My relationship with writing I’ve been involved in Internet communities for most of my life. One of the…</description><pubDate>Fri, 31 Aug 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve started a new blog: &lt;a href=&quot;https://web.archive.org/web/20200604152340/https://words.steveklabnik.com/&quot;&gt;Words&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You may have noticed that it’s a part of &lt;a href=&quot;https://svbtle.com/&quot;&gt;the Svbtle blogging network&lt;/a&gt;. I’m super excited about this, but you may be confused. Let me explain.&lt;/p&gt;
&lt;h2 id=&quot;my-relationship-with-writing&quot;&gt;My relationship with writing&lt;/h2&gt;
&lt;p&gt;I’ve been involved in Internet communities for most of my life. One of the nice things about that is that it’s forced me to express myself in writing for a very, very long time.&lt;/p&gt;
&lt;p&gt;I don’t remember what site this is, but there was one that generated a PDF of your top 100 comments on Hacker News. The idea was “You’ve already written a book!” You can see this kind of thinking in many “Blog to book” books that are out there, but I found this really powerful. My top 100 comments span 19 pages; I was (at one point) number 60 on the top of Hacker News by karma. And I really was only active on HN for about a year, February 2010 to 2011. I spent much more time on /., Reddit, and a half dozen forums. I bet if you compiled a list of everything I ever wrote in a &lt;code&gt;&amp;#x3C;textarea name=&quot;comment&quot; id=&quot;comment&quot;&gt;&lt;/code&gt;, I would have written at least 3 novels by now. They’d be shit, of course, but the point is that if you’re active at all on the read/write web, then you’ve probably written a ton.&lt;/p&gt;
&lt;p&gt;As a side point, I really enjoyed the anonymity that posting on the web gave me. I could be 13, yet arguing with people who were 30! And they’d actually take me seriously, since they didn’t know I wasn’t an adult! Of course, the only way they wouldn’t know is if I posted proper English… grammar nazis helped me out, in a way.&lt;/p&gt;
&lt;p&gt;Anyway.&lt;/p&gt;
&lt;h2 id=&quot;practice-makes-perfect&quot;&gt;Practice makes perfect&lt;/h2&gt;
&lt;p&gt;Of course, this means that at first, I &lt;em&gt;wasn’t&lt;/em&gt; practiced at writing, and that means that &lt;a href=&quot;http://games.slashdot.org/comments.pl?sid=87657&amp;#x26;cid=7604346&quot;&gt;it was any good…&lt;/a&gt; That’s the only way that you get better, though: write and write and write and write. And get feedback on that writing. Originally, it was just people commenting back. Then upvotes. I’m pretty sure that I’ve averaged over two or three comments a day on the Internet over the past decade or so. If you include tweets, I bet the median is about the same, but the mean would go up to 6 or 8.&lt;/p&gt;
&lt;p&gt;Regardless, I tend to be very off-the-cuff when writing. When I’m done writing this blog post, I will type &lt;code&gt;:wq&amp;#x3C;enter&gt;git commit -am &quot;add &apos;words&apos;&quot;&amp;#x3C;enter&gt;git push origin,heroku&amp;#x3C;enter&gt;&amp;#x3C;alt-tab&gt;&amp;#x3C;f5&gt;&amp;#x3C;f5&gt;&amp;#x3C;f5&gt;&amp;#x3C;f5&gt;&amp;#x3C;f5&gt;&amp;#x3C;f5&gt;&amp;#x3C;f5&gt;&amp;#x3C;f5&gt;&lt;/code&gt; . Then tweet. I end up doing very little proofreading of the things I write, and that means that sometimes, my writing suffers. I’ve settled into a local maximum: I’m Good Enough at writing that people like what I write, and I can quickly type something out and get it up there. But I don’t think I’m getting any &lt;strong&gt;better&lt;/strong&gt; at writing. And I’d like to.&lt;/p&gt;
&lt;h2 id=&quot;gamification-and-exhibitionism&quot;&gt;Gamification and Exhibitionism&lt;/h2&gt;
&lt;p&gt;I’ve also come to realize something about myself over the years: I respond really well to gamification, and am somewhat of an exhibitionist. Or at the very least, an extrovert. These two things in combination are a powerful mixture.&lt;/p&gt;
&lt;p&gt;When I started playing StarCraft II, I knew I wanted to get better. So I set up &lt;a href=&quot;http://www.twitch.tv/emmagoldmansc&quot;&gt;an account on Twitch&lt;/a&gt;. I sometimes stream games there. I’m in Silver league, which means I’m not that good. But knowing that someone may be watching makes me want to be better at it. I sometimes &lt;a href=&quot;https://vimeo.com/37978370&quot;&gt;release videos of me live coding&lt;/a&gt;. Almost everything &lt;a href=&quot;https://github.com/steveklabnik&quot;&gt;I code is open source&lt;/a&gt;. Knowing that others might be watching makes me want to be at my best.&lt;/p&gt;
&lt;p&gt;Gamification can help with this, too. Monotonically increasing numbers are terribly addicting, and trigger something deep down in my brain. I’ve been known to refresh my retweet count or my upvote count every so often just to watch that number get higher. Combining this with public-ness means that I can compare myself to everyone else with a number too, and I can get to the top of the leaderboard! I’m terribly competitive at gaming, and quantification is the first step towards gamification and competition. I’ve been watching the Quantified Self movement from afar specifically because I’m afraid that I’ll do nothing but ‘self-improve’ and then not use that improvement for anything worthwhile.&lt;/p&gt;
&lt;h2 id=&quot;svbtle&quot;&gt;Svbtle&lt;/h2&gt;
&lt;p&gt;If you haven’t heard, &lt;a href=&quot;http://dcurt.is/codename-svbtle&quot;&gt;Svbtle&lt;/a&gt; is Dustin Curtis’ blogging network. I remember reading that post when Dustin started it, and this was the part that stuck out to me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The goal is simple: when you see the Svbtle design, you should know that the content is guaranteed to be great.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’m always looking for good things to read on the Internet, so I kept this idea in the back of my head. When I saw a Svbtle blog, I raised my expectations. I can really enjoy bad things as long as I go into them expecting that they’re bad; I’m not the type of person that only enjoys high-brow stuff. And generally, blogs have low-brow expectations for me.&lt;/p&gt;
&lt;p&gt;Anyway, after a couple of months, I noticed that I really did think that most posts on Svbtle were pretty damn good. At the very least, they weren’t bad in the way that many blog posts are: super flamebait, shit-talking, or half-baked. I also kept looking at my blog, and realized that many of my posts are sort of trivial, or not really up to my current standards, or have those kinds of flaws. And finally, I &lt;em&gt;hate&lt;/em&gt; CSS. Like, I’m no good at it. At all. And I’m sick of messing around with my own style. But most blogging software sucks…&lt;/p&gt;
&lt;p&gt;So I applied.&lt;/p&gt;
&lt;p&gt;It’s sort of funny to talk about hating startups and centralized internet companies, then go from my own Jekyll blog to a hosted solution. There are a few huge wins for me with Svbtle, though:&lt;/p&gt;
&lt;p&gt;Ultimately, it’s all posted on my own domain via the magic of CNAME. This means that in the future, I can re-host everything myself if I want to. I’ve already done this previously when I moved from Posterous to my own blog, and even have &lt;a href=&quot;https://github.com/steveklabnik/blog/blob/master/redirects.rb#L32&quot;&gt;redirects.rb&lt;/a&gt; already set up. Secondly, Svbtle will send me an archive of all my posts if I ask, which means that I’m never going to lose the data. I will probably keep my own backups locally as well. But in the event that Svbtle goes south, I’m not locked in.&lt;/p&gt;
&lt;p&gt;Getting kicked off of Svbtle for having bad content would make me really upset. If it’s a blog network that’s high quality, and my writing isn’t up to snuff, that would make me sad. Time to level up! Now that I’m there, I want to stay there. This gives me lots of motivation to write high quality things, and to improve. And Svbtle provides tools to help me become a better writer, like vetting and copy editing. That’s a pretty huge attraction to me.&lt;/p&gt;
&lt;p&gt;Finally, there’s light gamification with the whole Kudos thing. I know that I’ll be trying to get as many as possible with each post, too, and that it can give me reasonable feedback in some fashion. Not as good as well-written responses, but it’s easier to give someone internet points than it is to write a full rebuttal.&lt;/p&gt;
&lt;h2 id=&quot;two-blogs&quot;&gt;Two blogs&lt;/h2&gt;
&lt;p&gt;I’m still going to keep this blog going; it’s gonna shift to something that’s more about code and less about politics. Words will be more politics and theory with a de-emphasis on code. This blog will be more like a Tumblr in that I’ll post more often, do less work on each post, and make the good but quick. Words will become a place where I’ll take my time, post less frequently, but really work on the polish.&lt;/p&gt;
&lt;p&gt;I hope you’ll enjoy continuing to read the things I write about, here or there.&lt;/p&gt;</content:encoded></item><item><title>Finale</title><link>https://steveklabnik.com/writing/finale/</link><guid isPermaLink="true">https://steveklabnik.com/writing/finale/</guid><description>This morning, my mother woke up and found that my father had passed away in the night. Thanks for all the love and support you all have shown me over the last two months. It’s been hard, but you all have made it easier. Don’t be worried if you don’t see me around a lot for the…</description><pubDate>Wed, 30 May 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This morning, my mother woke up and found that my father had passed away in the night.&lt;/p&gt;
&lt;p&gt;Thanks for all the love and support you all have shown me over the last two months. It’s been hard, but you all have made it easier.&lt;/p&gt;
&lt;p&gt;Don’t be worried if you don’t see me around a lot for the next few days. Just trying to take some time off from the hustle to help my family heal. And to just play video games and be a bit mindless.&lt;/p&gt;
&lt;p&gt;No, seriously. Thank you.&lt;/p&gt;</content:encoded></item><item><title>Cards for dad - follow-up</title><link>https://steveklabnik.com/writing/cards-for-dad--follow-up/</link><guid isPermaLink="true">https://steveklabnik.com/writing/cards-for-dad--follow-up/</guid><description>Hey everyone! It’s been a few weeks, and I wanted to update you guys on the card situation. First of all, thank you so much. Every single one of you who sent cards, thank you! It was truly amazing to see so much support. I was even more surprised that I basically put my address…</description><pubDate>Sun, 22 Apr 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hey everyone! It’s been a few weeks, and I wanted to update you guys on the card situation.&lt;/p&gt;
&lt;p&gt;First of all, thank you so much. Every single one of you who sent cards, thank you! It was truly amazing to see so much support. I was even more surprised that I basically put my address on the internet and nothing particularly bad happened. Zero trolls. Restored some of my faith in humanity.&lt;/p&gt;
&lt;p&gt;We ended up with about 500 cards. My dad is well enough to stay at home, but the chemo is pretty rough, so he has good days and bad days. I go home to visit about once a week, but we don’t really know how well and if it’s really working yet, so no actual understanding of how long he has. Regardless, it all made a big impact, so thank you again.&lt;/p&gt;
&lt;p&gt;Here’s some pictures:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/mcQSG.jpg&quot; alt=&quot;http://i.imgur.com/mcQSG.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/GmmhJ.jpg&quot; alt=&quot;http://i.imgur.com/GmmhJ.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/RV4k8.jpg&quot; alt=&quot;http://i.imgur.com/RV4k8.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/QVTJK.jpg&quot; alt=&quot;http://i.imgur.com/QVTJK.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/YxXqj.jpg&quot; alt=&quot;http://i.imgur.com/YxXqj.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;Oh, and I didn’t read very many of them personally, since they were for my dad, not for me. My parents read and cherished all of them, though. They said that you all said too many nice things about me, so thank you for all of that as well.&lt;/p&gt;</content:encoded></item><item><title>Birthday cards for Dad</title><link>https://steveklabnik.com/writing/birthday-cards-for-dad/</link><guid isPermaLink="true">https://steveklabnik.com/writing/birthday-cards-for-dad/</guid><description>Hey everyone. If you follow me on Twitter, you’ll know that I’ve been a bit absent lately. Basically, my dad has angiosarcoma . It’s a really rare cancer of the blood vessels. A city the size of Pittsburgh sees two cases every ten years, roughly. It’s certainly terminal, while he…</description><pubDate>Mon, 26 Mar 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hey everyone. If you follow me on Twitter, you’ll know that I’ve been a bit absent lately. Basically, my dad has &lt;a href=&quot;http://en.wikipedia.org/wiki/Angiosarcoma&quot;&gt;angiosarcoma&lt;/a&gt;. It’s a really rare cancer of the blood vessels. A city the size of Pittsburgh sees two cases every ten years, roughly. It’s certainly terminal, while he had some chemotherapy a few days ago, we won’t know if it’s helped at all for another week or so, and if it works, it’ll give him another few weeks to months at best. It came on really fast: he felt some shortness of breath the first week of February, went into the hospital in week three, by week four he almost died from a blood vessel bursting due to weakness from the disease.&lt;/p&gt;
&lt;p&gt;Anyway, you all have sent me tons of well-wishes and such over the last week, and it’s truly appreciated. It’s nice to know that I have support, as I try to support my family. I’m the oldest son, so that carries a lot of responsibilities, and you guys have helped me a lot.&lt;/p&gt;
&lt;p&gt;However, if I can ask you for one more thing…&lt;/p&gt;
&lt;p&gt;My dad turns 54 on Sunday. My aunt told my mom that for his birthday, she’s going to email everyone she knows, ask them to send him a birthday card, and she’s hoping to get 100. I think that’s a pretty awesome idea, but I also happen to know that while I’ve mentioned to my dad that ‘people on the internet I know send well-wishes,’ I think it’d be super awesome to blow my aunt out of the water and give my dad a zillion cards for his last birthday.&lt;/p&gt;
&lt;p&gt;So yeah, if you have a few minutes this week, and you’re thinking of my father, send a birthday card to my house. Here’s the address:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;note&lt;/em&gt;: Five years later, I’ve removed the address. I haven’t lived there in years, please don’t see this now and send mail to some random person kthx.&lt;/p&gt;
&lt;p&gt;Oh yeah: My dad is also Steve. I’m not a junior because he has no middle name: his mother said they were too poor to give him one.&lt;/p&gt;
&lt;p&gt;Additionally, I mean April 1. That’s his birthday. However, if you live far away and it’ll be a bit late, that’s perfectly fine, still send one. I think that ‘oh, this card came from so far away that it took some time’ is pretty awesome in its own way.&lt;/p&gt;
&lt;p&gt;I really think this would be an awesome last gift to my dad. One of the worst things about being in the hospital is that you feel cut off from everything outside of that room, and while I’ve spent almost every minute of the last 8 days in there with him, keeping your spirits up helps the healing process quite a bit.&lt;/p&gt;
&lt;p&gt;Thanks. &amp;#x3C;3 &amp;#x3C;3 &amp;#x3C;3&lt;/p&gt;</content:encoded></item><item><title>Two pomodoros</title><link>https://steveklabnik.com/writing/two-pomodoros/</link><guid isPermaLink="true">https://steveklabnik.com/writing/two-pomodoros/</guid><description>I’d been thinking about doing this for a while, and yesterday, actually got around to it. The basic idea is this: record me during normal development, and then post it to the internet. Here’s the video: Hacking on RubyGems from Steve Klabnik on Vimeo . Why this is interesting Why…</description><pubDate>Wed, 22 Feb 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’d been thinking about doing this for a while, and yesterday, actually got around to it. The basic idea is this: record me during normal development, and then post it to the internet.&lt;/p&gt;
&lt;p&gt;Here’s the video:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://vimeo.com/37201618&quot;&gt;Hacking on RubyGems&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/steveklabnik&quot;&gt;Steve Klabnik&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com/&quot;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;why-this-is-interesting&quot;&gt;Why this is interesting&lt;/h2&gt;
&lt;p&gt;Why is this interesting at all? Well, there are a few things:&lt;/p&gt;
&lt;h3 id=&quot;exposing-myself-is-hard&quot;&gt;Exposing myself is hard&lt;/h3&gt;
&lt;p&gt;It’s really difficult to put myself out there in this way. I thought about it two or three times, then recorded myself and threw it away two or three times, then finally published this version.&lt;/p&gt;
&lt;p&gt;It’s primarily difficult because I’m nowhere near perfect. For example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;@steveklabnik I mean I love vim, you were just using it cringe-inducingly&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— Dannel Jurado (@DeMarko) February 22, 2012&lt;/p&gt;
&lt;p&gt;There are lots of things that I can improve upon in my workflow, and vim is &lt;strong&gt;certainly&lt;/strong&gt; one of them. So showing everyone that I suck at vim is rough, but it also lead to several improvements. Some people gave me a few good .vimrc suggestions, and some shortcuts I should focus on. So it’s positive, for sure, but that doesn’t make it difficult.&lt;/p&gt;
&lt;h3 id=&quot;destroying-celebrity&quot;&gt;Destroying celebrity&lt;/h3&gt;
&lt;p&gt;I am incredibly uncomfortable with referring to myself as anything more than an above-average developer. Maybe expert, sure. The thing to remember about your programming heroes is that they’re just people, too. They aren’t demi-gods. They don’t have a super-secret sauce that you don’t have access to.&lt;/p&gt;
&lt;p&gt;So by putting out a video that shows my flaws, those who think I’m super awesome will maybe think of me as just like them, rather than someone particularly special.&lt;/p&gt;
&lt;h3 id=&quot;this-is-the-real-world&quot;&gt;This is the Real World&lt;/h3&gt;
&lt;p&gt;Too often things like blog posts present a fake, clean-room environment to demonstrate their ideas. “See, testing is absolutely easy, let me go through this example that I’ve specially crafted to demonstrate how easy it is!”&lt;/p&gt;
&lt;p&gt;This isn’t the case with this video. It’s the real deal. Watch towards the end as I stupidly don’t realize that the test code I replaced was different than what I replaced it with. Heh.&lt;/p&gt;
&lt;h3 id=&quot;everything-becomes-conscious&quot;&gt;Everything becomes conscious&lt;/h3&gt;
&lt;p&gt;Knowing you’re being watched has a crazy effect on you. I accidentally checked Twitter once during a test run, and immediately went “ZOMG POMODOROS PEOPLE ARE WATCHING ASSHOLE YOU SCREWED UP!!!!1” Whenever I mis-typed something in vim, “OMG YOU DON’T KNOW THAT SHORTCUT? EVERYONE ON THE INTERNET THINKS YOU’RE STUPID!”&lt;/p&gt;
&lt;p&gt;As long as I can keep this effect real, I’ll be hyper-aware of where my flaws are. That’s kinda neat in and of itself.&lt;/p&gt;
&lt;h2 id=&quot;what-do-you-think&quot;&gt;What do you think?&lt;/h2&gt;
&lt;p&gt;Is this interesting? Should I keep doing this from time to time? What about an actual real LiveStream, not just recordings later?&lt;/p&gt;</content:encoded></item><item><title>Burnout</title><link>https://steveklabnik.com/writing/burnout/</link><guid isPermaLink="true">https://steveklabnik.com/writing/burnout/</guid><description>I have a confession to make: Other than one little stint at RubyC, I haven’t really written code in almost a month. And I haven’t really written a ‘real’ blog post in almost six weeks. It happens. I was hitting it really hard there for a while, and the combination of stresses…</description><pubDate>Thu, 17 Nov 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have a confession to make: Other than one little stint at RubyC, I haven’t really written code in almost a month. And I haven’t really written a ‘real’ blog post in almost six weeks.&lt;/p&gt;
&lt;p&gt;It happens. I was hitting it really hard there for a while, and the combination of stresses from travel, speaking, writing, conference parties, and everything else was really getting to me. I don’t think that I was burned out &lt;em&gt;yet&lt;/em&gt;, but I decided to explicitly take the last two weeks off from doing almost anything to prevent myself from getting to that point.&lt;/p&gt;
&lt;p&gt;This doesn’t mean that I’m going to &lt;em&gt;stop&lt;/em&gt; doing any of these things. I’d be lying if I tried to say that I’d be reintroducing long-term balance into my life. That balance never really existed. I’ve always been one to throw myself at things 100%. Balance is something I don’t do particularly well.&lt;/p&gt;
&lt;p&gt;One thing I am going to be working on, though, is this: Hackety and Shoes stress me out. Like a lot. This causes me to avoid working on them, which makes them not improve so quickly, which makes me stress about it worse. I’m not really sure how to fix that one… but at some point, I’m going to have to confront that.&lt;/p&gt;
&lt;p&gt;Anyway, hopefully I’ll be back at it soon. Those of you waiting on some of my projects, my bad. Things will still be slow for a bit. I’m going to D.C. this weekend to teach kids with Hackety and Lego Mindstorms, so maybe that’ll get me out of this funk. Or maybe it’ll delay it another couple of days.&lt;/p&gt;
&lt;p&gt;But I’ll be around again soon.&lt;/p&gt;</content:encoded></item><item><title>For science: I&apos;m killing my cell phone</title><link>https://steveklabnik.com/writing/for-science-im-killing-my-cell-phone/</link><guid isPermaLink="true">https://steveklabnik.com/writing/for-science-im-killing-my-cell-phone/</guid><description>Yep. Doin’ it. This morning I swung by the Sprint store and picked up a 4G hotspot. Gonna transfer my number to Google Voice this evening. lolwhut? Yep. I’m terribly addicted to my phone right now. This is fine, but I’m always interested in improving myself. I have a few friends…</description><pubDate>Wed, 19 Oct 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Yep. Doin’ it. This morning I swung by the Sprint store and picked up a 4G hotspot. Gonna transfer my number to Google Voice this evening.&lt;/p&gt;
&lt;h2 id=&quot;lolwhut&quot;&gt;lolwhut?&lt;/h2&gt;
&lt;p&gt;Yep. I’m terribly addicted to my phone right now. This is fine, but I’m always interested in improving myself. I have a few friends who’ve done similar things, and really enjoyed it. So I’m giving it a solid 6 months. Sometimes, experiments work, and sometimes they don’t. I’m doing this for fun more than anything, and so it might not work out. Google Maps is damn handy.&lt;/p&gt;
&lt;h2 id=&quot;so-i-cant-call-you&quot;&gt;So I can’t call you?&lt;/h2&gt;
&lt;p&gt;Naw, it just means there might be a tad more latency. I’m on my computer all the effing time anyway, so I doubt that you’ll really notice. If someone calls when I’m not at my computer, Google will just take a recording and email me the transcript. No biggie.&lt;/p&gt;
&lt;h2 id=&quot;yeah-well-have-fun-with-that&quot;&gt;Yeah, well, have fun with that!&lt;/h2&gt;
&lt;p&gt;I will. And I’ll keep you all posted on how it goes. I plan to do a retrospective monthly.&lt;/p&gt;
&lt;p&gt;EDIT: I had to change my number because Google Voice wouldn’t transfer my old one. So get a hold of me some other way, and I’ll give you the new one.&lt;/p&gt;</content:encoded></item><item><title>I&apos;m deleting my Facebook tonight</title><link>https://steveklabnik.com/writing/im-deleting-my-facebook-tonight/</link><guid isPermaLink="true">https://steveklabnik.com/writing/im-deleting-my-facebook-tonight/</guid><description>Well, it’s the end of the web as we know it . I’d already been thinking about this all weekend, and last night, I decided. I just can’t deal with Facebook’s crazy privacy stuff anymore. I mean, I already basically forked Twitter over their ToS, and Facebook has been a lot more…</description><pubDate>Mon, 26 Sep 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Well, &lt;a href=&quot;http://adrianshort.co.uk/2011/09/25/its-the-end-of-the-web-as-we-know-it/&quot;&gt;it’s the end of the web as we know it&lt;/a&gt;. I’d already been thinking about this all weekend, and last night, I decided. I just can’t deal with Facebook’s crazy privacy stuff anymore. I mean, I already basically &lt;a href=&quot;http://rstat.us/&quot;&gt;forked Twitter&lt;/a&gt; over their ToS, and Facebook has been a lot more evil for a lot longer. Frictionless sharing is pretty much the last straw.&lt;/p&gt;
&lt;p&gt;I’ll be using this as an excuse to keep helping out with the federated web. There’s a lot of cool stuff in this area, but it needs help. If you’re a developer, consider helping out with the &lt;a href=&quot;https://github.com/LockerProject/Locker&quot;&gt;Locker Project&lt;/a&gt; or &lt;a href=&quot;https://github.com/homesteading&quot;&gt;the Homesteading Project&lt;/a&gt;. The only way that we can prevent people from becoming digial sharecroppers is by helping them to ‘own their own land.’&lt;/p&gt;
&lt;p&gt;If we’re Facebook friends, you can always find out how to reach me at &lt;a href=&quot;http://steveklabnik.com/&quot;&gt;http://steveklabnik.com&lt;/a&gt;. Please be careful, and consider if Facebook’s privacy settings are really worth it to you. They may be, and they may not. I’m under no illusions that the vast majority of people will give up Facebook, but I figured I’d warn you anyways.&lt;/p&gt;</content:encoded></item><item><title>The self improvement pomodoro</title><link>https://steveklabnik.com/writing/the-self-improvement-pomodoro/</link><guid isPermaLink="true">https://steveklabnik.com/writing/the-self-improvement-pomodoro/</guid><description>By now, the pomodoro technique is pretty well-known amongst programmers. I forget where I heard of it first, but if you haven’t, here it is: Break your day up into 30 minute chunks. Work for 25 minutes, break for 5. Repeat. It’s easy to stay concentrated when you know a break is…</description><pubDate>Sun, 04 Sep 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;By now, the &lt;a href=&quot;http://www.pomodorotechnique.com/&quot;&gt;pomodoro technique&lt;/a&gt; is pretty well-known amongst programmers. I forget where I heard of it first, but if you haven’t, here it is: Break your day up into 30 minute chunks. Work for 25 minutes, break for 5. Repeat. It’s easy to stay concentrated when you know a break is coming up soon, the fact that you can fit two in an hour fits with my natural sense of order in the world, and once you get in the rhythm, you Get Shit Done. Heck, I liked the idea so much that I &lt;a href=&quot;http://rubygems.org/gems/pomodoro&quot;&gt;made a Ruby gem&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That said, I hadn’t been following the technique for a while, because it’s easy to lose discipline. Happens to the best of us. Recently, though, it’s crept back into my workflow, largely thanks to Jeff Casimir. I was even lazy enough to not use my gem, and try something else. So I grabbed the software he uses from the App Store, and fired it up. It presented me with an interesting option to give my pomodoro a name before starting it. Pretty much without thinking, I typed ‘rstat.us rails3 port,’ since that’s what I was working on, and away I went.&lt;/p&gt;
&lt;p&gt;The more I think about it, however, the more interesting the naming aspect becomes. I can see how long and how often I’m working on various things, and over the past few weeks, it’s been neat to examine. When doing some reading this morning, my groggy brain combined a few different things together:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Programmers often don’t have the time to practice their craft&lt;/li&gt;
&lt;li&gt;I work on a lot of random software projects&lt;/li&gt;
&lt;li&gt;These projects are often of varying quality, especially regarding things like documentation and tests&lt;/li&gt;
&lt;li&gt;Almost none of the gems that have been released are at a 1.0 release (can anyone find this blog post for me? I can’t. It’s something about “Just Release It”…)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, with an aim of combining all these things, I’m going to give something a try, and you should too: I’m going to name at least one pomodoro a day “self-improvement,” and use that time to go back over my random projects on GitHub and clean them up. I’m going to use that time to start programming in a totally new language. I’m going to use that time to do that refactoring I’ve been avoiding. I’m going to use that time to read a book.&lt;/p&gt;
&lt;p&gt;Basically, I’m going to force myself to invest in myself. Make sure to find time to invest in you, too.&lt;/p&gt;</content:encoded></item><item><title>The next iteration of my blog</title><link>https://steveklabnik.com/writing/the-next-iteration-of-my-blog/</link><guid isPermaLink="true">https://steveklabnik.com/writing/the-next-iteration-of-my-blog/</guid><description>Well well well, some things never change. Long ago, I hosted my own blog, and here we are again. I’ve moved everything over to Jekyll, if that means anything to you. You can now look at my blog on GitHub . Big thanks to this article for lots of help and pointers with final…</description><pubDate>Thu, 12 May 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Well well well, some things never change. Long ago, I hosted my own blog, and here we are again. I’ve moved everything over to Jekyll, if that means anything to you. You can now &lt;a href=&quot;https://github.com/steveklabnik/blog&quot;&gt;look at my blog on GitHub&lt;/a&gt;. Big thanks to &lt;a href=&quot;http://www.jstorimer.com/2009/12/29/jekyll-on-heroku.html&quot;&gt;this article&lt;/a&gt; for lots of help and pointers with final deployment stuff, and &lt;a href=&quot;http://mikeferrier.ca/2011/04/29/blogging-with-jekyll-haml-sass-and-jammit/&quot;&gt;this one&lt;/a&gt; for haml and sass and stuff. Yay!&lt;/p&gt;
&lt;h2 id=&quot;new-ish-beginnings&quot;&gt;New-ish beginnings&lt;/h2&gt;
&lt;p&gt;So why’d I do this? Well, this is just part of moving more towards hosting all of my own services, and not relying on services that others provide. This isn’t some sort of argument over individualism vs. collectivism, it’s more about &lt;a href=&quot;http://nomoresharecropping.org/&quot;&gt;No More Sharecropping&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I’m still relying on people for hosting, of course. Nobody is 100% removed, but with my own backup of everything, I’m in total control here. It’s really minimal work to keep this going, and only a few hours of setup to move everything over.&lt;/p&gt;
&lt;h2 id=&quot;a-small-change-in-focus-too&quot;&gt;A small change in focus, too&lt;/h2&gt;
&lt;p&gt;I’m also going to stop bitching about politics so often, and try to be more constructive in general. I have a lot to say about this new humanities angle that my life has taken as of late. Hence, I’ve changed the title of my blog. And you can expect more posts along those lines. More about books, more about art and code, less whining. One may think I’m maturing or something…&lt;/p&gt;</content:encoded></item><item><title>I&apos;m quitting Hacker News</title><link>https://steveklabnik.com/writing/i-m-quitting-hacker-news/</link><guid isPermaLink="true">https://steveklabnik.com/writing/i-m-quitting-hacker-news/</guid><description>I’ve been thinking about this post for a while. I freaking love Hacker News. It’s my favorite place on the Internet. It’s incredibly valuable. I have learned so much from my time there. With that said, I feel like it’s taken up too much of my time. I’m trying to accomplish…</description><pubDate>Thu, 03 Mar 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been thinking about this post for a while.&lt;/p&gt;
&lt;p&gt;I freaking love Hacker News. It’s my favorite place on the Internet. It’s incredibly valuable. I have learned so much from my time there. With that said, I feel like it’s taken up too much of my time.&lt;/p&gt;
&lt;p&gt;I’m trying to accomplish things. I got accepted to grad school. I’m trying to rebuild Shoes. I’m working on improving Hackety. I’m finding that I don’t have enough hours in the day to accomplish the things I want to accomplish. And arguing for the hundredth time about how artists will survive in a post-IP world, or how to get your first couple of users, or whatever it is that Google or Apple did this week hasn’t gotten boring yet, and that’s a problem.&lt;/p&gt;
&lt;p&gt;The only respectable solution is to go cold-turkey for a while.&lt;/p&gt;
&lt;p&gt;I’ve been doing good on some of my new years’ resolutions, and bad on others. I haven’t spent a lot of time writing lately, and I have only been doing okay at my writing. Hacker News is cutting into that. I feel like I’m using it in the same way some use TV. Yeah, it’s significantly deeper, but I really should be reading more books and less HN. At least, that’s what’s right for me right now.&lt;/p&gt;
&lt;p&gt;I won’t be gone forever. I just need to spend more time elsewhere.&lt;/p&gt;
&lt;p&gt;With that said, I’ve been spending a &lt;em&gt;lot&lt;/em&gt; of time on Shoes. I’ll just leave this here: &lt;a href=&quot;https://github.com/shoes/shoes/tree/feature/gemify&quot;&gt;https://github.com/shoes/shoes/tree/feature/gemify&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Goals for 2011</title><link>https://steveklabnik.com/writing/goals-for-2011/</link><guid isPermaLink="true">https://steveklabnik.com/writing/goals-for-2011/</guid><description>This year I’m happy to report that I have much more upbeat plans than last year’s kind of sad post. With that said, here’s my 2011 goals: I want to work for other people 2 days per week on average for the year. I want to write something every day I want to keep building on the…</description><pubDate>Sun, 02 Jan 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This year I’m happy to report that I have much more upbeat plans than last year’s kind of sad post. With that said, here’s my 2011 goals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I want to work for other people 2 days per week on average for the year.&lt;/li&gt;
&lt;li&gt;I want to write something every day&lt;/li&gt;
&lt;li&gt;I want to keep building on the initial success that Hackety Hack’s 1.0 launch has brought. I’d like to get a new release out every month or so, with a 2.0 for Christmas 2011.&lt;/li&gt;
&lt;li&gt;I want to start exercising again. My current lifestyle is still too sedentary for my liking.&lt;/li&gt;
&lt;li&gt;I want to eat better.&lt;/li&gt;
&lt;li&gt;I want to start logging my activities every day.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most of these are kinda standard. I used to go to the gym all the time, but I’ve never eaten healthily. Both of these things are going to become more important as I age, however, and so I’m starting to actually give them serious consideration.&lt;/p&gt;
&lt;p&gt;Hackety Hack had an impressive 1.0 launch, but I have lots of work to do. Please check out the &lt;a href=&quot;http://blog.hackety-hack.com/&quot;&gt;Hackety Hack blog&lt;/a&gt; tomorrow for a report on that. Basically, I now have a sizable userbase to attend to, and they’ve found a bunch of bugs that I need to iron out before starting to build more stuff.&lt;/p&gt;
&lt;p&gt;The logging is an idea that I got from &lt;a href=&quot;http://www.sebastianmarshall.com/&quot;&gt;Sebastian Marshall&lt;/a&gt;. We’ve had some good conversation recently, and we talked briefly about the importance of measuring things. You can only improve things if you know what’s actually wrong… I’m going to be tracking the time that I do various activities, and seeing if I can improve. If I feel this is working, I’ll write about it in a month or so.&lt;/p&gt;
&lt;p&gt;I’ve already made some progress on all of these, actually. Obviously, most of them can only truly be realized in a year’s time, but here’s what I’ve got going:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I’ve got my logging set up going. I’m trying to figure out how to make it as unobtrusive as possible, but I think I have a good first run at it.&lt;/li&gt;
&lt;li&gt;I’ve got a set up for the work situation, and if all goes well, that should be accomplished. I originally thought I’d have to front-load a bit, but it seems like I’ll be doing this most of the year.&lt;/li&gt;
&lt;li&gt;Working that little will enable me to really accomplish my Hackety goals.&lt;/li&gt;
&lt;li&gt;Now that Maria is graduated, she’s got some time to cook things, and she’s also interested in eating better, and her habits are better than mine already. Hopefully this will lead to success.&lt;/li&gt;
&lt;li&gt;Logging should help keep my eyes on the prize for my exercise and writing goals.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, that’s it! Good luck with your goals in the new year!&lt;/p&gt;</content:encoded></item><item><title>The hardest decision I&apos;ve ever made</title><link>https://steveklabnik.com/writing/the-hardest-decision-i-ve-ever-made/</link><guid isPermaLink="true">https://steveklabnik.com/writing/the-hardest-decision-i-ve-ever-made/</guid><description>I’ll cut to the chase: I’ve stepped down as CTO of CloudFab. I don’t want to discuss details, but life is too short to not be doing what you want with it. And, after a period of careful thought and consideration, it’s no longer the right thing for me. It was an amicable parting,…</description><pubDate>Wed, 17 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ll cut to the chase: I’ve stepped down as CTO of CloudFab. I don’t want to discuss details, but life is too short to not be doing what you want with it. And, after a period of careful thought and consideration, it’s no longer the right thing for me. It was an amicable parting, and my replacements are already in place, and doing cool things. I’m happy with what I’ve accomplished, but it’s time for me to move on.&lt;/p&gt;
&lt;p&gt;This raises the question: what am I moving on to? Here’s the answer: Hackety Hack. What I truly care about is teaching, writing, and discussing software. If I could do anything, I’d hack on Hackety, share what I know with others, and keep learning and playing with new things all day long.&lt;/p&gt;
&lt;p&gt;However, there’s a certain question of sustainability here: I’m not made of money, and I have lots of bills to pay. However, doing the ‘obvious’ thing would be really, truly wrong: Hackety Hack is not and will never be a startup. It’s a social venture, if anything: it would be absolutely unquestioningly wrong for me to ever ask anyone for a single cent for it. It’d also be counterproductive: how could I share programming with everyone if I excluded those without disposable income?&lt;/p&gt;
&lt;p&gt;So to this end, Hackety cannot be all that I do. And while I really want to teach, I also have a lot to learn. Luckily, I have some great allies in this area: I’ve been working alongside two teachers at the University of Pittsburgh over the past month or so: one in the English department, and one in the Computer Science department. In doing so, I’ve come to realize that my place in life is actually in the middle: while I love the theoretical side of CS, I’m actually much more interested in the application. And teachers need to be effective communicators, so investing in writing is absolutely worthwhile for me. At the same time, I’ve really enjoyed every chance I’ve had to write: there’s a reason I keep three blogs now! I’m also incredibly interested in the parallels that exist between computer and human languages. I like the comparison between refactoring and composition. I think the two fields have a lot to learn from one another. It’s something I’d like to explore more.&lt;/p&gt;
&lt;p&gt;To do so, I’ll have to finish off my undergrad degree. Luckily, I’m very close, so I’ll be doing that in the spring. Afterward, it’s my intention to go to grad school in the English department, so I’m furiously working on my application, with the help of the aforementioned teacher. At the same time, I’ll possibly help teach or TA classes in the CS department as well. I’m hoping to combine my solid foundations in the hard sciences with the new perspective and improved analysis that the humanities can offer.&lt;/p&gt;
&lt;p&gt;I don’t think that academia is where I want to stay forever, but I think it’s a good place for me to grow for now. It’s time for me to invest in myself a little. I think I’ll end up a much better person in the end.&lt;/p&gt;</content:encoded></item><item><title>A blip in time</title><link>https://steveklabnik.com/writing/a-blip-in-time/</link><guid isPermaLink="true">https://steveklabnik.com/writing/a-blip-in-time/</guid><description>Sometimes, insight comes from very unlikely places. I’m keenly interested in the music industry, and how it will evolve, or possibly die. I care deeply about music; it’s had a profound effect on my life over the years. Even though the entire industry has been screaming that…</description><pubDate>Sat, 24 Jul 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sometimes, insight comes from very unlikely places.&lt;/p&gt;
&lt;p&gt;I’m keenly interested in the music industry, and how it will evolve, or possibly die. I care deeply about music; it’s had a profound effect on my life over the years. Even though the entire industry has been screaming that they’re dying, I truly believe that music will never die. It’s bigger than money. I’m not exactly sure about the details, even though I have some ideas.&lt;/p&gt;
&lt;p&gt;In any case, I was reading about this the other day, and I came across &lt;a href=&quot;http://sometimesright.com/2010/05/sir-mick-on-music-profits/&quot;&gt;this quote from Mick Jaggar&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But I have a take on that – people only made money out of records for a very, very small time. When The Rolling Stones started out, we didn’t make any money out of records because record companies wouldn’t pay you! They didn’t pay anyone!Then, there was a small period from 1970 to 1997, where people did get paid, and they got paid very handsomely and everyone made money. But now that period has gone.So if you look at the history of recorded music from 1900 to now, there was a 25 year period where artists did very well, but the rest of the time they didn’t.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;An interesting bit of history, and an interesting perspective from someone who has some skin in the game, to say the least. But it’s the last sentence of that blog post that gives the true insight:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don’t stop at 1900, though. If you think of the entire history of the world, the notion that you could make an outsized return on making music is a complete aberration.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When I first read this sentence, something clicked inside my head, and I had a realization: does this apply to everything?&lt;/p&gt;
&lt;p&gt;We always think that we’re moving forward. It’s called ‘progress’ for a reason. But it’s kind of obvious why we’d think this: we’re the ones living it! Of course we’d do know wrong!&lt;/p&gt;
&lt;p&gt;But what if we are?&lt;/p&gt;
&lt;p&gt;What if we’re not progressing, but regressing? What if the latest and greatest isn’t where things are going… it’s just a small blip in the graph?&lt;/p&gt;
&lt;p&gt;Maybe we’re actually going down the wrong path, building towards deflation, and need to turn around and revise our position. Maybe we’ve misstepped. What if we’re doing what we think is right, but it’s actually wrong? What if we’re just on the upswing of some local minima?&lt;/p&gt;
&lt;p&gt;I don’t necessarily mean that, for example, the music industry will cause the total collapse of everything. But maybe it was a temporary peak. Things will return back to some even level again, and over the grand sum of history, such a small deviation will be forgotten.&lt;/p&gt;
&lt;p&gt;Then I start to apply this line of reasoning to everything. How can we really know if we’re doing better than yesterday?&lt;/p&gt;</content:encoded></item><item><title>A break with the past</title><link>https://steveklabnik.com/writing/a-break-with-the-past/</link><guid isPermaLink="true">https://steveklabnik.com/writing/a-break-with-the-past/</guid><description>Pretty soon , Twitter is going to turn off Basic Authentication and switch entirely to OAuth. People are upset . It’s natural. If apps aren’t updated, they’ll stop working, entirely. This could be bad. But in the long run, it won’t be. In any sort of long-term endeavor, things…</description><pubDate>Tue, 27 Apr 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.countdowntooauth.com/&quot;&gt;Pretty soon&lt;/a&gt;, Twitter is going to turn off Basic Authentication and switch entirely to OAuth. &lt;a href=&quot;http://www.scripting.com/stories/2010/04/26/theToxicCoralReef.html&quot;&gt;People are upset&lt;/a&gt;. It’s natural. If apps aren’t updated, they’ll stop working, entirely. This could be bad.&lt;/p&gt;
&lt;p&gt;But in the long run, it won’t be.&lt;/p&gt;
&lt;p&gt;In any sort of long-term endeavor, things can go sour, due to accumulating cruft over time. You see this in married couples that argue every day, you see this in old-guard companies that have six layers of management, you see this in software of all kinds. You don’t want to break old stuff, so you support it. Rocking the boat may cause some problems. It could bring up old wounds. You might have to ask someone to improve. Things won’t ever be the same, and you’re gambling with the outcome, hoping that in the end, everything will be better.&lt;/p&gt;
&lt;p&gt;Sometimes, this gamble pays off big.&lt;/p&gt;
&lt;p&gt;Apple’s managed to do this three times in its history, in a huge way. They’ve reinvented themselves a few times, but there were three huge, backward- compatibility breaking changes that could have killed the company. The first was the transition from the 68k architecture to the PowerPC architecture, the eventual change from PowerPC to x86, and the transition from OS9 to OSX.&lt;/p&gt;
&lt;p&gt;Apple managed to make all of these transitions successfully, and it’s been one of the greatest benefits to the company. A huge part of why Windows is so horrible is that it goes above and beyond the call of duty with backwards compatibility; Microsoft never wants to rock the boat. When they try to, they get punished. Look at how poorly the transition to Vista went. So what made it go so right for Apple, and so wrong for Microsoft?&lt;/p&gt;
&lt;p&gt;The first thing that Apple did right with all of these transitions was being open about them. People were given ample time to move over to the new platform. I was young when the 68k change happened, so my remembering of that time might be fuzzy, but the OSX announcement certainly was made with ample time. An entire year elapsed between the public beta and the release of 10.1, which was widely considered the first version of OSX that was worth using. I remember buying a copy of 10.0, and Apple gave you an upgrade to 10.1 for $30, similar to the Snow Leopard upgrade. 10.0 was just too buggy to be considered a proper replacement. Anyway, that was a year, and that’s not counting the time between the announcement and the beta release. For the transition to Intel, the initial announcement was made in 2005, and Steve Jobs said the transition would happen over the next two years. That gave everyone plenty of time to get their ducks in a row.&lt;/p&gt;
&lt;p&gt;The second thing that Apple did correctly was provide ample tools for dealing with the transition. For the first switch, they provided a 68k emulator, and kept it going all the way up until the Intel transition. This meant that people didn’t have to re-write their apps from scratch, and gave them a big window for re-writing apps. Rosetta fulfills the same role for the PowerPC/Intel change. And during the OS9/OSX changeover, Apple not only let you emulate OS9, but also created the Carbon framework to bridge the gap between System 9 and Cocoa.&lt;/p&gt;
&lt;p&gt;Finally, Apple made these changes boldly, and didn’t back down. With any kind of massive change like this, unless someone forces the change through, people will stay with the old system, and the transition fails. You can see this happen with both the Python move to Python 3000, the move from Ruby 1.8 to 1.9, and the move from XP to Vista. There’s a fine line between giving people leeway to make the transition and actually forcing them to do it. Apple did a poor job with this when it came to Adobe, who’s being an incredible laggard with Photoshop. It’s a massive application, sure, but Apple announced Carbon’s end of life ages ago, they really should have gotten their shit together. Generally, Apple’s not afraid to end-of-life products after the transition time is over, though.&lt;/p&gt;
&lt;p&gt;In any case, those seem to be the three things that make a transitional period work: transparency, tools, and finality. If Twitter wants to survive the Oauthcalypse (as if they won’t), they need to follow the same path. And they have been. They announced the move to Oauth over a year ago (I think), they’ve had libraries and examples out there for ages, and they’ve picked a date and they’re sticking to it.&lt;/p&gt;
&lt;p&gt;I’m glad they’re doing it. OAuth is an important part of Twitter’s future, and it’s good that they’re embracing it fully.&lt;/p&gt;</content:encoded></item><item><title>Why bother creating?</title><link>https://steveklabnik.com/writing/why-bother-creating/</link><guid isPermaLink="true">https://steveklabnik.com/writing/why-bother-creating/</guid><description>Kanye West posted something interesting about the nature of creativity today. I’m going to make a copy of it here, because I find the presentation also interesting. Here’s his post , for reference. I’m not the biggest Kanye fan. I go back and forth. But I think that this is an…</description><pubDate>Wed, 03 Mar 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kanye West posted something interesting about the nature of creativity today. I’m going to make a copy of it here, because I find the presentation also interesting. Here’s &lt;a href=&quot;http://www.kanyewest.com/2010/03/02/creativity&quot;&gt;his post&lt;/a&gt;, for reference.&lt;/p&gt;
&lt;p&gt;I’m not the biggest Kanye fan. I go back and forth. But I think that this is an interesting, personal look into the creative process of someone whose work is at least widely known and recognized.&lt;/p&gt;
&lt;p&gt;Goood quotes from unlikely sources&lt;/p&gt;
&lt;p&gt;I agree with charlesju on &lt;a href=&quot;http://news.ycombinator.com/item?id=1163873&quot;&gt;Hacker News&lt;/a&gt;, I think this line is my favorite:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I never feel like I’m not the underdog. I never felt completely comfortable. I’m tormented by the need to create.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’ve basically felt that same itch for large parts of my life. Sometimes, I haven’t paid it much attention, but that need has been the source of some of the more interesting things I’ve done. I talked a little bit about this in my post last week about &lt;a href=&quot;http://blog.steveklabnik.com/appreciating-the-gift-of-creation&quot;&gt;the gift of creation&lt;/a&gt;. That post was more about recognizing the surface signs of the creative itch than examining the underlying motivations that drive the creative process.&lt;/p&gt;
&lt;p&gt;“Why” is the harder question, of course. It’s something I’ve been thinking a lot about lately. One of the fundamental tenets of capitalism is the incentivisation of behaviors. Some jobs are paid more simply because we want to encourage people to do them. Garbage collectors, for instance, get paid pretty well for the relative level of difficulty their duties entail. Even though it’s an unskilled job, nobody wants to do it, so they make well over minimum wage. Some of the socialist literature I’ve been examining lately basically posits that monetary incentives aren’t the only kind of incentives, and that even if the monetary incentives no longer existed, people would still do “undesirable” things. I’m not sure that I buy it on a wide scale, but when I look at myself, this is absolutely true. Even when I didn’t pay my rent via code, I still coded. I wasn’t as fulfilled as a person, but I managed to exist, and still create. That’s what caused that thought to tumble around in my brain for the last month or two… why bother creating?&lt;/p&gt;
&lt;p&gt;Haters gonna hate&lt;/p&gt;
&lt;p&gt;It’s really amazing that people still continue to create at all, when there’s so much criticism out there. &lt;a href=&quot;http://al3x.net/2010/03/02/hiatus.html&quot;&gt;Al3x&lt;/a&gt;, a Twitter engineer, is shutting down his blog. For now. Part of his reason is related; he’s writing for himself, and he feels the responses of others take away more than they contribute:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lately, I’ve found the cathartic returns from blog-format writing to be diminishing. The ideas I’m trying to express never really get put to rest in my head when I write, now. Instead, they spark whole conversations that I never intended to start in the first place, conversations that leech precious time and energy while contributing precious little back. Negative responses I can slough off, but the sense that I’m not really crystalizing my unset thoughts by writing here is what bothers me.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I sort of felt the same way when my blog got linked to by Reddit a few weeks back; there was a lot of bullshit. And it’s frustrating. My initial motivations are similar to Al3x’s; I find that writing helps me to fill out my thoughts. I’ve been trying to make writing a habit, and it’s been hard to find both the time and topics that are fleshed out enough for me to finish them off by writing about them. But pushing myself is part of the challenge, and I expect to get better at it as time goes on. Hopefully, this means that in the future, I’ll be able to synthesize more fully thought-through opinions at a faster rate than before. I’ll also have examined my own thoughts, opinions, and convictions more closely, and made sure that they’re in line with what I truly believe is right. What I’m trying to get at is this: creation is always incredibly personal. An author puts some of himself into every work that he makes. So criticism against a work is extremely easy to consider as an attack against the author itself. So it’s difficult to create and put stuff out there, only to get it criticized by everyone is frustrating.&lt;/p&gt;
&lt;p&gt;And the verdict is…&lt;/p&gt;
&lt;p&gt;… I’m still not sure. This is a topic I’ll continue to write about, as my feelings become more clear. There has to be something more fundamental involved here. I haven’t found it yet, I just know that I can’t sit around and watch TV. I can’t work a ‘normal’ job and toil away on some reporting system that helps just a few people do their jobs a little bit better. I’ve gotta do something more important than that, change the world, keep pushing.&lt;/p&gt;
&lt;p&gt;And I’ll keep telling you about it. So that I can figure it out for myself.&lt;/p&gt;</content:encoded></item></channel></rss>