<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0"
    xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>.:. brainsik</title>
    <link>https://brainsik.net/</link>
    <description>Recent content on .:. brainsik</description>
    <generator>Hugo 0.160.1</generator>
    <language>en-us</language>
    <copyright>© 2024 Jeremy Avnet</copyright>
    <lastBuildDate>Tue, 25 Nov 2025 11:04:10 -0800</lastBuildDate>
    <atom:link href="https://brainsik.net/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Using a local LLM to convert grep output to Caddy config</title>
      <link>https://brainsik.net/2025/local-llm-convert-grep-to-caddy-config/</link>
      <pubDate>Tue, 25 Nov 2025 11:04:10 -0800</pubDate>
      <guid>https://brainsik.net/2025/local-llm-convert-grep-to-caddy-config/</guid>
      <description>&lt;p&gt;Today I ran into a great use case for a local LLM: converting grep output into config code.&lt;/p&gt;&#xA;&lt;p&gt;While looking at some metrics for the various websites I run, I noticed this blog (brainsik.net) was suddenly sending 404s for very old URLs used when I was briefly hosted on Tumblr. Those URLs had a format like &amp;ldquo;/post/[long-number]/title-of-the-post&amp;rdquo;. IIRC, the long number was the actual identifier and it didn&amp;rsquo;t matter what text came after. Why these suddenly were being hit after a decade plus, I do not know.&lt;/p&gt;&#xA;&lt;p&gt;When I migrated from Tumblr to my own static setup I added the following to the markdown front matter for posts I created on Tumblr:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#7ee787&#34;&gt;tumblr_permalink&lt;/span&gt;:&lt;span style=&#34;color:#6e7681&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#a5d6ff&#34;&gt;http://brainsik.tumblr.com/post/3282351590/bomb-crater-swimming-pools&lt;/span&gt;&lt;span style=&#34;color:#6e7681&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I didn&amp;rsquo;t want to lose where the original source was, just in case. That came through today. I was able to grep through my posts directory and quickly see everything that had a Tumblr URL. Here&amp;rsquo;s the truncated output:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ rg &amp;#39;tumblr.com/post&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;content/posts/2011-02-14-bomb-crater-swimming-pools.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6:- http://brainsik.tumblr.com/post/3282351590/bomb-crater-swimming-pools&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;content/posts/2012-12-15-python-cron-task-exit-if-already-running.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6:- http://brainsik.tumblr.com/post/37951578978/python-cron-task-exit-if-already-running&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;content/posts/2011-02-13-tools-never-die-waddaya-mean-never.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6:- http://brainsik.tumblr.com/post/3277916749/tools-never-die-waddaya-mean-never&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This output had everything I needed to create Caddy redirect rules like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;redir /post/3282351590/* /2011/bomb-crater-swimming-pools/ permanent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There were enough entries that I didn’t want to edit things by hand. I started to consider whether it would be quicker to write some dirty Perl or Python when I thought: “Can an LLM just convert this for me?&amp;quot; I didn’t want the LLM to write a script, I wanted it to directly output the &lt;code&gt;redir&lt;/code&gt; rules.&lt;/p&gt;&#xA;&lt;p&gt;Turns out not only is this within some LLMs’ capability, it can be done with a tiny local model! Here&amp;rsquo;s the truncated result from a local Gemma 3n (4B)&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; model:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;redir /post/3282351590/* /2011/bomb-crater-swimming-pools/ permanent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;redir /post/37951578978/* /2012/python-cron-task-exit-if-already-running/ permanent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;redir /post/3277916749/* /2011/tools-never-die-waddaya-mean-never/ permanent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;Here is &lt;a href=&#34;prompt.txt&#34;&gt;the prompt I used&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Here is &lt;a href=&#34;llm-gemma3n.txt&#34;&gt;the console session where I run it against Gemma 3n&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This is a really small model. It&amp;rsquo;s so small I can run it on my phone:&lt;/p&gt;&#xA;&lt;img src=&#34;gemma3n-on-ios.png&#34; alt=&#34;Screenshot from iOS showing the LocallyAI app using the Gemma 3n model. We see the end of the prompt and the first 3 results are the same as when run on the desktop.&#34; style=&#34;width: 603px; display: block; margin: 0 auto;&#34;&gt;&#xA;&lt;p&gt;It’s exciting to me that a one-off, bespoke text conversion problem like this can be quickly solved by a local LLM. The main issue was I initially did not trust the output and so took the time to check the output. Given how high LLM error rates are, I’m not sure when I would just yolo and take the result at face value. Quite a factor for deciding when to use this tactic.&lt;/p&gt;&#xA;&lt;p&gt;In the past, I found much value in solving these coding puzzles. They felt like good exercises to keep those programming muscles toned. People should probably still do them, especially while still building up those chops. At this point in my life / career, programming is a tool, not the job, and having done so many of these puzzles already, I find I often just want to solve the main problem at hand and move on. I’m curious to find out when it feels right to still do them.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;The exact model I&amp;rsquo;m using on the laptop is &lt;a href=&#34;https://huggingface.co/mlx-community/gemma-3n-E4B-it-lm-4bit&#34;&gt;mlx-community/gemma-3n-E4B-it-lm-4bit&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Scraping Public Messages</title>
      <link>https://brainsik.net/2025/scraping-public-messages/</link>
      <pubDate>Wed, 21 May 2025 08:48:00 -0700</pubDate>
      <guid>https://brainsik.net/2025/scraping-public-messages/</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;a href=&#34;https://hachyderm.io/@brainsik/114546608132559901&#34;&gt;Originally posted on Mastodon.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;I have mixed feelings about this 404 Media article: &lt;a href=&#34;https://www.404media.co/researchers-scrape-2-billion-discord-messages-and-publish-them-online/&#34;&gt;&lt;em&gt;A Brazilian team used Discord&amp;rsquo;s API to scrape 10% of its open servers&lt;/em&gt;&lt;/a&gt;. The reality of public digital spaces is &lt;em&gt;they are&lt;/em&gt; being recorded. Always.&lt;/p&gt;&#xA;&lt;p&gt;This comes up on &lt;a href=&#34;https://hachyderm.io/tags/Mastodon&#34;&gt;#Mastodon&lt;/a&gt;. Folks are (understandably) uncomfortable with their public posts forming a giant corpus. However, we are all posting to public websites freely accessible by anyone.&lt;/p&gt;&#xA;&lt;p&gt;Expecting privacy in non-private spaces is inherently fraught. IRL if I’m talking face to face with a friend at a cafe I expect the conversation is not being purposely recorded. It’s not clear we should have the same expectation of @‘ing each other in public digital spaces, but it can feel violating nonetheless.&lt;/p&gt;&#xA;&lt;p&gt;Unfortunately, with the slop machines vacuuming &lt;em&gt;everything&lt;/em&gt; up, I think that boat has sailed (if it was ever even docked). It’s not clear we can create the social norms we might want. We have to ensure private communications for private conversations. In these times we are repeatedly shown money triumphs over respect.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.404media.co/researchers-scrape-2-billion-discord-messages-and-publish-them-online/&#34;&gt;&lt;img src=&#34;preview-card.png&#34; alt=&#34;Preview card showing a large Discord icon and a link to 404 Media&amp;rsquo;s article &amp;ldquo;Researchers Scrape 2 Billion Discord Messages and Publish Them Online&amp;rdquo; with subtitle &amp;ldquo;A Brazilian team used Discord&amp;rsquo;s API to scrape 10% of its open servers.&amp;rdquo;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>The LLM Journey Begins?</title>
      <link>https://brainsik.net/2025/llm-journey-begins/</link>
      <pubDate>Tue, 07 Jan 2025 14:00:00 -0800</pubDate>
      <guid>https://brainsik.net/2025/llm-journey-begins/</guid>
      <description>&lt;p&gt;I’ve started playing with LLMs. Finally feeling it’s time to see what I can see for myself. I’ve been inspired by reading &lt;a href=&#34;https://simonwillison.net/&#34;&gt;Simon Willison&lt;/a&gt;’s blog &amp;ndash; also the inspiration for getting these thoughts out of my skull and into a blog I can reference later.&lt;/p&gt;&#xA;&lt;aside class=&#34;toc&#34;&gt;&#xA;    &lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ul&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#why-now&#34;&gt;Why now?&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#a-problem-to-solve&#34;&gt;A problem to solve&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#the-tooling&#34;&gt;The tooling&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#the-experiment&#34;&gt;The experiment&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#compared-to-using-an-online-llm&#34;&gt;Compared to using an online LLM&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#the-hardware&#34;&gt;The hardware&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#takeaway-a-kind-of-cartomancy&#34;&gt;Takeaway: a kind of cartomancy&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#appendix&#34;&gt;Appendix&lt;/a&gt;&#xA;      &lt;ul&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#tooling-tribulations&#34;&gt;Tooling tribulations&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#hardware-limit-llama32-vision&#34;&gt;Hardware limit: llama3.2-vision&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ul&gt;&#xA;    &lt;/li&gt;&#xA;  &lt;/ul&gt;&#xA;&lt;/nav&gt;&#xA;&lt;/aside&gt;&#xA;&lt;h3 id=&#34;why-now&#34;&gt;Why now?&lt;/h3&gt;&#xA;&lt;p&gt;The post which convinced me to start experimenting is &lt;em&gt;&lt;a href=&#34;http://simonwillison.net/2024/Dec/31/llms-in-2024/&#34;&gt;Things we learned about LLMs in 2024&lt;/a&gt;&lt;/em&gt;. In particular, reading “&lt;a href=&#34;https://simonwillison.net/2024/Dec/31/llms-in-2024/#some-of-those-gpt-4-models-run-on-my-laptop&#34;&gt;Some of those GPT-4 models run on my laptop&lt;/a&gt;” made me reframe how I feel.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; That models of this caliber have become efficient enough to run locally (and privately) on a laptop&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; sparked my curiosity. I’m hopeful the trend of increasing efficiency continues. I know it’s &lt;em&gt;far&lt;/em&gt; from solving the current energy consumption story, but at least it’s a step in the right direction.&lt;/p&gt;&#xA;&lt;p&gt;How I’ve been thinking about their use is changing. Getting away from the snake oil, “this solves everything” hype view as well as the ostrich head, “utterly useless” reactive view, leads me to: How can I use this new technology? Where are its edges? What can it do and not do? Is it possible to use it in a responsible way?&lt;/p&gt;&#xA;&lt;h3 id=&#34;a-problem-to-solve&#34;&gt;A problem to solve&lt;/h3&gt;&#xA;&lt;p&gt;The first thing I wanted to try was using it as a search engine replacement. The web is so incredibly broken I often cannot use a search engine to help solve technical problems.&lt;/p&gt;&#xA;&lt;p&gt;Once upon a time, I’d expect to end up on some nerd’s personal blog where they solved something similar or explained the technical details of the thing I was working with, but that rarely happens now. Instead, I get 3 types of results:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;🙄 Years-old Reddit posts&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; with people running into the same problem (usually without a solution).&lt;/li&gt;&#xA;&lt;li&gt;🥴 Pages that fool me into hoping they are relevant, but don’t even have the majority of my query terms on them. “I see you said ‘Windows’: here’s a popular selection of pages from Microsoft’s Knowledge Base that may or may not be relevant.”&lt;/li&gt;&#xA;&lt;li&gt;💀 SEO-optimized trash inspiring me to replicate &lt;em&gt;Walden&lt;/em&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;It’s reached the point where I put much of the search query inside double quotes (to ensure results with those terms) and then get zero results. An empty page is at least honest and wastes less of my time. Trading away maddening for saddening.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-tooling&#34;&gt;The tooling&lt;/h3&gt;&#xA;&lt;p&gt;This is where I landed after various trials and errors.&lt;/p&gt;&#xA;&lt;p&gt;I’m using &lt;a href=&#34;https://ollama.com/library/llama3.2&#34;&gt;llama3.2&lt;/a&gt; (the 3B parameter version). The easiest way I found to get this going is:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install ollama&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ollama serve&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e;font-style:italic&#34;&gt;# open another terminal (first run will download the model)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ollama run llama3.2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is what drove the majority of my experiments.&lt;/p&gt;&#xA;&lt;p&gt;As an additional experiment I installed Simon’s &lt;code&gt;llm&lt;/code&gt;. After more trial and error, this worked best:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e;font-style:italic&#34;&gt;# install llm into it&amp;#39;s own environment&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;uvx --python 3.11 llm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e;font-style:italic&#34;&gt;# install the ollama plugin&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;uvx --python 3.11 llm install llm-ollama&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e;font-style:italic&#34;&gt;# with `ollama serve` running&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;uvx --python 3.11 llm models default llama3.2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;uvx --python 3.11 llm chat&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;the-experiment&#34;&gt;The experiment&lt;/h3&gt;&#xA;&lt;p&gt;Recently, I added a new host to my SSH config (&lt;a href=&#34;https://snips.sh/&#34;&gt;snips.sh&lt;/a&gt; — it’s a fun idea) and made a new key to use with it. However, every time I connected I was prompted to use the wrong key before falling back to the correct one. Web searches for how to fix this or understand what was going on led me absolutely nowhere: it was a waste of time reading worthless Stack Overflow and Reddit results.&lt;/p&gt;&#xA;&lt;p&gt;Time to fire up that local LLM and see what it can do! Although I got contradictory and confusing advice at times, it gave me actionable things to try and a direction to head. Pretty soon, I had solved my problem. Success!&lt;/p&gt;&#xA;&lt;p&gt;While working with the tool, it felt like talking to a dimwitted but incredibly well-read coworker. They “know” a lot, but they’re bad at connecting the dots, mix things up, and sometimes unknowingly fabricate things. Although decoding these responses requires effort, I can work with it. I’m getting value. I got nothing but frustration and lost time from from using a search engine.&lt;/p&gt;&#xA;&lt;p&gt;It’s important to note this was successful because I have a lot of SSH config experience. Only with that skill was I able to figure out a path forward. If this was an area I knew little about, there would have been frustrating periods of going in circles. For example, in the “conversations” I had with the LLM, it would tell me to put the &lt;code&gt;IdentitiesOnly&lt;/code&gt; config option in some places and then later tell me to remove it from the exact same places. LLMs don’t reason! You’re merely tickling different matching patterns. But, it worked.&lt;/p&gt;&#xA;&lt;h3 id=&#34;compared-to-using-an-online-llm&#34;&gt;Compared to using an online LLM&lt;/h3&gt;&#xA;&lt;p&gt;I tried the same queries I was making about SSH config via DuckDuckGo&amp;rsquo;s chat tool. That let me try a few different models (GPT-4o mini, Claude 3 Haiku, Llama-3.1 70B). I found those weren&amp;rsquo;t any better at helping me with my SSH config issue than the local one I was running. So, in this case, the local model was as good as the free online ones!&lt;/p&gt;&#xA;&lt;p&gt;Maybe I’ll eventually try a top-end model (like Claude 3.5) to see what that&amp;rsquo;s like, but I’m currently much more interested in what I can accomplish locally.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-hardware&#34;&gt;The hardware&lt;/h3&gt;&#xA;&lt;p&gt;This was all done on an M1 MacBook Air with 16GB of memory. It&amp;rsquo;s slower than the online tools, but not enough to matter. It&amp;rsquo;s a few extra seconds of waiting, which I found didn’t make a difference. Especially since you start reading the result before it’s done outputting.&lt;/p&gt;&#xA;&lt;p&gt;I tried running the model on an iPhone 16 Pro via &lt;a href=&#34;https://apps.apple.com/us/app/mlc-chat/id6448482937&#34;&gt;MLC Chat&lt;/a&gt; and it’s way faster&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;, though gave me much worse results for the same prompt. I suspect even though it’s llama3.2:3B, there might be some other differences since the full name in MLC Chat is “Llama-3.2-3B-Instruct-q4f16_1-ML”. I don’t know what that means. Maybe the &lt;a href=&#34;https://github.com/mlc-ai/mlc-llm&#34;&gt;MLC compiled&lt;/a&gt; version is different? Something to investigate another time.&lt;/p&gt;&#xA;&lt;h3 id=&#34;takeaway-a-kind-of-cartomancy&#34;&gt;Takeaway: a kind of cartomancy&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Cartomancy&#34;&gt;Cartomancy&lt;/a&gt; is bullshit if you think of it as providing answers, truth, prediction, etc., but I think it has value: it’s a random number generator for reflection. In tarot, you shuffle the cards, lay them down in a particular way, and then the card face, orientation, and position become an interpretation. This can get you to think of your life or self in a way you hadn’t before. It’s been decades since I’ve done this, but I still recognize there is value in the process. It feels similar to the way &lt;a href=&#34;https://en.wikipedia.org/wiki/Oblique_Strategies&#34;&gt;Oblique Strategies&lt;/a&gt; work (which I do use from time to time). On demand alternative perspectives can help get you past a stuck place and that’s what happened in my experiment.&lt;/p&gt;&#xA;&lt;h3 id=&#34;appendix&#34;&gt;Appendix&lt;/h3&gt;&#xA;&lt;h4 id=&#34;tooling-tribulations&#34;&gt;Tooling tribulations&lt;/h4&gt;&#xA;&lt;p&gt;Here’s some tooling I tried to setup that failed. Free yourself of the pain.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Installing &lt;code&gt;llm&lt;/code&gt; via Homebrew.&lt;/p&gt;&#xA;&lt;p&gt;This went poorly because Homebrew is its own Python environment and that means you’re using whatever version of Python and its packages happen to be in the index. In particular, I couldn’t install the &lt;code&gt;llm-ollama&lt;/code&gt; plugin due to the version of &lt;code&gt;httpx&lt;/code&gt; it required being older than the one in my Homebrew environment.&lt;/p&gt;&#xA;&lt;p&gt;Using &lt;code&gt;uvx&lt;/code&gt; to install &lt;code&gt;llm&lt;/code&gt; means you can choose a specific Python version and install additional dependencies (the &lt;code&gt;llm&lt;/code&gt; plugins) into a self-contained environment. Honestly, I should have done that in the first place. I ignored my instinct and put my finger in the plug socket. Sometimes you gotta remind yourself why you have the instincts you do.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Using gpt4all with &lt;code&gt;llm&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I don’t know if this is user error or if gpt4all happens to be in a weird state right now, but the model list it comes with uses the same name for 2 different models! In particular, “Llama3” is used for &lt;em&gt;both&lt;/em&gt; the 3B and 1B parameter models and which one got picked was inconsistent.&lt;/p&gt;&#xA;&lt;p&gt;The first time I used “Llama3” the 3B model was downloaded and used, but later it downloaded the 1B model and used that instead. 🤦🏼 I tried to debug this, but quickly gave up and went with the &lt;code&gt;ollama&lt;/code&gt; server instead. I didn’t want my first foray to end in a yak shaving exercise.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Trying to install the gpt4all macOS app.&lt;/p&gt;&#xA;&lt;p&gt;LOL. I got prompted to install Rosetta. In &lt;del&gt;2024&lt;/del&gt; 2025. Noped right out of that. It sounds like it may be the installer needing Rosetta as &lt;a href=&#34;https://github.com/nomic-ai/gpt4all/issues/905#issuecomment-2267679292&#34;&gt;an unfortunate side effect of the Qt Installer Framework&lt;/a&gt;. If you already have Rosetta installed or don’t care, go for it.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;hardware-limit-llama32-vision&#34;&gt;Hardware limit: llama3.2-vision&lt;/h4&gt;&#xA;&lt;p&gt;I gave the &lt;a href=&#34;https://ollama.com/library/llama3.2-vision&#34;&gt;llama3.2-vision&lt;/a&gt; model a shot and that’s when things fell over.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e;font-style:italic&#34;&gt;# with `ollama serve` running&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ollama run llama3.2-vision&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is an 8GB download and it uses 8GB of memory when loaded without doing anything. And boy does my laptop not do well with this. While trying to process an image I took with my phone, the laptop was using all the memory and starting to swap, though at least not thrashing.&lt;/p&gt;&#xA;&lt;p&gt;Each query took almost 3 minutes to complete (GPU pinned). This made it unusable since I’m doing multiple queries to get what I want. Perhaps if I learn how to prompt better (reminds me of getting good at doing Google searches back in the day) I can one shot these and the 3&amp;rsquo; wait would be fine, but as is, it’s not tenable.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;I’m deeply aware of &lt;em&gt;so&lt;/em&gt; many issues with the AI hype cycle that’s happening. It’s why I’ve been reluctant to dip my toe too much. The climate repercussions, the bullshit generation, how the training data was acquired, the impact to so many people’s livelihoods, and the power differential it is taking place within and looks optimized to serve, can be overwhelming.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Yes, Simon’s laptop is beefy: an M2 Pro with 64GB of memory, but going from something only able to run in a datacenter to now being able to run on a laptop in 21 months is remarkable!&lt;br&gt;&#xA;&lt;br&gt;&#xA;That said, it’s not even possible to configure an M4 Pro laptop with that much RAM. This upsell bullshit makes me wish Tim Cook would GTFO. You can get an M4 Pro with 64GB in a Mac mini! They are making these chips! You just aren’t allowed to have it in your laptop. 🖕 Maybe the next CEO will prioritize products for the customer’s instead of for Apple’s short-term stock price. But, I digress …&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Since I’m not using Google, the only search engine paying Reddit to index it. The open web this is not.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;Yes, I get why an A18 Pro is faster than an M1, but it’s still hilarious that my phone is faster than my laptop in this regard.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Successfully Migrating to Caddy from Nginx</title>
      <link>https://brainsik.net/2024/successfully-migrating-to-caddy-from-nginx/</link>
      <pubDate>Tue, 09 Jul 2024 10:39:57 -0700</pubDate>
      <guid>https://brainsik.net/2024/successfully-migrating-to-caddy-from-nginx/</guid>
      <description>&lt;p&gt;Last week I migrated the various web sites I host &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; from Nginx to &lt;a href=&#34;https://caddyserver.com/docs/&#34;&gt;Caddy&lt;/a&gt;. I could nerd on about how this finally lets me offer HTTP/3 &lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; and means I&amp;rsquo;m using a daemon written in a &lt;a href=&#34;https://www.memorysafety.org/docs/memory-safety/&#34;&gt;memory safe language&lt;/a&gt;, but mostly it&amp;rsquo;s config language is different enough from Apache and Nginx I&amp;rsquo;ve been intrigued to try it.&lt;/p&gt;&#xA;&lt;h3 id=&#34;tls&#34;&gt;TLS&lt;/h3&gt;&#xA;&lt;p&gt;On the old server, I was using &lt;a href=&#34;https://letsencrypt.org&#34;&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;https://certbot.eff.org&#34;&gt;certbot&lt;/a&gt; to manage my TLS certificates. This was fine. The main thing that bothered me was using a wildcard cert out of laziness. With all the domains and subdomains I&amp;rsquo;m hosting pages for, I&amp;rsquo;d need to write scripts to automate the initial cert creation and generate the per site Nginx config. Look, it&amp;rsquo;s not a huge deal, an hour or so to get it all in in place, but my hobby projects are supposed to be fun and that did not sound fun. I&amp;rsquo;ve written enough scripts like those and the joy I found in solving that type of problem has gone stale. When you&amp;rsquo;ve got a kid, every minute of hobby time is precious.&lt;/p&gt;&#xA;&lt;p&gt;Using a wildcard cert with Nginx meant simplifying the cert generation &lt;em&gt;and&lt;/em&gt; the config (since many sites get to use the same &lt;code&gt;ssl_certificate&lt;/code&gt; path). However, it also meant using the &lt;a href=&#34;https://letsencrypt.org/docs/challenge-types/#dns-01-challenge&#34;&gt;DNS challenge&lt;/a&gt; and using the DNS challenge meant making the server able to modify DNS! 😱 &lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;With Caddy, I &lt;a href=&#34;https://caddyserver.com/docs/automatic-https&#34;&gt;did nothing and got it all&lt;/a&gt;: creating any site config results in a TLS cert being provisioned and served. It&amp;rsquo;s amazing. Not only did I not need to provision certs, there’s not a single line of config telling the server where to find them.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll get to snippets (the &lt;code&gt;import&lt;/code&gt;) in a moment, but this is the entire config for a site with it&amp;rsquo;s own auto-renewing cert:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-caddyfile&#34; data-lang=&#34;caddyfile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#79c0ff;font-weight:bold&#34;&gt;more.theory.org&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff7b72&#34;&gt;import&lt;/span&gt; archived-blog&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;snippets-and-placeholders&#34;&gt;Snippets and placeholders&lt;/h3&gt;&#xA;&lt;p&gt;The boilerplate and copypasta I&amp;rsquo;ve needed in Apache and then Nginx configs always bothered me. With &lt;a href=&#34;https://caddyserver.com/docs/caddyfile/concepts#snippets&#34;&gt;Caddy snippets&lt;/a&gt; and &lt;a href=&#34;https://caddyserver.com/docs/caddyfile/concepts#placeholders&#34;&gt;Caddy placeholders&lt;/a&gt; I&amp;rsquo;ve been able to DRY up the config to a small number of (often just one) imports. It&amp;rsquo;s lovely. ✨&lt;/p&gt;&#xA;&lt;p&gt;On Nginx, I used the &lt;code&gt;include&lt;/code&gt; directive in order to reuse config as much as possible. This helps a lot, but you&amp;rsquo;re limited by the lack of variables to parameterize over and an inability to pass in arguments.&lt;/p&gt;&#xA;&lt;p&gt;This means &lt;em&gt;each site&lt;/em&gt; in Nginx needs a lot of specifics: document root, paths to the TLS files, and the paths to the logs.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff7b72&#34;&gt;server&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff7b72&#34;&gt;server_name&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;more.theory.org&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff7b72&#34;&gt;include&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;local/ssl.conf&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff7b72&#34;&gt;ssl_certificate&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;/etc/letsencrypt/live/more.theory.org/fullchain.pem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff7b72&#34;&gt;ssl_certificate_key&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;/etc/letsencrypt/live/more.theory.org/privkey.pem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff7b72&#34;&gt;ssl_trusted_certificate&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;/etc/letsencrypt/live/more.theory.org/chain.pem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff7b72&#34;&gt;root&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;/var/www/theory.org/more/html&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff7b72&#34;&gt;include&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;local/archived-blog.conf&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff7b72&#34;&gt;access_log&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;/var/log/nginx/more.theory.org-access.log&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff7b72&#34;&gt;error_log&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;/var/log/nginx/more.theory.org-error.log&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With Caddy I was able to make a single snippet that could be used repeatedly:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-caddyfile&#34; data-lang=&#34;caddyfile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#79c0ff&#34;&gt;(archived-blog)&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff7b72&#34;&gt;import&lt;/span&gt; default&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff7b72&#34;&gt;root&lt;/span&gt; &lt;span style=&#34;color:#d2a8ff;font-weight:bold&#34;&gt;/srv/www/{labels.1}.{labels.0}/{labels.2}/html&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff7b72&#34;&gt;file_server&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#ff7b72&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;index.html&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;index.xml&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#ff7b72&#34;&gt;hide&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;wp-admin*&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;wp-login*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff7b72&#34;&gt;header&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;Cache-Control&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;max-age=31536000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;default&lt;/code&gt; snippet includes things every single site follows (like where logging goes). The &lt;code&gt;root&lt;/code&gt; directive uses (a shortened version of) the &lt;a href=&#34;https://caddyserver.com/docs/json/apps/http/#docs&#34;&gt;&lt;code&gt;{http.request.host.labels.*}&lt;/code&gt; placeholder&lt;/a&gt; which splits up the hostname at the dots (0: &amp;ldquo;org&amp;rdquo;, 1: &amp;ldquo;theory&amp;rdquo;, 2: &amp;ldquo;more&amp;rdquo;) so we can parameterize where to find the files. The &lt;code&gt;file_server&lt;/code&gt; and the &lt;code&gt;header&lt;/code&gt; directives are specific to our notion of an &amp;ldquo;archived blog&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Thus, configuring 5 sites turns into:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-caddyfile&#34; data-lang=&#34;caddyfile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#79c0ff;font-weight:bold&#34;&gt;bella.theory.org&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#79c0ff;font-weight:bold&#34;&gt;more.theory.org&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#79c0ff;font-weight:bold&#34;&gt;mosuki.theory.org&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#79c0ff;font-weight:bold&#34;&gt;roar.theory.org&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#79c0ff;font-weight:bold&#34;&gt;saddle.theory.org&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff7b72&#34;&gt;import&lt;/span&gt; archived-blog&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In all, I went from about 880 lines of Nginx config to 375 lines of Caddy config. It&amp;rsquo;s a lot less to manage and think about and a lot easier to tweak.&lt;/p&gt;&#xA;&lt;p&gt;Glorious! 🤩&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Yeah, I still host websites on my own server like the indieweb is living the dream of the early aughts. I&amp;rsquo;m wildly aware of how out of touch this is. Not only because all these sites could be freely hosted as static pages via a variety of services, but because all the search engine companies now view these pages as nothing more than data to plunder into their LLM models and never link back to.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://nginx.org/en/docs/quic.html&#34;&gt;Nginx gained support for QUIC and HTTP/3&lt;/a&gt; in v1.25. Unfortunately, Debian 12 is on v1.22 and I have no desire to build/package/backport things. Been there, done that. I&amp;rsquo;m living the stable life (in this respect).&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;I generally try to act professional in my hobbies, but as hobbies are first and foremost &lt;em&gt;for fun&lt;/em&gt;, I&amp;rsquo;ll take calculated risks to keep them so. The thinking went: (1) It&amp;rsquo;s unlikely this server is a specific target, so I&amp;rsquo;ll only worry about the script kiddies. (2) The attack surface is narrow: I only expose Postfix and Nginx and keep them patched. (3) The DNS token is IP restricted.&lt;/p&gt;&#xA;&lt;p&gt;I felt this boiled down to: am I worried about someone hitting me with a code execution zero day for Postfix or Nginx? No.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>GPG Key Transition 2022</title>
      <link>https://brainsik.net/2022/gpg-key-transition-2022/</link>
      <pubDate>Sat, 31 Dec 2022 18:14:02 -0800</pubDate>
      <guid>https://brainsik.net/2022/gpg-key-transition-2022/</guid>
      <description>&lt;p&gt;Doing end-of-the-year security housekeeping and figured it was time to generate a new GPG key with modern defaults. After looking into the model of a main key stored offline (like in a firesafe) and &lt;a href=&#34;https://mikeross.xyz/create-gpg-key-pair-with-subkeys/&#34;&gt;only using subkeys&lt;/a&gt; locally, I decided it wasn&amp;rsquo;t worth the effort. The reality is I almost only use these for signing GitHub commits. 🤷&lt;/p&gt;&#xA;&lt;p&gt;The cypherpunk fever dreams of key signing parties and a robust web of trust feel pretty far away. Even &lt;a href=&#34;https://keybase.io&#34;&gt;Keybase&lt;/a&gt; is no longer mentioned. We&amp;rsquo;ll continue to solve this in &lt;a href=&#34;https://signal.org/&#34;&gt;different&lt;/a&gt; &lt;a href=&#34;https://matrix.org&#34;&gt;ways&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;At any rate, &lt;a href=&#34;https://brainsik.theory.org/gpg-transition-statement-2022.txt&#34;&gt;my transition statement is linked here&lt;/a&gt; and included below.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-----BEGIN PGP SIGNED MESSAGE-----&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hash: SHA512&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat, 31 Dec 2022 17:00:00 -0800&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;After 8½ years, I am transitioning to a new GPG key to take advantage of&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;modern defaults. The old key will continue to be valid for 1 year.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Starting today, new signatures will be made with the new key.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;This transition document is signed with both keys to validate the&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;transition.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The old key:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pub   rsa4096/19A1D1424FE98E13 2014-07-03 [SC] [expires: 2023-12-31]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Key fingerprint = 5D80 FC62 9CEF 8FAE 737C  DDED 19A1 D142 4FE9 8E13&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The new key:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pub   ed25519/5260A4FA4A4CB7A5 2022-12-31 [SC]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Key fingerprint = AE49 4547 B3E1 F9B6 6291  69E0 5260 A4FA 4A4C B7A5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;To fetch my new key from a public key server:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpg --keyserver keyserver.ubuntu.com --recv-key 5260A4FA4A4CB7A5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;If you&amp;#39;ve already validated my old key, you can validate the new key is&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;signed by my old key:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpg --check-sigs 5260A4FA4A4CB7A5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;If you are satisfied you&amp;#39;ve got the right key, I&amp;#39;d appreciate your&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;signature and upload:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpg --sign-key 5260A4FA4A4CB7A5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpg --keyserver keyserver.ubuntu.com --send-key 5260A4FA4A4CB7A5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- - -- jeremy avnet .:. @brainsik&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-----BEGIN PGP SIGNATURE-----&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iQIzBAEBCgAdFiEEXYD8Ypzvj65zfN3tGaHRQk/pjhMFAmOw6jEACgkQGaHRQk/p&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jhME8xAAkgL0/7Gis/eSJMV/oORc80V16t26CDlrmZ++HRAa5gk5On/aEhKzpNMO&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;st9h1fpnDQAmTzT8PiMz3Tdkk9m4Xh3XBkeeyXPKzAgfm0U6dJH2xJooEb9KtXf5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;m4oShVntYCVtRQZlmS5KN35cPxEikFbfz8ok1B+/j77Awgo3uXbbKD7WdUnVSSUE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dmA0x/pQcQPS9Eg7TzT+gNCsui9zU6riMvtVp5I4DWvVg/fP322nG7Y0O/SMWcuU&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ndFyxEc1jzrXkhOO5Hv+bO5wefU7K6ct8JcBvvzY5/7GvRJwx/GQCl7n0PQS4kCJ&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AS40BmZ2lhQGP4O7gOqYmn0krrskXZVSf0tKzgn2KvKyoMtijf6HbEZw1lq5kxuH&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ubnQH7IoBaIZpkcJRdq9u77jD9AKwVdCz/TUL4MGR9B/OYlGDBwEJ9LxPSGLBATv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t+OKOUfg/apNDn8lFTR6YnGT9D85NKEWm0FEqVx51eDHSH+FxKGuY57FG18qMB3i&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;qWrtqdQsq42bzhbPWKAIPwjoImeKyMTTbq6oJV3d7htStt1AHHPxR4GXGSZQZ0vW&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;uonjIh6HHJLF5guLIMw3LD+GfkDKHxrcNa4A7BA3RDuxyRSjXq1QFp0DSSgk1cCb&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sy94dRdhSPg1QwW3EXRnEXcp8QTJfB4QF0sG6WuXj3otXbLo+i+IdQQBFgoAHRYh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BK5JRUez4fm2YpFp4FJgpPpKTLelBQJjsOoxAAoJEFJgpPpKTLel7rsA/iR2DuNc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PSSuLB8G1019vRtHuSV7SlwB4VzK/hip/W3aAQC+DHH+umRJmBhC50qxK5JuBIOA&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lBvZJEvPBU/BYBCmDg==&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;=sj7h&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-----END PGP SIGNATURE-----&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>The problem with moving phones from copper to fiber: power</title>
      <link>https://brainsik.net/2014/moving-phones-from-copper-to-fiber/</link>
      <pubDate>Fri, 15 Aug 2014 10:22:27 +0000</pubDate>
      <guid>https://brainsik.net/2014/moving-phones-from-copper-to-fiber/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;If you can&amp;rsquo;t contact your loved ones, or government agencies and relief&#xA;organizations can&amp;rsquo;t coordinate, you can&amp;rsquo;t get anything done. […] A&#xA;communications system is only useful if you can connect to every other&#xA;endpoint on the network. If you have power but no one else does, you have a&#xA;well powered and expensive paperweight (assuming you still have paper). To&#xA;that point, if your phone has power but the switching station does not, or the&#xA;cell towers in half the city are down, you still aren&amp;rsquo;t able to&#xA;communicate with anyone else.”&lt;/p&gt;&#xA;&lt;p&gt;—&lt;a href=&#34;https://arstechnica.com/information-technology/2014/08/why-verizon-is-trying-very-hard-to-force-fiber-on-its-customers/?comments=1&amp;amp;comments-page=1#comment-27402151&#34; title=&#34;A communications system is only useful if you can connect to every other endpoint on the network.&#34;&gt;emtcharlie on ArsTechnica&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</description>
    </item>
    <item>
      <title>The Secret Government Rulebook For Labeling You a Terrorist</title>
      <link>https://brainsik.net/2014/the-secret-government-rulebook-for-labeling-you-a-terrorist/</link>
      <pubDate>Sat, 09 Aug 2014 13:16:49 +0000</pubDate>
      <guid>https://brainsik.net/2014/the-secret-government-rulebook-for-labeling-you-a-terrorist/</guid>
      <description>&lt;p&gt;A secret process that requires neither “concrete facts” nor “irrefutable evidence” …&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;“Instead of a watchlist limited to actual, known terrorists, the government has&#xA;built a vast system based on the unproven and flawed premise that it can&#xA;predict if a person will commit a terrorist act in the future,” says Hina&#xA;Shamsi, the head of the ACLU’s National Security Project. “On that dangerous&#xA;theory, the government is secretly blacklisting people as suspected terrorists&#xA;and giving them the impossible task of proving themselves innocent of a threat&#xA;they haven’t carried out.”&lt;/p&gt;&#xA;&lt;p&gt;—&lt;a href=&#34;https://firstlook.org/theintercept/article/2014/07/23/blacklisted/&#34; title=&#34;The Secret Government Rulebook For Labeling You a Terrorist&#34;&gt;The Secret Government Rulebook For Labeling You a Terrorist&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</description>
    </item>
    <item>
      <title>virtualenv-burrito 2.7</title>
      <link>https://brainsik.net/2014/virtualenv-burrito-2-7/</link>
      <pubDate>Mon, 07 Jul 2014 09:50:35 +0000</pubDate>
      <guid>https://brainsik.net/2014/virtualenv-burrito-2-7/</guid>
      <description>&lt;p&gt;Yesterday, &lt;a href=&#34;https://github.com/brainsik/virtualenv-burrito#readme&#34;&gt;virtualenv-burrito&lt;/a&gt; 2.7 was released. There are two significant changes:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;All Python packages in the &lt;code&gt;.venvburrito&lt;/code&gt; directory are now inside a versioned site-packages directory. For example, if you are running Python 2.7 during the install or upgrade, all packages will now live in &lt;code&gt;lib/python2.7/site-packages&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;pip&lt;/code&gt; program is no longer user accessible (i.e., in the PATH). You could easily figure out where it&amp;rsquo;s been moved, but that&amp;rsquo;s discouraged (and unsupported).&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;These changes should help reduce some confusion and incompatibilities reported on &lt;a href=&#34;https://github.com/brainsik/virtualenv-burrito&#34;&gt;the GitHub project&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;To upgrade to the latest version, run:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virtualenv-burrito upgrade&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you are installing for the first time, run:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sL https://raw.githubusercontent.com/brainsik/virtualenv-burrito/master/virtualenv-burrito.sh | &lt;span style=&#34;color:#79c0ff&#34;&gt;$SHELL&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>GPG Key Transition 2014</title>
      <link>https://brainsik.net/2014/gpg-key-transition/</link>
      <pubDate>Wed, 02 Jul 2014 21:00:07 +0000</pubDate>
      <guid>https://brainsik.net/2014/gpg-key-transition/</guid>
      <description>&lt;p&gt;After 14 years, it&amp;rsquo;s time for a new GPG key adhering to modern standards.&#xA;You can &lt;a href=&#34;https://brainsik.theory.org/gpg-transition-statement-2014.txt&#34;&gt;find my transition statement here&lt;/a&gt;.&#xA;The full-text follows.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-----BEGIN PGP SIGNED MESSAGE-----&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hash: SHA1,SHA512&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Wed, 02 Jul 2014 20:54:03 -0700&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;I am transitioning GPG keys from an old 1024-bit DSA key to a new&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4096-bit RSA key. The old key will continue to be valid for some time,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;but I prefer all new correspondance to be encrypted with the new key.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;All future signatures will be made with the new key.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;This transition document is signed with both keys to validate the&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;transition.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;If you have signed my old key, I would appreciate signatures on my new&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;key as well.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The old key:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pub   1024D/C771DF0B 2000-08-24&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Key fingerprint = 6846 E600 739F 3DB5 DB02  B670 FDDE 4167 C771 DF0B&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The new key:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pub   4096R/4FE98E13 2014-07-03&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Key fingerprint = 5D80 FC62 9CEF 8FAE 737C  DDED 19A1 D142 4FE9 8E13&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;To fetch my new key from a public key server:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  gpg --keyserver pgp.mit.edu --recv-key 4FE98E13&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;If you&amp;#39;ve already validated my old key, you can validate the new key is&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;signed by my old key:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  gpg --check-sigs 4FE98E13&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;If you are satisfied you&amp;#39;ve got the right key, I&amp;#39;d appreciate your&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;signature and upload:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  gpg --sign-key 4FE98E13&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  gpg --keyserver pgp.mit.edu --send-key 4FE98E13&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- -- jeremy avnet .:. @brainsik&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-----BEGIN PGP SIGNATURE-----&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Version: GnuPG v1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iEYEARECAAYFAlO01QYACgkQ/d5BZ8dx3wsm0QCeK1SD9Ci0ZWnsacgmF6KsRjcV&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ZwwAnAj5lLctRWdphcAgBglgxT7CyrrniQIcBAEBCgAGBQJTtNUGAAoJEBmh0UJP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6Y4TppwP/1ngLPDRg+NGsa1OJxcTuQt3vifcXUUX0k44L/kQ6/lPS6nxScrNLlOi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GkSxgzYv9rsCNcaqZMJ7GR+fHxGTOSD3/PywEDpU6X/uNZArlQD9gxm60IkPKeMd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;8DQpUieTXmjvGcbLArDda7t/ntXIZOyHMt/gltHTBOOpmXJlfenqQzzjmOSoK5QK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vEJA3TOmlvzVRXPPPw2gq6IZQVtqCZsjLCynp36E39wSwMaFrJ3gwohuzvn0FQkF&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;88vMttOpBDHxkyt1VgCff54SdjqiG2aFzsUV25bXg2FIUdhu+fxqpuW/EjLWbeKM&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;X0IjtXl2Iz8wu8WtwxeaABdtB8eEC+RDm4ETqJB9Fm5sf83b5Stx2yYcB/H4TtXI&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hX51xmXQuezXDhqAiNwjn0ZUN7NjghNTvpUtUszy8RtaawaJ8Ip1nen4FJulHhrz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VXJ3jGX5fnV/pY1MoxyJbyHGcx4xAL8tbi/ha2vPhQXRFHXDSCAVmk+lrrscj0V8&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;UwnpOG20P/SmMIO5LW9v6X8ecZGf/OOtBDAO4WUXWtpJRVPGJXz4GBpn9lpMWvi1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3a51QU37iig5tDcSNRXbDxiZory+JH1eibbTs4K+ynUKVDYs8ZgVBM+exV1inCG6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;R9SajrymY7XQ6fwhiDPn+ikRulv6gB59Bq0xWgadWM0nkCpGz7IE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;=GtNZ&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-----END PGP SIGNATURE-----&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>x.pose&#39;d data</title>
      <link>https://brainsik.net/2014/x-posed-data/</link>
      <pubDate>Thu, 19 Jun 2014 02:34:26 +0000</pubDate>
      <guid>https://brainsik.net/2014/x-posed-data/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;x.pose is a wearable data-driven sculpture that exposes a person&amp;rsquo;s skin as a&#xA;real-time reflection of the data that the wearer is producing.&lt;/p&gt;&#xA;&lt;p&gt;—&lt;a href=&#34;http://xc-xd.com/#/xpose/&#34;&gt;x.pose – xuedi.chen&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-pub/xpose04a_o.jpg&#34; alt=&#34;x.pose diagram&#34; title=&#34;x.pose diagram&#34;&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;She decided to aggregate this data collected on her everyday, building a&#xA;mobile app to do the job using Node.js and PhoneGap. X.pose is the result of&#xA;those data points, which have been translated into an abstract geometric&#xA;representation using 3D printing software Rhino. Under the mesh is an array of&#xA;displays that can change in opacity according to which location you are in&#xA;(mapped out into the design) and how much data you are giving up at any given&#xA;minute, in real time. They are made from electrochromic film, which becomes&#xA;transparent when a current is passed through at a specific frequency. The app&#xA;doing the data calculations is driving that current, with the panels&#xA;controlled by an Arduino and linked to the app by Bluetooth. Give too much&#xA;away and you will be bare for the world to see.&lt;/p&gt;&#xA;&lt;p&gt;—&lt;a href=&#34;https://arstechnica.com/business/2014/06/this-top-turns-see-through-if-you-leave-personal-data-exposed/&#34;&gt;This top turns see-through if you leave personal data exposed&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</description>
    </item>
    <item>
      <title>Python cron task – exit if already running</title>
      <link>https://brainsik.net/2012/python-cron-task-exit-if-already-running/</link>
      <pubDate>Sat, 15 Dec 2012 02:31:00 +0000</pubDate>
      <guid>https://brainsik.net/2012/python-cron-task-exit-if-already-running/</guid>
      <description>&lt;p&gt;A simple way for Python cron tasks to exit if another process is currently&#xA;running. Does not use a pidfile.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff7b72&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#ff7b72&#34;&gt;os&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff7b72&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#ff7b72&#34;&gt;subprocess&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff7b72&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#ff7b72&#34;&gt;shlex&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff7b72&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#d2a8ff;font-weight:bold&#34;&gt;bail_if_another_is_running&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cmd &lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;=&lt;/span&gt; shlex&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#34;pgrep -u &lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt; -f &lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;.&lt;/span&gt;format(os&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;.&lt;/span&gt;getuid(), &lt;span style=&#34;color:#79c0ff&#34;&gt;__file__&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pids &lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;=&lt;/span&gt; subprocess&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;.&lt;/span&gt;check_output(cmd)&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#79c0ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff7b72&#34;&gt;if&lt;/span&gt; len(pids) &lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;1&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pids&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;.&lt;/span&gt;remove(&lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;.&lt;/span&gt;format(os&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;.&lt;/span&gt;getpid()))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print &lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#34;Exiting! Found &lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt; is already running (pids): &lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;.&lt;/span&gt;format(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#79c0ff&#34;&gt;__file__&lt;/span&gt;, &lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;.&lt;/span&gt;join(pids))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff7b72&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#f0883e;font-weight:bold&#34;&gt;SystemExit&lt;/span&gt;(&lt;span style=&#34;color:#a5d6ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Virtualenvs with different interpreters</title>
      <link>https://brainsik.net/2011/virtualenvs-with-different-interpreters/</link>
      <pubDate>Tue, 09 Aug 2011 10:05:00 +0000</pubDate>
      <guid>https://brainsik.net/2011/virtualenvs-with-different-interpreters/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update 2011-09-27&lt;/strong&gt;: Turns out virtualenv and virtualenvwrapper support this out of the box. Most of what&amp;rsquo;s written below is horrifically complex compared to just using the &lt;code&gt;-p&lt;/code&gt; switch when you make your virtualenv. You simply need to do this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkvirtualenv -p /path/to/some/python coolname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;ll create a new virtualenv called “coolname” that uses &lt;code&gt;/path/to/some/python&lt;/code&gt; for it&amp;rsquo;s Python interpreter. I&amp;rsquo;ve tested this with &lt;a href=&#34;https://www.pypy.org&#34;&gt;PyPy&lt;/a&gt; and it worked great.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;A recent comment on the &lt;a href=&#34;https://brainsik.net/2011/announcing-virtualenv-burrito&#34;&gt;original Virtualenv Burrito announcement&lt;/a&gt; asked whether it was possible to create virtualenvs using different Python interpreters. The answer is a cautious: &lt;strong&gt;yes&lt;/strong&gt;!&lt;/p&gt;&#xA;&lt;p&gt;When &lt;a href=&#34;https://github.com/brainsik/virtualenv-burrito#readme&#34;&gt;virtualenv-burrito&lt;/a&gt; installs virtualenv, it prevents the &lt;code&gt;virtualenv&lt;/code&gt; command from tying itself to a specific interpreter. I wanted to be able to switch between Python versions, creating virtualenvs for each. I haven&amp;rsquo;t publicized this feature, nor made it easy to use since there may be hidden pitfalls. That said, I&amp;rsquo;ve not run into any problems.&lt;/p&gt;&#xA;&lt;p&gt;The way it works is &lt;code&gt;mkvirtualenv&lt;/code&gt; uses the same interpreter invoked by the &lt;code&gt;python&lt;/code&gt; command to create the virtualenv. For example, normally when I run &lt;code&gt;mkvirtualenv&lt;/code&gt; I get a Python 2.7 environment. Using &lt;a href=&#34;https://www.macports.org&#34;&gt;MacPorts&lt;/a&gt;, I can switch from my 2.7 default to 2.6 with:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;port &lt;span style=&#34;color:#ff7b72&#34;&gt;select&lt;/span&gt; --set python26&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now running &lt;code&gt;mkvirtualenv&lt;/code&gt; creates a 2.6 environment.&lt;/p&gt;&#xA;&lt;p&gt;Regardless of what your current default Python interpreter is, once the virtualenv is made, &lt;em&gt;it stays tied to the Python used during creation&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If you don&amp;rsquo;t have a nice way to switch your default Python, you can still hack it. The key is making the &lt;code&gt;python&lt;/code&gt; command use the interpreter you want.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Elasticfox Forever</title>
      <link>https://brainsik.net/2011/elasticfox-forever/</link>
      <pubDate>Thu, 23 Jun 2011 13:30:00 +0000</pubDate>
      <guid>https://brainsik.net/2011/elasticfox-forever/</guid>
      <description>&lt;p&gt;Tired of (yet again) fixing the &lt;a href=&#34;https://aws.amazon.com/developertools/609&#34;&gt;Elasticfox&lt;/a&gt; Firefox extension to work with the latest version of Mozilla Firefox, I finally just made &lt;a href=&#34;https://dl.dropbox.com/u/2617638/elasticfox-forever.xpi&#34;&gt;one with an absurd maximum version defined&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik-tumblr.theory.org/tumblr_ln8geb7TcX1qa5gs9.jpg&#34; alt=&#34;elastic band&#34; title=&#34;elastic band&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;You can easily create one yourself. Since xpi files are zip files, it&amp;rsquo;s something like:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;mkdir tangerine; cd tangerine&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;unzip /path/to/elasticfox.xpi&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;edit install.rdf so maxVersion is &lt;code&gt;99.0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;zip -r9X ../elasticfox-forever.xpi .&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;drag &lt;code&gt;elasticfox-forever.xpi&lt;/code&gt; onto Firefox&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Or cop out and click this: &lt;a href=&#34;http://dl.dropbox.com/u/2617638/elasticfox-forever.xpi&#34;&gt;elasticfox-forever.xpi&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Update 2011-09-23&lt;/em&gt;: Using &lt;code&gt;*&lt;/code&gt; for the maxVersion still didn&amp;rsquo;t cut it so I&amp;rsquo;ve updated the article and &lt;code&gt;xpi&lt;/code&gt; file to use a maxVersion of &lt;code&gt;99.0&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;small&gt;Image modified from &lt;a href=&#34;https://www.flickr.com/photos/theilr/5428334844&#34;&gt;I&amp;rsquo;m with the band&lt;/a&gt; by &lt;a href=&#34;https://www.flickr.com/photos/theilr/&#34;&gt;theilr&lt;/a&gt;. &lt;a href=&#34;https://creativecommons.org/licenses/by-sa/2.0/deed.en&#34;&gt;CC:by-sa&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>SSH Agent Forwarding</title>
      <link>https://brainsik.net/2011/ssh-agent-forwarding/</link>
      <pubDate>Mon, 13 Jun 2011 13:31:07 +0000</pubDate>
      <guid>https://brainsik.net/2011/ssh-agent-forwarding/</guid>
      <description>&lt;p&gt;&lt;em&gt;This is part of the mini-series &lt;a href=&#34;https://brainsik.net/2011/ssh-for-devs&#34;&gt;OpenSSH for Devs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;SSH agent forwarding let&amp;rsquo;s you lock down remote hosts while making them easier to access and use in automated ways. One co-worker succinctly describes agent forwarding as “the shit”.&lt;/p&gt;&#xA;&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;&#xA;&lt;p&gt;Securely connect to a remote host from a remote host without a password.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;laptop:~$ ssh -A host1.example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;Linux host1 2.6.35-25-server #44-Ubuntu SMP Fri Jan 21 19:09:14 UTC 2011 x86_64 GNU/Linux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f85149&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;host1:~$ scp host2.example.com:some.config .&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;some.config                                                       100% 1612     1.6KB/s   00:00&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;host1:~$ logout&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;Connection to host1.example.com closed.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;secret-agent&#34;&gt;Secret Agent&lt;/h2&gt;&#xA;&lt;p&gt;The SSH agent has become so integrated into our local systems many people don&amp;rsquo;t realize it&amp;rsquo;s being used. Devs use it daily to avoid having to retype their SSH key&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; password every time they connect to a remote host. The typical workflow is:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Login to laptop&lt;/li&gt;&#xA;&lt;li&gt;SSH to a remote host&lt;/li&gt;&#xA;&lt;li&gt;Type SSH key password into popup&lt;/li&gt;&#xA;&lt;li&gt;No more password typing&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik-tumblr.theory.org/tumblr_lgvrapP33n1qa5gs9.png&#34; alt=&#34;OS X SSH keypass dialog&#34; title=&#34;OS X SSH keypass dialog&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;The agent serves us by holding onto our private key and transparently authenticating to remote hosts when we connect instead of making us type a password.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-ssh-agent-forwarding&#34;&gt;What is SSH agent forwarding?&lt;/h2&gt;&#xA;&lt;p&gt;Simply put, agent forwarding allows you to access a remote machine from a remote machine.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s look at the scenario above: connect to host1 and download a file from host2. Without agent forwarding, you&amp;rsquo;re lucky if you just get to type your password again. If host2 has password authentication disabled or your account has no password set, there&amp;rsquo;s two options:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Download the file from host2 to your local machine and then upload it to host1.&lt;/li&gt;&#xA;&lt;li&gt;Upload your SSH &lt;em&gt;private&lt;/em&gt; key to host1 and authenticate to host2 using your key password.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Compare these to agent forwarding where you run &lt;code&gt;scp&lt;/code&gt; and the file is downloaded without question.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;ve run into this problem more than a few times, learning about agent forwarding may feel like this:&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://twitter.com/santiycr/status/38740676288069632&#34; title=&#34;ssh -A is the shit! No more moving private keys around for chained ssh connections!! Thanks @brainsik!&#34;&gt;&lt;img src=&#34;https://brainsik-tumblr.theory.org/tumblr_lgvu1gsRtb1qa5gs9.png&#34; alt=&#34;ssh -A is the shit! No more moving private keys around for chained ssh connections!! Thanks @brainsik!&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;where-can-it-take-you&#34;&gt;Where can it take you?&lt;/h2&gt;&#xA;&lt;p&gt;The SSH agent provides a rare pairing of increased security and better user experience.&lt;/p&gt;&#xA;&lt;p&gt;From a per-host perspective, you can disable password authentication on all your remote machines and rely on SSH keys for superior auth. Leaked passwords are no longer a vector for unauthorized access since you can&amp;rsquo;t login with them. Forget about generating random passwords for every user on every new server. If sudo access isn&amp;rsquo;t needed, don&amp;rsquo;t set a password at all. If sudo access is required you can get away with reusing passwords, keeping your &lt;a href=&#34;https://www.jedi.be/blog/2010/02/12/what-is-this-devops-thing-anyway/&#34;&gt;devops&lt;/a&gt; team &lt;a href=&#34;https://www.startuplessonslearned.com/2008/09/lean-startup.html&#34;&gt;lean&lt;/a&gt;.&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;From a network perspective, you ideally want your private servers only accessible via a &lt;a href=&#34;https://en.wikipedia.org/wiki/Bastion_host&#34;&gt;bastion host&lt;/a&gt; or other intermediary. With agent forwarding, instead of this setup being a pain to get into, it&amp;rsquo;s a single command:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ssh -At public.example.com ssh private1.internal&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Linux private1 2.6.35-25-server #44-Ubuntu SMP Fri Jan 21 19:09:14 UTC 2011 x86_64 GNU/Linux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;private1:~$ logout&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Connection to private1.internal closed.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Connection to public.example.com closed.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;use-it&#34;&gt;Use it&lt;/h2&gt;&#xA;&lt;p&gt;Agent forwarding can be turned on via the command-line by passing &lt;code&gt;-A&lt;/code&gt; or via &lt;a href=&#34;https://brainsik.net/2011/ssh-config&#34;&gt;your SSH config&lt;/a&gt; by setting &lt;code&gt;ForwardAgent yes&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;d be negligent if I didn&amp;rsquo;t recommend setting this &lt;em&gt;only&lt;/em&gt; for hosts you trust. While it&amp;rsquo;s not possible to steal a private key through an agent, it&amp;rsquo;s trivial for a malicious &lt;strong&gt;root&lt;/strong&gt; user to login to remote hosts with your public key.&lt;/p&gt;&#xA;&lt;p&gt;Is there another way you use SSH agent forwarding? You should post a comment or &lt;a href=&#34;https://twitter.com/brainsik&#34;&gt;send me a message&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;This article assumes you already use an &lt;strong&gt;SSH key&lt;/strong&gt; to access remote hosts. If you don&amp;rsquo;t, &lt;a href=&#34;https://twitter.com/brainsik&#34;&gt;send me a note&lt;/a&gt;. If I get enough questions about SSH keys, I&amp;rsquo;ll do a writeup on them.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Some systems aren&amp;rsquo;t setup with an askpass program and the agent running in the background. In those cases, some devs will generate their SSH private key without a password to get the effect of not needing to type in their password for every SSH connection they make. Regardless of the security implications, that setup loses a beneficial feature of SSH: agent forwarding!&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Buzzwords aside, having to search for a password randomly generated 2 months ago before getting on with your task is sure way to &lt;a href=&#34;https://paulgraham.com/head.html&#34;&gt;wipe stored state&lt;/a&gt; and kill a task&amp;rsquo;s momentum.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>SSH Config</title>
      <link>https://brainsik.net/2011/ssh-config/</link>
      <pubDate>Tue, 07 Jun 2011 13:30:06 +0000</pubDate>
      <guid>https://brainsik.net/2011/ssh-config/</guid>
      <description>&lt;p&gt;&lt;em&gt;This is part of the mini-series &lt;a href=&#34;https://brainsik.net/2011/ssh-for-devs&#34;&gt;OpenSSH for Devs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;An SSH config let&amp;rsquo;s you set options you use often (e.g., the user to login as or the port to connect to) globally or per-host. It can save a lot of typing and helps make SSH Just Work.&lt;/p&gt;&#xA;&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;&#xA;&lt;p&gt;Instead of typing:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;ssh -p734 teamaster@sencha.example.com&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;You can type:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;ssh sencha&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;By having this in your &lt;code&gt;~/.ssh/config&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;Host sencha&#xA;    HostName sencha.example.com&#xA;    Port 734&#xA;    User teamaster&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;whats-a-per-user-ssh-config&#34;&gt;What&amp;rsquo;s a per-user SSH config?&lt;/h2&gt;&#xA;&lt;p&gt;In your home is a &lt;code&gt;.ssh&lt;/code&gt; directory. This is where your SSH keypair and &lt;code&gt;known_hosts&lt;/code&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; files are. This directory is not made of unicorns. Create a file named &lt;code&gt;config&lt;/code&gt; and your SSH tools&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; will use it&amp;rsquo;s settings.&lt;/p&gt;&#xA;&lt;p&gt;If your laptop username is different than the one on your remote hosts, create it with:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;User jon.postel&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;If you use a non-standard SSH port to avoid the bots, create it with:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;Port 22022&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Have different settings for different hosts? No problem. Just keep in mind the first match wins and put specific settings &lt;em&gt;before&lt;/em&gt; generic ones:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# ancient box we never upgraded&#xA;Host host1.example.com&#xA;    User oldusername&#xA;    # still on port 22&#xA;&#xA;Host *.example.com&#xA;    Port 22022&#xA;    ForwardAgent yes&#xA;&#xA;# defaults for all hosts&#xA;Host *&#xA;    User bofh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;it-gets-better&#34;&gt;It gets better&lt;/h2&gt;&#xA;&lt;p&gt;You&amp;rsquo;re probably familiar with the dance you do when connecting to a host for the first time:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ssh host1.example.com&#xA;The authenticity of host &#39;host1.example.com (192.0.2.101)&#39; can&#39;t be established.&#xA;RSA key fingerprint is 39:9b:de:ad:9e:be:ef:95:ca:fe:1b:53:b0:00:00:b5.&#xA;Are you sure you want to continue connecting (yes/no)?&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;It looks impressive, but it&amp;rsquo;s worthless. If you&amp;rsquo;re worried about &lt;a href=&#34;http://www.monkey.org/~dugsong/dsniff/&#34;&gt;man-in-the-middle attacks&lt;/a&gt;, there are &lt;em&gt;much&lt;/em&gt; better things to do. Start by disabling password authentication&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; and require people to have an SSH key on the server. Expecting people to check these hashes means you&amp;rsquo;ve already failed.&lt;/p&gt;&#xA;&lt;p&gt;To get rid of the dance add something like:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;Host *.compute-1.amazonaws.com&#xA;    StrictHostKeyChecking no&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;First time connections will give you a warning, but you&amp;rsquo;ll make it in.&lt;/p&gt;&#xA;&lt;h2 id=&#34;aliases&#34;&gt;Aliases&lt;/h2&gt;&#xA;&lt;p&gt;You can create aliases&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; by using &lt;strong&gt;Host&lt;/strong&gt; to match a name and &lt;strong&gt;HostName&lt;/strong&gt; to say where to connect.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;Host web1&#xA;    HostName ec2-192-0-2-42.compute-1.amazonaws.com&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;The advantages over modifying &lt;code&gt;/etc/hosts&lt;/code&gt; are you don&amp;rsquo;t need to be root and SSH will use the same host key for web1 and ec2-192-0-2-42.compute-1.amazonaws.com. The disadvantage is that only SSH tools see this. For example, your browser has no idea web1 is an alias for that EC2 host. Because of this, I sometimes create both the SSH alias and hosts entry for the best of both worlds.&lt;/p&gt;&#xA;&lt;h2 id=&#34;options&#34;&gt;Options&lt;/h2&gt;&#xA;&lt;p&gt;There are &lt;a href=&#34;http://www.openbsd.org/cgi-bin/man.cgi?query=ssh_config&#34;&gt;a lot of options&lt;/a&gt;, but these are the ones I&amp;rsquo;ve seen used most:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Host&lt;/strong&gt; — Matches the hostname argument. Accepts &lt;a href=&#34;http://man-wiki.net/index.php/5:ssh_config#PATTERNS&#34;&gt;patterns&lt;/a&gt; and causes options following it to apply only to hosts matching the pattern.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;User&lt;/strong&gt; — Username to connect with.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Port&lt;/strong&gt; — Port to connect to.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;ForwardAgent&lt;/strong&gt; — Set to &lt;code&gt;yes&lt;/code&gt; to turn on &lt;a href=&#34;https://brainsik.net/2011/ssh-agent-forwarding&#34;&gt;SSH agent forwarding&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;StrictHostKeyChecking&lt;/strong&gt; — Set to &lt;code&gt;no&lt;/code&gt; to skip the “authenticity of host” dance.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;HostName&lt;/strong&gt; — Server to connect to. Used to create an alias from &lt;strong&gt;Host&lt;/strong&gt; to another remote server.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Do you have a favorite option not mentioned here? You should post a comment or &lt;a href=&#34;https://twitter.com/brainsik&#34;&gt;send me a message&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;The &lt;code&gt;known_hosts&lt;/code&gt; file contains the keys for all the remote hosts you&amp;rsquo;ve connected to. The stored key is compared to the remote key when you connect to warn of a &lt;a href=&#34;https://en.wikipedia.org/wiki/Man-in-the-middle_attack#Example_of_an_attack&#34;&gt;man-in-the-middle attack&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;&lt;code&gt;ssh&lt;/code&gt;, &lt;code&gt;scp&lt;/code&gt;, &lt;code&gt;sftp&lt;/code&gt;, &lt;a href=&#34;https://github.com/libfuse/sshfs&#34;&gt;&lt;code&gt;sshfs&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://docs.paramiko.org/en/stable/api/config.html#paramiko.config.SSHConfig&#34;&gt;well-written paramiko&lt;/a&gt; based Python tools, and probably more.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;In the server&amp;rsquo;s &lt;code&gt;sshd_config&lt;/code&gt; set &lt;code&gt;PasswordAuthentication no&lt;/code&gt;. &lt;a href=&#34;https://twitter.com/brainsik&#34;&gt;Contact me if you are interested in a post on securing the SSH server&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;I made this term up. There may be a better one.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>OpenSSH for Devs</title>
      <link>https://brainsik.net/2011/ssh-for-devs/</link>
      <pubDate>Tue, 07 Jun 2011 01:51:00 +0000</pubDate>
      <guid>https://brainsik.net/2011/ssh-for-devs/</guid>
      <description>&lt;p&gt;There have been many surprises as I&amp;rsquo;ve moved from Sysadmin to Coder. Some of them are a product of switching contexts: what was once “common knowledge” is now “tips &amp;amp; tricks” (and vice versa). One tool that has regularly come up is SSH. It can be painful to watch developers jump through unnecessary hoops (over and over again) in order to access remote hosts.&lt;/p&gt;&#xA;&lt;p&gt;In that light, presented here is a short series of posts covering useful OpenSSH features for developers. My peers and I use these everyday and it&amp;rsquo;s made our jobs easier.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://brainsik.net/2011/ssh-config&#34;&gt;SSH Config&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://brainsik.net/2011/ssh-agent-forwarding&#34;&gt;SSH Agent Forwarding&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;SSH Tunnels &lt;em&gt;(… some day …)&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>Brewer&#39;s CAP Theorem</title>
      <link>https://brainsik.net/2011/brewers-cap-theorem/</link>
      <pubDate>Thu, 26 May 2011 15:21:00 +0000</pubDate>
      <guid>https://brainsik.net/2011/brewers-cap-theorem/</guid>
      <description>&lt;p&gt;Starting with the punk rock creation story,&#xA;&lt;a href=&#34;https://www.julianbrowne.com/article/brewers-cap-theorem&#34;&gt;Brewer&amp;rsquo;s CAP Theorem&lt;/a&gt;&#xA;discusses the fascinating, &lt;em&gt;proven&lt;/em&gt; theorem that you can&amp;rsquo;t have all three of&#xA;consistency, availability, and partition-tolerance in a distributed system.&lt;/p&gt;&#xA;&lt;p&gt;A very interesting follow-up is:&#xA;&lt;a href=&#34;https://guysblogspot.blogspot.com/2008/09/cap-solution-proving-brewer-wrong.html&#34;&gt;A CAP Solution (Proving Brewer Wrong)&lt;/a&gt;.&#xA;It approaches the problem by dynamically guaranteeing different CAP properties&#xA;instead of trying to guarantee them all at once.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Released Virtualenv Burrito 2</title>
      <link>https://brainsik.net/2011/released-virtualenv-burrito-2/</link>
      <pubDate>Mon, 23 May 2011 13:30:00 +0000</pubDate>
      <guid>https://brainsik.net/2011/released-virtualenv-burrito-2/</guid>
      <description>&lt;p&gt;This Python breakfast just got tastier. A major update to the way Virtualenv Burrito works was released this weekend. There is now full support for extension points and a less hackish way of managing the packages&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; under the hood.&lt;/p&gt;&#xA;&lt;p&gt;Already have Virtualenv Burrito installed? Run this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virtualenv-burrito upgrade&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;New to Virtualenv Burrito? &lt;a href=&#34;https://github.com/brainsik/virtualenv-burrito#readme&#34;&gt;Read about it&lt;/a&gt; or run this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sL https://raw.githubusercontent.com/brainsik/virtualenv-burrito/master/virtualenv-burrito.sh | &lt;span style=&#34;color:#79c0ff&#34;&gt;$SHELL&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Virtualenv Burrito&amp;rsquo;s goal is to have a working virtualenv + virtualenvwrapper environment with just one command. &lt;a href=&#34;https://github.com/brainsik/virtualenv-burrito#readme&#34;&gt;Read about it on Github&lt;/a&gt; or &lt;a href=&#34;https://brainsik.net/2011/announcing-virtualenv-burrito&#34;&gt;see the original announcement&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://pypi.org/project/distribute/&#34;&gt;distribute&lt;/a&gt;, &lt;a href=&#34;https://pypi.org/project/virtualenv/&#34;&gt;virtualenv&lt;/a&gt;, and &lt;a href=&#34;https://pypi.org/project/virtualenvwrapper/&#34;&gt;virtualenvwrapper&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Announcing Virtualenv Burrito</title>
      <link>https://brainsik.net/2011/announcing-virtualenv-burrito/</link>
      <pubDate>Mon, 21 Mar 2011 13:30:00 +0000</pubDate>
      <guid>https://brainsik.net/2011/announcing-virtualenv-burrito/</guid>
      <description>&lt;p&gt;Over the weekend I finished&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; a tool called &lt;a href=&#34;https://github.com/brainsik/virtualenv-burrito&#34;&gt;Virtualenv Burrito&lt;/a&gt;. It&amp;rsquo;s goal was to be a single command which would setup &lt;a href=&#34;http://pypi.python.org/pypi/virtualenv&#34;&gt;Virtualenv&lt;/a&gt; and &lt;a href=&#34;http://pypi.python.org/pypi/virtualenvwrapper&#34;&gt;Virtualenvwrapper&lt;/a&gt; so you could start hacking on Python projects as quickly as possible. As a bonus, it installs the &lt;code&gt;virtualenv-burrito&lt;/code&gt; command which will upgrade those packages to the latest versions I&amp;rsquo;ve tested.&lt;/p&gt;&#xA;&lt;p&gt;Virtualenv Burrito was inspired by &lt;a href=&#34;http://us.pycon.org/2011/sprints/&#34;&gt;Pycon sprinters&lt;/a&gt; wasting precious time setting up virtual environments instead of sprinting. For many people, it&amp;rsquo;s sadly complicated to get a virtualenv + virtualenvwrapper environment. The worst part, it&amp;rsquo;s almost always yak shaving in the way of a real goal.&lt;/p&gt;&#xA;&lt;p&gt;No more! To have a working virtualenv + virtualenvwrapper environment, run this command&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -s https://raw.github.com/brainsik/virtualenv-burrito/master/virtualenv-burrito.sh | &lt;span style=&#34;color:#79c0ff&#34;&gt;$SHELL&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. Whenever you login, you&amp;rsquo;ll have &lt;a href=&#34;http://www.doughellmann.com/docs/virtualenvwrapper/command_ref.html&#34;&gt;the full arsenal of virtualenvwrapper commands&lt;/a&gt; at your disposal.&lt;/p&gt;&#xA;&lt;h2 id=&#34;virtualenv-quickstart&#34;&gt;Virtualenv quickstart&lt;/h2&gt;&#xA;&lt;p&gt;Create a new virtualenv:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkvirtualenv newname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once activated, &lt;code&gt;pip install&lt;/code&gt; (&lt;em&gt;without&lt;/em&gt; using sudo) whichever Python packages&#xA;you want. They&amp;rsquo;ll only be available in that virtualenv. Make as many virtualenvs&#xA;as you like.&lt;/p&gt;&#xA;&lt;p&gt;To switch to another virtualenv you&amp;rsquo;ve created:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;workon othername&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;upgrade&#34;&gt;Upgrade&lt;/h2&gt;&#xA;&lt;p&gt;To get the latest tested virtualenv + virtualenvwrapper packages:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virtualenv-burrito upgrade&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;credits&#34;&gt;Credits&lt;/h2&gt;&#xA;&lt;p&gt;The real hard work is done by the creators of &lt;a href=&#34;http://www.virtualenv.org/&#34;&gt;Virtualenv&lt;/a&gt; and &lt;a href=&#34;http://www.doughellmann.com/projects/virtualenvwrapper/&#34;&gt;Virtualenvwrapper&lt;/a&gt;. Virtualenv is maintained by &lt;a href=&#34;http://ianbicking.org/&#34;&gt;Ian Bicking&lt;/a&gt;. Virtualenvwrapper is maintained by &lt;a href=&#34;http://www.doughellmann.com/&#34;&gt;Doug Hellman&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;For this release, &lt;a href=&#34;https://www.doughellmann.com/docs/virtualenvwrapper/plugins.html#extension-points&#34;&gt;extension points&lt;/a&gt; (e.g., postactivate) are not supported. While this doesn&amp;rsquo;t affect the project goal of getting people coding quickly, it&amp;rsquo;s a cool feature, and (more importantly) I need it for work. 🙂 I&amp;rsquo;ll be adding support soon and making it available via &lt;code&gt;virtualenv-burrito upgrade&lt;/code&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Truth be told, I think piping the web into your shell is insane. Be safe, and &lt;a href=&#34;https://github.com/brainsik/virtualenv-burrito/blob/master/virtualenv-burrito.sh&#34;&gt;read the code&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Adam Simpson&#39;s 2011 BAFTA illustrations</title>
      <link>https://brainsik.net/2011/adam-simpsons-2011-bafta-illustrations/</link>
      <pubDate>Mon, 21 Feb 2011 21:23:00 +0000</pubDate>
      <guid>https://brainsik.net/2011/adam-simpsons-2011-bafta-illustrations/</guid>
      <description>&lt;p&gt;See &lt;a href=&#34;http://www.adsimpson.com/Bafta-Awards-Best-Film-artworks&#34;&gt;Adam Simpson&amp;rsquo;s 2011 BAFTA illustrations&lt;/a&gt; for the 5 Best Film nominees.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-pub/adam_simpson_bafta_illustrations.jpg&#34; alt=&#34;Adam Simpson&amp;rsquo;s 2011 BAFTA illustrations&#34; title=&#34;Adam Simpson&#39;s 2011 BAFTA illustrations&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Also see his gorgeous &lt;a href=&#34;http://www.adsimpson.com/Bafta-Awards-Mask-artwork&#34;&gt;BAFTA mask illustration&lt;/a&gt;&#xA;used for the tickets.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-pub/adam_simpson_bafta_mask.jpg&#34; alt=&#34;Adam Simpson&amp;rsquo;s BAFTA mask illustration&#34; title=&#34;Adam Simpson&#39;s BAFTA mask illustration&#34;&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Latent Figure Protocol</title>
      <link>https://brainsik.net/2011/latent-figure-protocol/</link>
      <pubDate>Mon, 14 Feb 2011 17:00:06 +0000</pubDate>
      <guid>https://brainsik.net/2011/latent-figure-protocol/</guid>
      <description>&lt;p&gt;Paul Vanoue&amp;rsquo;s &lt;a href=&#34;http://sciencegallery.com/visceral/latent-figure-protocol&#34;&gt;Latent Figure Protocol&lt;/a&gt;&#xA;“utilizes known sequences in online [DNA] databases to produce&#xA;‘planned’ images” of ☠ and ©.” Fantastic work!&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Bomb crater swimming pools</title>
      <link>https://brainsik.net/2011/bomb-crater-swimming-pools/</link>
      <pubDate>Mon, 14 Feb 2011 00:28:00 +0000</pubDate>
      <guid>https://brainsik.net/2011/bomb-crater-swimming-pools/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://pruned.blogspot.com/2011/02/bomb-crater-swimming-pools.html&#34;&gt;Bomb crater swimming pools&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A trained civil engineer, he then turned the hole into a kidney-shaped&#xA;swimming pool, flourished with a fine biomorphic indentation.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</description>
    </item>
    <item>
      <title>Carniverous furniture</title>
      <link>https://brainsik.net/2011/carniverous-furniture/</link>
      <pubDate>Mon, 14 Feb 2011 00:27:00 +0000</pubDate>
      <guid>https://brainsik.net/2011/carniverous-furniture/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://pruned.blogspot.com/2011/01/carnivorous-domestic-entertainment.html&#34;&gt;Carniverous furniture&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Disturbing and intriguing.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Tools never die. Waddaya mean, never?</title>
      <link>https://brainsik.net/2011/tools-never-die-waddaya-mean-never/</link>
      <pubDate>Sun, 13 Feb 2011 20:26:00 +0000</pubDate>
      <guid>https://brainsik.net/2011/tools-never-die-waddaya-mean-never/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.npr.org/blogs/krulwich/2011/02/04/133188723/tools-never-die-waddaya-mean-never&#34;&gt;Tools never die. Waddaya mean, never?&lt;/a&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>My neutrophils can kick your white blood cells&#39; butt</title>
      <link>https://brainsik.net/2011/my-neutrophils-can-kick-your-white-blood-cells-butt/</link>
      <pubDate>Sun, 13 Feb 2011 20:25:00 +0000</pubDate>
      <guid>https://brainsik.net/2011/my-neutrophils-can-kick-your-white-blood-cells-butt/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.npr.org/blogs/health/2011/02/11/133655669/my-neutrophils-can-kick-your-white-blood-cells-butt&#34;&gt;My neutrophils can kick your white blood cells&amp;rsquo; butt&lt;/a&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Autoinstall Ubuntu servers with a CD</title>
      <link>https://brainsik.net/2011/autoinstall-ubuntu-via-cd/</link>
      <pubDate>Thu, 03 Feb 2011 17:47:00 +0000</pubDate>
      <guid>https://brainsik.net/2011/autoinstall-ubuntu-via-cd/</guid>
      <description>&lt;p&gt;Although it&amp;rsquo;s been a few years since I switched from full-time Sysadmin to full-time Coder, being in a startup means getting &lt;a href=&#34;http://en.wikipedia.org/wiki/Bastard_Operator_From_Hell&#34;&gt;saddled with an opsy task&lt;/a&gt; now and again regardless of your “title”.&lt;/p&gt;&#xA;&lt;p&gt;The problem: We bought a bunch of servers which need minimal OS, IP and a hostname before they&amp;rsquo;re racked. In otherwords, we want to drop them in a datacenter, turn them on, and leave knowing there&amp;rsquo;s remote SSH access. Data centers are environmentally hostile (hot rows, cold rows, too loud). It&amp;rsquo;s ideal to get in and out as quickly as possible and do any remaining config while &lt;a href=&#34;http://www.last.fm/user/brainsik&#34;&gt;listening to music&lt;/a&gt; and &lt;a href=&#34;http://redblossomtea.com/&#34;&gt;having a cup of tea&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The solution: An &lt;a href=&#34;https://help.ubuntu.com/10.10/installation-guide/amd64/appendix-preseed.html&#34;&gt;automated Ubuntu install using &lt;em&gt;preseeding&lt;/em&gt;&lt;/a&gt;. One goal is to get a solution setup as quickly as possible. We don&amp;rsquo;t have 100s or 1000s of servers that need install, but we don&amp;rsquo;t want to setup temporary network infrastructure, and we don&amp;rsquo;t want all the developers (there&amp;rsquo;s not many) sitting around hitting &lt;code&gt;&amp;lt;enter&amp;gt;&lt;/code&gt; every few minutes. In my past life I may have gone for &lt;a href=&#34;http://en.wikipedia.org/wiki/Network_booting&#34;&gt;netbooting&lt;/a&gt; and a DHCP server handing out the IPs and hostnames, but this life lead to the shorter road of burning an Ubuntu Server disc with &lt;a href=&#34;https://help.ubuntu.com/10.10/installation-guide/amd64/preseed-creating.html&#34;&gt;a preseed file&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;configuring-the-disc-image&#34;&gt;Configuring the disc image&lt;/h2&gt;&#xA;&lt;p&gt;Open an existing &lt;a href=&#34;http://www.ubuntu.com/server/get-ubuntu/download&#34;&gt;Ubuntu Server image&lt;/a&gt; and copy it&amp;rsquo;s contents somewhere. I used &lt;code&gt;rsync -a&lt;/code&gt; to copy the image volume to my drive. This directory is the contents of the &lt;em&gt;new&lt;/em&gt; disc image. All that&amp;rsquo;s needed is a preseed file and modifying the boot config to load it.&lt;/p&gt;&#xA;&lt;h3 id=&#34;creating-a-seed-file&#34;&gt;Creating a seed file&lt;/h3&gt;&#xA;&lt;p&gt;Start with &lt;a href=&#34;https://help.ubuntu.com/10.10/installation-guide/example-preseed.txt&#34;&gt;the example Maverick preseed file&lt;/a&gt;. The comments are good so you can get most of the way just going through it. However, I ended up in a short trial and error process to get it fully baked.&lt;/p&gt;&#xA;&lt;h4 id=&#34;gotcha-1-lvm-partitioning&#34;&gt;Gotcha 1: LVM partitioning&lt;/h4&gt;&#xA;&lt;p&gt;During LVM partitioning, the install got stuck while waiting for confirmation on “Write the changes to disk and configure LVM?”:&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik-tumblr.theory.org/tumblr_lg16dvXBxX1qa5gs9.png&#34; alt=&#34;LVM confirmation dialog&#34; title=&#34;LVM confirmation dialog&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Set this undocumented (AFAICT) option:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;d-i partman-lvm/confirm_nooverwrite boolean true&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;gotcha-2-apt-security-update-from-the-network&#34;&gt;Gotcha 2: Apt security update from the network&lt;/h4&gt;&#xA;&lt;p&gt;Althought this doesn&amp;rsquo;t stop the install, it takes a while for Apt to give up trying to contact the host. To keep things speedy, disable it by setting a null security repo host:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;d-i apt-setup/security_host string&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;bonus-setup-the-aptsourceslist&#34;&gt;Bonus: Setup the apt/sources.list&lt;/h4&gt;&#xA;&lt;p&gt;With all the Apt repositories disabled, no useful lines are added to &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;. This doesn&amp;rsquo;t matter too much if next you&amp;rsquo;ll be running an install script on the box (fix the sources.list in the script), but if not, it&amp;rsquo;s an annoying yak you&amp;rsquo;ll shave when you want to upgrade or install a package. Regardless, it&amp;rsquo;s so easy to make it right, you might as well:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;d-i preseed/late_command string echo &amp;#39;deb http://us.archive.ubuntu.com/ubuntu/ maverick main restricted universe multiverse&amp;#39; &amp;gt;&amp;gt; /target/etc/apt/sources.list; echo &amp;#39;deb http://us.archive.ubuntu.com/ubuntu/ maverick-updates main restricted universe multiverse&amp;#39; &amp;gt;&amp;gt; /target/etc/apt/sources.list; echo &amp;#39;deb http://security.ubuntu.com/ubuntu maverick-security main restricted universe multiverse&amp;#39; &amp;gt;&amp;gt; /target/etc/apt/sources.list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Your preseed config is done so save it to &lt;code&gt;preseed/local.seed&lt;/code&gt; (or whatever/wherever) in the directory you made.&lt;/p&gt;&#xA;&lt;h3 id=&#34;modifying-the-boot-config&#34;&gt;Modifying the boot config&lt;/h3&gt;&#xA;&lt;p&gt;To make the CD use your seed on boot, &lt;a href=&#34;https://help.ubuntu.com/community/InstallCDCustomization#Modify%20installer%20behaviour%20using%20a%20Preseed%20file&#34;&gt;modify &lt;code&gt;isolinux/isolinux.cfg&lt;/code&gt;&lt;/a&gt; to timeout quick and use the file you saved. Mine looks like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# D-I config version 2.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;include menu.cfg&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;default autoinstall&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;prompt 0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;timeout 1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ui gfxboot bootlogo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LABEL autoinstall&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  menu label ^Minimal autoinstall&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  kernel /install/vmlinuz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  append preseed/file=/cdrom/preseed/local.seed debian-installer/locale=en_US console-setup/layoutcode=us localechooser/translation/warn-light=true localechooser/translation/warn-severe=true initrd=/install/initrd.gz ramdisk_size=16384 root=/dev/ram rw quiet --&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;creating-the-disc-image&#34;&gt;Creating the disc image&lt;/h2&gt;&#xA;&lt;p&gt;To make a bootable ISO you&amp;rsquo;ll need &lt;strong&gt;mkisofs&lt;/strong&gt;. If you&amp;rsquo;re on Mac OS X (like me) you can &lt;a href=&#34;http://www.macports.org/install.php&#34;&gt;use MacPorts&lt;/a&gt; — &lt;code&gt;sudo port install cdrtools&lt;/code&gt; — or the &lt;a href=&#34;http://mxcl.github.com/homebrew/&#34;&gt;hipster package manager&lt;/a&gt; &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, Homebrew. Once you have the tool you need, just &lt;a href=&#34;https://help.ubuntu.com/community/InstallCDCustomization#Burning%20the%20CD&#34;&gt;follow this command-line&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkisofs -r -V &lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#39;Ubuntu Autoinstaller&amp;#39;&lt;/span&gt; -cache-inodes -J -l &lt;span style=&#34;color:#79c0ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    -b isolinux/isolinux.bin -c isolinux/boot.cat &lt;span style=&#34;color:#79c0ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    -no-emul-boot -boot-load-size &lt;span style=&#34;color:#a5d6ff&#34;&gt;4&lt;/span&gt; -boot-info-table &lt;span style=&#34;color:#79c0ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    -o custom_ubuntu_autoinstaller.iso /path/to/your/files&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And … your done. Use &lt;a href=&#34;http://www.virtualbox.org/&#34;&gt;Virtualbox&lt;/a&gt; to test the boot image and tweak the preseed file to make it do what you want. Don&amp;rsquo;t forget to re-run the &lt;code&gt;mkisofs&lt;/code&gt; command whenver you change the seed or &lt;code&gt;isolinux.cfg&lt;/code&gt; files!&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Just kidding. I&amp;rsquo;m a fan of &lt;a href=&#34;https://github.com/mxcl/&#34;&gt;mxcl&amp;rsquo;s projects&lt;/a&gt;. &lt;a href=&#34;https://github.com/mxcl/Audioscrobbler.app&#34;&gt;Got Audioscrobbler.app&lt;/a&gt; running right now!&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Apple, Flash, and Bullshit</title>
      <link>https://brainsik.net/2010/apple-flash-and-bullshit/</link>
      <pubDate>Sun, 31 Jan 2010 18:26:17 +0000</pubDate>
      <guid>https://brainsik.net/2010/apple-flash-and-bullshit/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;On Jan 30, 2010, at 11:58 PM, Your Friend wrote:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Just a quick little snippet from an apple town hall that rings true to me — whenever [my wife]&amp;rsquo;s CPU goes crazy and starts overheating it&amp;rsquo;s because of a website w/ flash content…&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;As for Adobe, Jobs said they are lazy and Jobs blames Adobe for a buggy implementation of Flash on the Mac as one of the reasons they won&amp;rsquo;t support it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Apple does not support Flash because it is so buggy, he says. Whenever a Mac crashes more often than not it&amp;rsquo;s because of Flash. No one will be using Flash, he says. The world is moving to HTML5.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Those comments are bullshit.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;em&gt;Regarding speed&lt;/em&gt; — Flash now supports hardware acceleration, but Windows is the only OS with hooks for it. Video would be much much quicker if it could use the Mac&amp;rsquo;s hardware acceleration. Counterargument is Apple should be allowed full control of their hardware and not have to expose access to it, but I don&amp;rsquo;t buy it. How do games access the video chip?&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Regarding bugginess&lt;/em&gt; — Chrome and the current Safari are architected such that if a plug-in crashes, the whole browser does not go down. Firefox will eventually be like this too. Arguing Flash can cause a Mac to crash just makes the Mac sound poorly architected, and &lt;a href=&#34;http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man3/sandbox_init.3.html&#34; title=&#34;sandbox_init manpage&#34;&gt;it&amp;rsquo;s not&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;There &lt;em&gt;is&lt;/em&gt; a reasonable story I&amp;rsquo;ve read for not supporting Flash (or any popular third party plug-in): the desire for more agile control over the OS. For example, Apple is moving to &lt;a href=&#34;http://www.apple.com/macosx/technology/#sixtyfourbit&#34;&gt;an entirely 64 bit OS&lt;/a&gt;, but Flash is only 32 bit. This means in order to ship a 64 bit Safari they had to write a sandboxed plug-in system that 32 bit apps could run in.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; However, they &lt;em&gt;really&lt;/em&gt; don&amp;rsquo;t want to deal with this crap on iPhone OS. Imagine if they want to support a different mobile processor architecture? They want to compile and go, not have to wait for some other company to port their ware.&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s &lt;a href=&#34;http://daringfireball.net/2010/01/apple_adobe_flash&#34; title=&#34;Apple, Adobe, and Flash&#34;&gt;a pretty good article that covers much of this&lt;/a&gt; by pro-Apple&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; John Gruber.&lt;/p&gt;&#xA;&lt;p&gt;But let&amp;rsquo;s focus on the statement about the future:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;No one will be using Flash, he says. The world is moving to HTML5.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Jobs is referring to the HTML5 &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; tag. This gives a simple, non-Flash based way for browsers to know when to show video. Earlier drafts of &lt;a href=&#34;http://www.bluishcoder.co.nz/2007/12/video-element-and-ogg-theora.html&#34; title=&#34;Video Element and Ogg Theora &#34;&gt;HTML5 also specified using Ogg Theora&lt;/a&gt; as the video codec. &lt;a href=&#34;http://en.wikipedia.org/wiki/Theora&#34;&gt;Theora&lt;/a&gt; provides a patent unencumbered, open source implementation anyone can use. Basically, in 2007 HTML5 solved the problem of how everyone could watch video on the web without all the problems Flash brings. But Theora was pulled out of the spec in large part due to Apple (and Nokia) &lt;a href=&#34;http://xiph.org/press/2007/w3c/&#34; title=&#34;Xiph.Org Statement Regarding the HTML5 Draft and the Ogg Codec Set&#34;&gt;weakly arguing about submarine patents&lt;/a&gt;. When it comes down to it, Apple cares far more about media and content control than fast, bug-free video. They&amp;rsquo;re backing a DRM enabled codec over a working web. Performance issues and bugs are a red herring.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Uses of Flash go far beyond just video, but really, video is the main way we experience Flash. If all those embedded videos didn&amp;rsquo;t suck up all that processing power, there would probably be a lot less complaining.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;One could argue this was a good thing do, regardless.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Fanboy 🙂.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>EtherPad to Shut Down After Google Acquisition</title>
      <link>https://brainsik.net/2009/etherpad-to-shut-down-after-google-acquisition/</link>
      <pubDate>Fri, 04 Dec 2009 21:00:54 +0000</pubDate>
      <guid>https://brainsik.net/2009/etherpad-to-shut-down-after-google-acquisition/</guid>
      <description>&lt;p&gt;Via Daring Fireball: &lt;a href=&#34;http://daringfireball.net/linked/2009/12/04/etherpad&#34;&gt;EtherPad to Shut Down After Google Acquisition of Parent Company AppJet&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Sad. I just discovered &lt;a href=&#34;http://etherpad.com/&#34;&gt;EtherPad&lt;/a&gt; and one of my favorite things is its ad-hoc nature. Want to start collaborating on a document right now? Just go to the site, start a new pad, and pass around the URL. You could even &lt;a href=&#34;http://etherpad.com/ep/pad/create?padId=ThisWasSwell&#34;&gt;make up the URL path&lt;/a&gt; ahead of time! No account is required; it Just Works.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Contrast this with Google Wave where I need to be signed into my account, everyone I want to share with must have a Google account, those accounts need to be in my contacts, etc.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; The risk is losing the momentum and the moment. It&amp;rsquo;d be faster and easier to jump onto an open wiki.&lt;/p&gt;&#xA;&lt;p&gt;Is my weight on a quick &amp;amp; easy ad-hoc solution a geeky, open source enthusiast desire? Maybe I&amp;rsquo;m feeling similar to &lt;a href=&#34;http://zedshaw.com/blog/2009-12-03.html&#34; title=&#34;Opening Up Librelist.com Code, Looking For Volunteers&#34;&gt;the way Zed Shaw is feeling about Google Groups&lt;/a&gt;. Maybe this is part of what we are warned about in &lt;a href=&#34;http://dashes.com/anil/2009/11/the-web-in-danger.html&#34;&gt;The Web in Danger&lt;/a&gt;. At the very least, it makes me feel pretty good about having become a software developer: I can stop bitching and start coding.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Apparently I wasn&amp;rsquo;t the only one who was upset. In response to its user base, &lt;a href=&#34;http://etherpad.com/ep/blog/posts/etherpad-back-online-until-open-sourced&#34;&gt;EtherPad is Back Online Until Open Sourced&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Of course, I&amp;rsquo;m speaking of the free and open portion of EtherPad, as that&amp;rsquo;s what I&amp;rsquo;m interested in.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s just skip the poor “everyone has a Google account” argument.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>When underdogs break the rules</title>
      <link>https://brainsik.net/2009/when-underdogs-break-the-rules/</link>
      <pubDate>Sat, 16 May 2009 10:38:56 +0000</pubDate>
      <guid>https://brainsik.net/2009/when-underdogs-break-the-rules/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.newyorker.com/reporting/2009/05/11/090511fa_fact_gladwell?printable=true&#34;&gt;How David Beats Goliath: When underdogs break the rules&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is a great article about how underdogs can win most of the time when they stray from the accepted rules of engagement. Applicable to just about anything.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Tweenbots</title>
      <link>https://brainsik.net/2009/tweenbots/</link>
      <pubDate>Thu, 23 Apr 2009 09:58:21 +0000</pubDate>
      <guid>https://brainsik.net/2009/tweenbots/</guid>
      <description>&lt;p&gt;I just learned about this project this morning. I like it!&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.tweenbots.com/&#34; title=&#34;tweenbots&#34;&gt;http://www.tweenbots.com/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;(I guess this was a good candidate for my first twitter tweet.)&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>This is the NYPD</title>
      <link>https://brainsik.net/2009/this-is-the-nypd/</link>
      <pubDate>Sat, 18 Apr 2009 13:05:55 +0000</pubDate>
      <guid>https://brainsik.net/2009/this-is-the-nypd/</guid>
      <description>&lt;p&gt;More unnecessary force and an illegal arrest. Many officers in the NYPD continue to work out of control and above the law.&lt;/p&gt;&#xA;&lt;p&gt;Check out their use of pepper spray and especially how they deal with a bystander yelling during last week&amp;rsquo;s &lt;a href=&#34;http://cityroom.blogs.nytimes.com/2009/04/10/students-occupy-new-school-building-again/&#34; title=&#34;Police Arrest 22 at New School Building&#34;&gt;New School building occupation&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If you were living under a rock last year, here is the video of &lt;a href=&#34;http://gothamist.com/2008/07/29/cyclist_thrown_from_bike_by_cop_is.php&#34; title=&#34;NYPD Investigates Cop Videotaped Throwing Cyclist Off Bike&#34;&gt;a bicyclist being thrown from his bike&lt;/a&gt; that got &lt;a href=&#34;http://www.nytimes.com/2008/07/29/nyregion/29critical.html&#34; title=&#34;Officer Investigated in Toppling of Cyclist&#34;&gt;mainstream media coverage&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/oUkiyBVytRQ&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Stewart Brand on Gavin Newsom&#39;s sustainable cities talk</title>
      <link>https://brainsik.net/2009/stewart-brand-on-gavin-newsoms-sustainable-cities-talk/</link>
      <pubDate>Thu, 09 Apr 2009 12:34:02 +0000</pubDate>
      <guid>https://brainsik.net/2009/stewart-brand-on-gavin-newsoms-sustainable-cities-talk/</guid>
      <description>&lt;p&gt;San Francisco Mayor Gavin Newsom gave a seminar for &lt;a href=&#34;http://www.longnow.org/&#34;&gt;The Long Now Foundation&lt;/a&gt; entitled “Cities and Time”. If you live in San Francisco or are interested in Cities going “Green”, check out &lt;a href=&#34;http://sb.longnow.org/&#34;&gt;Stewart Brand&lt;/a&gt;‘s summary of the talk: &lt;a href=&#34;http://blog.longnow.org/2009/04/09/mayor-gavin-newsom-cities-and-time/&#34;&gt;Mayor Gavin Newsom, “Cities and Time”&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s interesting to read about some of the things the mayor would like to see happen in San Francisco. Of course, he won&amp;rsquo;t be in office to make good on his desires, but these kinds of comments are probably smart if you want to run for Governor of California. 😉&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Why Reddit uses Python</title>
      <link>https://brainsik.net/2009/why-reddit-uses-python/</link>
      <pubDate>Wed, 08 Apr 2009 10:07:59 +0000</pubDate>
      <guid>https://brainsik.net/2009/why-reddit-uses-python/</guid>
      <description>&lt;p&gt;During &lt;a href=&#34;http://us.pycon.org/2009/conference/schedule/event/80/&#34; title=&#34;Keynote: Reddit: Steve Huffman and Alexis Ohanian&#34;&gt;Steve Huffman&amp;rsquo;s and Alexis Ohanian&amp;rsquo;s Pycon Keynote&lt;/a&gt;, someone asked why &lt;a href=&#34;http://reddit.com/&#34;&gt;Reddit&lt;/a&gt; was moved from Lisp to &lt;a href=&#34;http://python.org/&#34;&gt;Python&lt;/a&gt;. The reason for moving wasn&amp;rsquo;t too interesting, but why they have stayed is. Steve gave two “huge” reasons Reddit continues to use Python:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The biggest thing that has kept us on Python … well, there are two huge things. One are the libraries. There&amp;rsquo;s a library for everything. We&amp;rsquo;ve been learning a lot of these technologies and a lot of these architectures as we go. And, so, when I didn&amp;rsquo;t understand connection pools, I can just find a library until I understand it better myself and write our own. Don&amp;rsquo;t understand web frameworks, so we&amp;rsquo;ll use someone else&amp;rsquo;s until we make our own. Don&amp;rsquo;t understand a lot of stuff. And Python has an awesome crutch like that. And now, as we&amp;rsquo;ve been learning more, pulling more stuff back in house — just so we can have things the way we like them — it&amp;rsquo;s made the transition super super easy.&lt;/p&gt;&#xA;&lt;p&gt;The other thing that keeps us on Python, and this is the major thing, is how readable and writable it is. When we hire new employees … I don&amp;rsquo;t think we&amp;rsquo;ve yet hired an employee who knew Python. I just say, “everything you write needs to be in Python.” Just so I can read it. And it&amp;rsquo;s awesome because I can see from across the room, looking at their screen, whether their code is good or bad. Because good Python code has a very obvious structure. And that makes my life so much easier. […] It&amp;rsquo;s extremely expressive, extremely readable, and extremely writable. And that just keeps life smooth.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;The question gets asked around 25:54 on &lt;a href=&#34;http://pycon.blip.tv/file/1951296/&#34;&gt;the video&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>WordPress SSL redirect failure</title>
      <link>https://brainsik.net/2009/wordpress-ssl-redirect-failure/</link>
      <pubDate>Sun, 05 Apr 2009 19:18:06 +0000</pubDate>
      <guid>https://brainsik.net/2009/wordpress-ssl-redirect-failure/</guid>
      <description>&lt;p&gt;I have had so many problems managing the &lt;a href=&#34;http://wordpress.org/download/&#34;&gt;wordpress software&lt;/a&gt;, it&amp;rsquo;s ridiculous. If I could find a decent replacement, I&amp;rsquo;d move everyone over, but this appears to be the best out there. It reminds me of the time when all web browsers sucked and all email clients sucked. The sad thing is, WordPress used to be really solid; now every new version feels a bit more degraded than the last. Perhaps I&amp;rsquo;ll let them blame it on using PHP. 😉 Enjoy:&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;$&lt;/span&gt; curl -k -I https://brainsik.theory.org/.:./wp-login.php&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;HTTP/1.1 302 Found&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;Date: Mon, 06 Apr 2009 02:08:18 GMT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;Server: Apache/2.2.9&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;X-Powered-By: PHP/5.2.6-2ubuntu4.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;Location: https://brainsik.theory.org/.:./wp-login.php&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;Vary: Accept-Encoding&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8b949e&#34;&gt;Content-Type: text/html; charset=UTF-8&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;HINT: Compare the URL I requested, and the one I was redirected to.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Forbidden Twitter</title>
      <link>https://brainsik.net/2009/forbidden-twitter/</link>
      <pubDate>Wed, 01 Apr 2009 13:43:36 +0000</pubDate>
      <guid>https://brainsik.net/2009/forbidden-twitter/</guid>
      <description>&lt;p&gt;On most sites I visit, error pages are infrequent. On Twitter, problems are so common &lt;a href=&#34;http://images.google.com/images?q=fail+whale&#34; title=&#34;fail whale images&#34;&gt;the error pages have their own cultural currency&lt;/a&gt;. Sadly, I still &lt;em&gt;regularly&lt;/em&gt; hit errors without such soothing imagery:&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2006/wp-content/uploads/2009/04/403twitter.png&#34; alt=&#34;403 Twitter&#34; title=&#34;403 Twitter&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Flexicommunity of web frameworks</title>
      <link>https://brainsik.net/2009/flexicommunity-of-web-frameworks/</link>
      <pubDate>Tue, 24 Mar 2009 21:53:44 +0000</pubDate>
      <guid>https://brainsik.net/2009/flexicommunity-of-web-frameworks/</guid>
      <description>&lt;p&gt;The group I work with has thought about using Django a few times, but our biggest concern has been the lock-in you get with their base components. We&amp;rsquo;re already happy using &lt;a href=&#34;http://www.sqlalchemy.org/&#34;&gt;SQLAlchemy&lt;/a&gt; and &lt;a href=&#34;http://genshi.edgewall.org/&#34;&gt;Genshi&lt;/a&gt; for a system application in our project. Besides liking the tools we&amp;rsquo;ve picked, we&amp;rsquo;d like to avoid using multiple tools for the same task. On the other hand, if a second set of tools provides a framework we&amp;rsquo;ll totally rock with, sign us up!&lt;/p&gt;&#xA;&lt;p&gt;A few days ago, &lt;a href=&#34;http://zedshaw.com/blog/2009-03-20.html&#34; title=&#34;One Laptop Battery Later And I&#39;m A Django Fan&#34;&gt;Zed Shaw spooged about how rad Django is&lt;/a&gt;. There isn&amp;rsquo;t a lot of meat to his story, but there are enticing morsels like &lt;a href=&#34;http://docs.djangoproject.com/en/dev/intro/tutorial04/#use-generic-views-less-code-is-better&#34;&gt;generic views&lt;/a&gt;, the &lt;a href=&#34;http://pinaxproject.com/docs/0.5.1/intro.html#features&#34;&gt;Pinax component list&lt;/a&gt;, and:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Django has been pushing the idea of having discrete “applications” that act within a “site” as cooperating but separate components.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Inspired, the first thing I looked at was the ORM. The schema we&amp;rsquo;ve inherited and need to redesign is absurdly complex &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; so I suspected this is where I&amp;rsquo;d first hit limitations.&lt;/p&gt;&#xA;&lt;p&gt;The redesign will use natural keys when possible &lt;em&gt;and reasonable&lt;/em&gt; to help protect against duplicate data entry &lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; — the system we inherited uses only surrogate keys and has duplicate data in a variety of places. Also, we add protection (against errors, bad data, etc.) at multiple layers, so this approach fits well with our philosophy.&lt;/p&gt;&#xA;&lt;p&gt;When choosing a natural key, sometimes more than one column is needed to guarantee uniqueness. This is called a composite primary key. Unfortunately, &lt;a href=&#34;http://docs.djangoproject.com/en/dev/topics/db/models/#id1&#34; title=&#34;Automatic primary key fields&#34;&gt;composite primary keys are not supported by Django&lt;/a&gt; &lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; and their wiki page about &lt;a href=&#34;http://code.djangoproject.com/wiki/MultipleColumnPrimaryKeys&#34;&gt;Multi-Column Primary Key support&lt;/a&gt; is disheartening. The only reason they might implement this feature is to support “legacy databases (whose schema cannot be changed)”. This plus the automatic generation of primary key “id” columns tells me they have made a choice for us: use surrogate keys.&lt;/p&gt;&#xA;&lt;p&gt;Our model is now outside Django&amp;rsquo;s current scope and there is no way to leverage another ORM that can support our needs. Sadder still, the brilliance of an entire database toolkit &lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; perfectly suited to work with the M in our &lt;a href=&#34;http://en.wikipedia.org/wiki/Model-view-controller&#34; title=&#34;Model-View-Controller&#34;&gt;MVC&lt;/a&gt; project is inaccessible.&lt;/p&gt;&#xA;&lt;p&gt;This is the problem with frameworks like &lt;a href=&#34;http://djangoproject.com/&#34;&gt;Django&lt;/a&gt;, Ruby on Rails, and others; they enforce their “pragmatic design” &lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt; on you. You must use their ORM, their template language, their request dispatcher, etc. You are sequestered within their community.&lt;/p&gt;&#xA;&lt;p&gt;In frameworks like &lt;a href=&#34;http://pylonshq.com/&#34;&gt;Pylons&lt;/a&gt; (and others) where you get both structure and choice of base components, all the different communities of ORM creators, template engine writers, and etc. are available and intermingling. Communication between projects is high and even &lt;a href=&#34;http://www.turbogears.org/2.0/docs/main/WhatsNew.html#what-s-new-in-turbogears-2&#34; title=&#34;What&#39;s new in TurboGears 2&#34;&gt;the frameworks themselves are mixing&lt;/a&gt;! &lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Our project will be growing for years, the longevity and flexibility of the community is critical. The last thing we want is 4 years from now realizing we&amp;rsquo;re dependent on a suite of core components nobody is using.&lt;/p&gt;&#xA;&lt;!-- rumdl-disable MD059 --&gt;&#xA;&lt;!-- rumdl-enable MD059 --&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;We actually blew the Python call stack with our relation references when using SQLAlchemy and &lt;a href=&#34;http://www.sqlalchemy.org/docs/05/reference/ext/declarative.html&#34;&gt;declarative&lt;/a&gt;. You might be thinking that&amp;rsquo;s because the model is crap, and you&amp;rsquo;d be right. We are actually keeping a tally how many times we exclaim “WTF!?” each day as we try to beat the beast into submission.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;See Josh Berkus&amp;rsquo; &lt;a href=&#34;http://it.toolbox.com/blogs/database-soup/primary-keyvil-part-i-7327&#34; title=&#34;Primary Keyvil, Part I&#34;&gt;Primary Keyvil series&lt;/a&gt; for explanation of how natural keys can provide a database level way of protecting against duplicate data.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;“Each model requires &lt;em&gt;exactly one&lt;/em&gt; field to have &lt;code&gt;primary_key=True&lt;/code&gt;.”&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;SQLAlchemy is not just &lt;a href=&#34;http://www.sqlalchemy.org/docs/05/ormtutorial.html&#34; title=&#34;Object Relational Tutorial&#34;&gt;an ORM&lt;/a&gt;, it’s an &lt;a href=&#34;http://www.sqlalchemy.org/docs/05/sqlexpression.html&#34; title=&#34;SQL Expression Language Tutorial&#34;&gt;expression language&lt;/a&gt; and &lt;a href=&#34;http://www.sqlalchemy.org/docs/05/&#34; title=&#34;SQLAlchemy 0.5.x Documentation&#34;&gt;more&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:5&#34;&gt;&#xA;&lt;p&gt;From the Django project homepage.&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:6&#34;&gt;&#xA;&lt;p&gt;TurboGears 2 was rewritten on top of Pylons.&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>What real revolutions are like</title>
      <link>https://brainsik.net/2009/what-real-revolutions-are-like/</link>
      <pubDate>Fri, 20 Mar 2009 17:44:10 +0000</pubDate>
      <guid>https://brainsik.net/2009/what-real-revolutions-are-like/</guid>
      <description>&lt;p&gt;Clay Shirky has &lt;a href=&#34;http://www.shirky.com/weblog/2009/03/newspapers-and-thinking-the-unthinkable/&#34; title=&#34;Newspapers and Thinking the Unthinkable&#34;&gt;an incredible article about the Newspaper industry failing to come to terms with its own demise&lt;/a&gt;. Gems of wisdom abound throughout, but I found this particularly striking:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;That is what real revolutions are like. The old stuff gets broken faster than the new stuff is put in its place. The importance of any given experiment isn’t apparent at the moment it appears; big changes stall, small changes spread. Even the revolutionaries can’t predict what will happen.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;em&gt;The old stuff gets broken faster than the new stuff is put in its place;&lt;/em&gt; what a fantastic way of thinking about it!&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Off-hours innovation</title>
      <link>https://brainsik.net/2009/off-hours-innovation/</link>
      <pubDate>Thu, 19 Mar 2009 18:04:20 +0000</pubDate>
      <guid>https://brainsik.net/2009/off-hours-innovation/</guid>
      <description>&lt;p&gt;Zed Shaw&amp;rsquo;s &lt;a href=&#34;http://zedshaw.com/blog/2009-03-02-2.html&#34;&gt;NYC VCs Can&amp;rsquo;t Do Math&lt;/a&gt; poses a theory on why California has so many tech startups:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;There are several reasons why technology just doesn’t take off [in NYC] the way it does in Silicon Valley. The primary reason in my mind is that California has laws that protect employees from their employers stealing off-hours work. In California, tech workers have no problem working on the next hot start-up in their spare time because they know Megalo Corp won’t own it when they’re done. I believe California is the only state in the US that has this law, and wow look, it’s the only state with a rampant churn of startups and innovation that now rivals the banking industry in capital.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I had no idea California&amp;rsquo;s law was so unique. How the heck do you start a tech company these days&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; if not in your off-hours from work!?&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;When the .com bust happened, there were a lot of startups funded by severance pay and savings, but those heydays are gone.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>600531w</title>
      <link>https://brainsik.net/2009/600531w/</link>
      <pubDate>Mon, 23 Feb 2009 20:54:12 +0000</pubDate>
      <guid>https://brainsik.net/2009/600531w/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/brainsik/3305048051/sizes/l/&#34;&gt;&lt;img src=&#34;https://live.staticflickr.com/3313/3305048051_94e7a65a97_b_d.jpg&#34; alt=&#34;600531w&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Techcrunch quality</title>
      <link>https://brainsik.net/2009/techcrunch-quality/</link>
      <pubDate>Mon, 23 Feb 2009 12:23:25 +0000</pubDate>
      <guid>https://brainsik.net/2009/techcrunch-quality/</guid>
      <description>&lt;p&gt;Perhaps &lt;a href=&#34;http://www.last.fm/&#34;&gt;Last.fm&lt;/a&gt;&amp;rsquo;s recent revelation will elighten more people to a longstanding reality about the tabloid Techcrunch:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://blog.last.fm/2009/02/23/techcrunch-are-full-of-shit&#34;&gt;Techcrunch are full of shit&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;On a whim, I decided to look up &lt;a href=&#34;http://shitcrunch.com/&#34;&gt;shitcrunch.com&lt;/a&gt; and found a blog that was created (but never used) in November 2007. It&amp;rsquo;s been &lt;a href=&#34;http://uncov.com/2007/4/19/graphita-now-taking-bets&#34;&gt;crap for longer than that&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Last.fm, however, is a &lt;em&gt;fantastic&lt;/em&gt; service. I&amp;rsquo;ve been &lt;a href=&#34;http://www.last.fm/user/brainsik&#34;&gt;using it since February 2006&lt;/a&gt; and visit it on an almost daily basis. They are also one of the few big sites that get privacy, open source, and community.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>BASH puzzle</title>
      <link>https://brainsik.net/2009/bash-puzzle/</link>
      <pubDate>Fri, 23 Jan 2009 16:46:44 +0000</pubDate>
      <guid>https://brainsik.net/2009/bash-puzzle/</guid>
      <description>&lt;p&gt;Although only 1½ people read this blog, I&amp;rsquo;m hoping I&amp;rsquo;ll get some responses to this puzzle. I figured out a solution, but I&amp;rsquo;m worried i was being too clever and that there&amp;rsquo;s an even simpler BASH way of handling this.&lt;/p&gt;&#xA;&lt;p&gt;You receive a string of argument pairs like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#79c0ff&#34;&gt;ARGSTRING&lt;/span&gt;&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#34;a1 a2 b1 b2 c1 c2 …&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You don&amp;rsquo;t know how long the ARGSTRING will be ahead of time. How do you take this list of argument pairs and send each pair to get processed by another command? In other words, let&amp;rsquo;s say you just want to &lt;code&gt;echo&lt;/code&gt; out each pair, then your solution would run like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;solution &lt;span style=&#34;color:#79c0ff&#34;&gt;$ARGSTRING&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and produce:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a1 a2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;b1 b2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c1 c2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;…&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Post your solutions!! Only use BASH, do not call external programs.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Back at the old Harris Ranch …</title>
      <link>https://brainsik.net/2008/back-at-the-old-harris-ranch/</link>
      <pubDate>Tue, 30 Dec 2008 11:12:12 +0000</pubDate>
      <guid>https://brainsik.net/2008/back-at-the-old-harris-ranch/</guid>
      <description>&lt;p&gt;A good, week-long, winter respite at the old Sonoma house …&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://flickr.com/photos/brainsik/3143937243/sizes/l/&#34;&gt;&lt;img src=&#34;https://live.staticflickr.com/3237/3143937243_1b1331aa90_b_d.jpg&#34; alt=&#34;Standard sunset over the vineyard&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://flickr.com/photos/brainsik/3139398162/sizes/l/&#34;&gt;&lt;img src=&#34;https://live.staticflickr.com/3255/3139398162_31a18f7e4f_b_d.jpg&#34; alt=&#34;Disco Barn&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://flickr.com/photos/brainsik/3138517351/sizes/l/&#34;&gt;&lt;img src=&#34;https://live.staticflickr.com/3248/3138517351_281315a433_b_d.jpg&#34; alt=&#34;Brandon&amp;rsquo;s Barn&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Brandon also put &lt;a href=&#34;http://roar.theory.org/2008/playing-in-the-loft-of-the-barn/&#34;&gt;a couple of images on his blog&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Patch: Ubuntu DRBD now can haz run after boot</title>
      <link>https://brainsik.net/2008/patch-ubuntu-drbd-now-can-haz-run-after-boot/</link>
      <pubDate>Tue, 09 Dec 2008 09:32:39 +0000</pubDate>
      <guid>https://brainsik.net/2008/patch-ubuntu-drbd-now-can-haz-run-after-boot/</guid>
      <description>&lt;p&gt;Ubuntu server edition “brings the power of inexpensive shared storage to your servers”. In particular, &lt;a href=&#34;http://www.ubuntu.com/products/whatisubuntu/serveredition/technologies/storage&#34;&gt;they tout DRBD support&lt;/a&gt;. Unfortunately, in Ubuntu 8.10 Intrepid Ibex, &lt;a href=&#34;https://bugs.launchpad.net/ubuntu/+source/drbd8/+bug/282876&#34;&gt;DRBD won&amp;rsquo;t start at boot&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The bug wasn&amp;rsquo;t too hard to track down. The problem is the &lt;code&gt;update-rc.d&lt;/code&gt; script (run in the package postinst) is parsing the LSB headers in the DRBD &lt;code&gt;init.d&lt;/code&gt; script. The LSB headers tell &lt;code&gt;update-rc.d&lt;/code&gt; to not include runlevel 2 (Ubuntu&amp;rsquo;s default) when installing symlinks, so none is made in &lt;code&gt;rc2.d&lt;/code&gt;. Hence, the init script is not run during startup.&lt;/p&gt;&#xA;&lt;p&gt;I put documentation and a debdiff (package patch) on the &lt;a href=&#34;https://bugs.launchpad.net/ubuntu/+source/drbd8/+bug/282876&#34;&gt;launchpad bug report&lt;/a&gt;. However, even though &lt;a href=&#34;http://packages.ubuntu.com/intrepid/drbd8-utils&#34;&gt;this package is in main&lt;/a&gt;, I have &lt;a href=&#34;https://brainsik.net/2008/fixing-and-reporting-ubuntu-bugs/&#34;&gt;no faith this bug will be fixed by Ubuntu&lt;/a&gt; (see update below the fold). So, for your server&amp;rsquo;s enjoyment, grab the patched packages we are using at my company:&lt;/p&gt;&#xA;&lt;p&gt;Add these lines to your &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;deb http://packages.devsuki.com/ubuntu/ intrepid main&#xA;deb-src http://packages.devsuki.com/ubuntu/ intrepid main&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Grab the public signing key:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;wget http://packages.devsuki.com/devsuki-signing-key.asc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Add it to your apt keychain:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo apt-key add devsuki-signing-key.asc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Otherwise, you can &lt;a href=&#34;http://packages.devsuki.com/ubuntu/pool/main/d/drbd8/&#34;&gt;directly download the packages&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;UPDATE (2009.01.27): According to what the “Launchpad Janitor wrote on 2009-01-26”, it appears this bug has been fixed in 2:8.3.0-1ubuntu1. However, this package appears to only be available in the development version of Ubuntu (jaunty) and not as an update to intrepid. I&amp;rsquo;ll post a question on the bug about it.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Halloween Critical Mass</title>
      <link>https://brainsik.net/2008/halloween-critical-mass/</link>
      <pubDate>Thu, 06 Nov 2008 22:26:17 +0000</pubDate>
      <guid>https://brainsik.net/2008/halloween-critical-mass/</guid>
      <description>&lt;p&gt;This year&amp;rsquo;s Halloween &lt;a href=&#34;http://critical-mass.info/&#34;&gt;Critical Mass&lt;/a&gt; was as awesome as always. A few thousand (my guess) people showed up in costumes and lights and (of course) political motifs. After many rides over many years in San Francisco, and a few &lt;a href=&#34;https://brainsik.net/2004/bnc-critical-mass&#34;&gt;scary, but important, rides&lt;/a&gt; in Manhattan, the SF Halloween Mass is one event I&amp;rsquo;ll keep showing up to year after year. In fact, it sounds like &lt;a href=&#34;http://www.sfgate.com/cgi-bin/article.cgi?f=/c/a/2008/10/31/BAOO13SA50.DTL&#34;&gt;this year it was the main Halloween event in the city&lt;/a&gt;!&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a &lt;a href=&#34;http://www.streetfilms.org/archives/sf-critical-mass-halloween-2008/&#34;&gt;great video made by Streetfilms&lt;/a&gt; and some &lt;a href=&#34;http://www.sfwiggle.com/2008/11/04/halloween-critical-mass/&#34;&gt;wonderful pictures posted on the sfwiggle blog&lt;/a&gt;. Found via a &lt;a href=&#34;http://www.bikeblognyc.com/?p=1479&#34;&gt;Bike Blog NYC post&lt;/a&gt;. The &lt;a href=&#34;http://www.streetfilms.org/&#34;&gt;Streetfilms&lt;/a&gt;‘ video is below.&lt;/p&gt;&#xA;&lt;iframe src=&#34;https://player.vimeo.com/video/11907794?color=9086c0&#34; width=&#34;640&#34; height=&#34;480&#34; frameborder=&#34;0&#34; allow=&#34;fullscreen; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://vimeo.com/11907794&#34;&gt;SF Critical Mass Halloween 2008&lt;/a&gt; from &lt;a href=&#34;https://vimeo.com/streetfilms&#34;&gt;STREETFILMS&lt;/a&gt; on &lt;a href=&#34;https://vimeo.com&#34;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>A way to STOP text message spam</title>
      <link>https://brainsik.net/2008/a-way-to-stop-text-message-spam/</link>
      <pubDate>Fri, 31 Oct 2008 10:18:36 +0000</pubDate>
      <guid>https://brainsik.net/2008/a-way-to-stop-text-message-spam/</guid>
      <description>&lt;p&gt;If you are being text spammed by a short-code (a mobile number typically 5 digits long), just reply with “STOP”. This should work if it&amp;rsquo;s a service that cares to not piss off its recipients. This probably won&amp;rsquo;t work for an annoying relative. In my case, spam was coming from a service called Kadoink, and after I sent “STOP”, I got back a text that said I&amp;rsquo;d receive no more messages. I suspect this is some sort of industry accepted command: I found it in AT&amp;amp;T&amp;rsquo;s, &lt;a href=&#34;http://www.wireless.att.com/support_static_files/KB/svc/documents/1220912515172.Anti-spam%20FAQ%20080707%20Consumer.pdf&#34;&gt;What YOU can do to control cell phone spam&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;For the past month, I&amp;rsquo;ve been receiving text message spam about events in San Francisco. The messages come from the short-code 87995 and are signed “via Kadoink”. I tried messaging the number back with “stop sending me this crap” and then “stop 87995”, but it didn&amp;rsquo;t stop.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Then I looked into Kadoink and found they are a social service for text messaging (spamming?). Twice I sent email to &lt;code&gt;info@kadoink.com&lt;/code&gt; and &lt;code&gt;support@kadoink.com&lt;/code&gt; to try to get them to stop spamming me, but they didn&amp;rsquo;t even bother to reply (let alone stop the spam).&lt;/p&gt;&#xA;&lt;p&gt;Finally, I decided to go direct to my wireless provider, &lt;a href=&#34;http://articles.latimes.com/2006/feb/05/opinion/ed-nsa5&#34;&gt;AT&amp;amp;T (unfortunately)&lt;/a&gt;. In our half-hour conversation I was told repeatedly “AT&amp;amp;T does not have the capability to block a single mobile number.” Later in the brainstorming session it came up that for $5/month I could buy a service, “Smart Limits”, which would allow me to specify mobile numbers I&amp;rsquo;d like to block. “If smart limits lets me block a single number, then AT&amp;amp;T does have the capability, right?” The customer service guy agreed and soon things were escalated to the manager. It&amp;rsquo;s fairly unacceptable to have the options: get charged for the spam or get charged to stop the spam. Of course, the manager just came back with, sorry, it&amp;rsquo;s Policy.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;To make a long story short (too late), I gave up on AT&amp;amp;T in hope I could better strong-arm Kadoink to do the right thing, then found the PDF mentioned above, sent “STOP” and hopefully that&amp;rsquo;s the end. So, not much thanks to Kadoink for not responding to my email, and not much thanks to AT&amp;amp;T for not really caring to solve my problem, but thanks to whoever decided to implement the “STOP” feature,&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; as it (at least says it) worked.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;In fact, the first time I messaged, they resent me their spam. 🙁&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;One of my favorite reasons for avoiding big business and bureaucracy is often policy trumps reason and sense.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;You&amp;rsquo;d think Kadoink would have this on &lt;a href=&#34;http://www.kadoink.com/index.cfm?action=commandGuide&#34; title=&#34;Kadoink&#39;s command guide doesn&#39;t help you stop spam&#34;&gt;their command guide&lt;/a&gt;, but they don&amp;rsquo;t.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>CA Prop 8 invokes Hitler?!</title>
      <link>https://brainsik.net/2008/ca-prop-8-invokes-hitler/</link>
      <pubDate>Thu, 30 Oct 2008 16:23:59 +0000</pubDate>
      <guid>https://brainsik.net/2008/ca-prop-8-invokes-hitler/</guid>
      <description>&lt;p&gt;How they dare to bring Hitler into the mix is beyond me. As if gay marriage could possibly, in any way, be put on par with what Hitler brought to the world. It&amp;rsquo;s totally insane and made me donate 4x my previous amount to &lt;a href=&#34;https://secure.ga4.org/01/underattack&#34;&gt;Vote No on Prop 8&lt;/a&gt;. Please donate (and of course vote NO, if you can)!&lt;/p&gt;&#xA;&lt;p&gt;I originally donated thanks to a post made by &lt;a href=&#34;http://sayspy.blogspot.com/2008/10/please-vote-no-on-proposition-8-in.html&#34;&gt;A Coder Who Says Py&lt;/a&gt;. He reminded me how important this is.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Friday links: flash vorbis, appstore shackles, python 2.6</title>
      <link>https://brainsik.net/2008/friday-links-flash-vorbis-appstore-shackles-python-26/</link>
      <pubDate>Fri, 03 Oct 2008 12:54:29 +0000</pubDate>
      <guid>https://brainsik.net/2008/friday-links-flash-vorbis-appstore-shackles-python-26/</guid>
      <description>&lt;p&gt;A few things I found particularly interesting this week:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://barelyfocused.net/blog/2008/10/03/flash-vorbis-player/&#34;&gt;Flash Vorbis player&lt;/a&gt; – An open source vorbis player in a 46KB SWF file!&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.engadget.com/2008/09/25/engadget-cares-save-us-from-apples-groundbreaking-developer-s&#34;&gt;Engadget Cares: Save us from Apple&amp;rsquo;s groundbreaking, developer-shackling App Store&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://docs.python.org/whatsnew/2.6.html&#34;&gt;Python 2.6&lt;/a&gt; – Finally released with a ton of 3.0 features and the new -3 switch. Should be fun.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>NAT-PMP port mapper utility and framework</title>
      <link>https://brainsik.net/2008/nat-pmp-port-mapper-utility-and-framework/</link>
      <pubDate>Tue, 30 Sep 2008 07:24:59 +0000</pubDate>
      <guid>https://brainsik.net/2008/nat-pmp-port-mapper-utility-and-framework/</guid>
      <description>&lt;p&gt;Sometimes I want to make a port on my home network (airport and OS X laptop) accessible to the world. However, using airport utility to setup the mapping and restart the router is annoying, especially when I know you can just &lt;a href=&#34;http://www.perlmonks.org/index.pl?node_id=659847&#34; title=&#34;Punch hole inbound for Apple NAT-PMP Router&#34;&gt;map the port with some UDP packets&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;A little searching around revealed &lt;a href=&#34;http://www.codingmonkeys.de/portmap/&#34;&gt;Port Map&lt;/a&gt;. It&amp;rsquo;s &lt;a href=&#34;http://www.codingmonkeys.de/&#34;&gt;The Coding Monkey&lt;/a&gt;‘s very nice and simple GUI wrapped around their real project: &lt;a href=&#34;http://code.google.com/p/tcmportmapper/&#34;&gt;a Cocoa interface for automatically port mapping&lt;/a&gt;. It uses the open source libraries &lt;a href=&#34;http://miniupnp.free.fr/&#34;&gt;libnatpmp and miniupnp&lt;/a&gt; and the framework itself is &lt;a href=&#34;http://en.wikipedia.org/wiki/MIT_License&#34;&gt;MIT licensed&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m always excited when I see OS X developers doing some open source work. That&amp;rsquo;s a huge part of the culture of Linux that is missing from the OS X developer consciousness. That you are &lt;em&gt;legally barred&lt;/em&gt; from writing open source applications with the iPhone SDK is one of the many reasons the &lt;a href=&#34;http://www.engadget.com/2008/09/25/engadget-cares-save-us-from-apples-groundbreaking-developer-s&#34; title=&#34;Apple&#39;s groundbreaking, developer-shackling App Store&#34;&gt;iTunes App Store is a nightmare&lt;/a&gt; for developers (and consequently, consumers).&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Recovering an Ubuntu do-release-upgrade</title>
      <link>https://brainsik.net/2008/recovering-an-ubuntu-do-release-upgrade/</link>
      <pubDate>Sun, 07 Sep 2008 09:43:18 +0000</pubDate>
      <guid>https://brainsik.net/2008/recovering-an-ubuntu-do-release-upgrade/</guid>
      <description>&lt;p&gt;This is a quick &lt;a href=&#34;http://en.wikipedia.org/wiki/Public_service_announcement&#34;&gt;PSA&lt;/a&gt; for anyone who thinks they might be screwed if they lose their shell during &lt;code&gt;do-release-upgrade&lt;/code&gt;: You aren&amp;rsquo;t. Just log back in and run &lt;code&gt;dpkg --configure -a&lt;/code&gt;. You&amp;rsquo;ll finish configuring all the packages you didn&amp;rsquo;t get to before. Don&amp;rsquo;t forget to reboot to start using the new kernel. 🙂&lt;/p&gt;&#xA;&lt;p&gt;As a bonus, you can run &lt;code&gt;aptitude&lt;/code&gt; to remove/purge any (now) obsolete packages.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Of course, this works best if you&amp;rsquo;ve been using aptitude all along and it has a good idea of what packages have been automatically installed.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Ubuntu 7.10 Gutsy → 8.04 Hardy upgrade freeze</title>
      <link>https://brainsik.net/2008/ubuntu-710-gutsy-804-hardy-upgrade-freeze/</link>
      <pubDate>Sun, 17 Aug 2008 11:09:07 +0000</pubDate>
      <guid>https://brainsik.net/2008/ubuntu-710-gutsy-804-hardy-upgrade-freeze/</guid>
      <description>&lt;p&gt;Another Ubuntu upgrade, &lt;a href=&#34;https://brainsik.net/2007/ubuntu-710-gutsy-caveat-beware-evms&#34;&gt;another &lt;em&gt;critical&lt;/em&gt; upgrade bug&lt;/a&gt;. I had this idea that letting a solid chunk of time go by before upgrading (in this case, ~4 months) would mean most of the upgrade bugs would be gone. Instead, I was bit in the ass because using the current 7.10 Gutsy kernel (2.6.22-15) means &lt;a href=&#34;http://ubuntuforums.org/showthread.php?t=865679&#34;&gt;the upgrade process will freeze on the locales package&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://ubuntuforums.org/showthread.php?p=5428830#poststop&#34;&gt;The workaround&lt;/a&gt;, found by &lt;a href=&#34;http://ubuntuforums.org/member.php?u=628992&#34;&gt;siberoptik on the Ubuntu forums&lt;/a&gt;, is to reboot your system with the 2.6.22-14 kernel. Everything is &lt;span style=&#34;color: #ff9955;&#34;&gt;peachy&lt;/span&gt; after that. Since I&amp;rsquo;m working remotely, the way I changed kernels was to edit &lt;code&gt;/boot/grub/menu.lst&lt;/code&gt; and nuke the lines about the 2.6.22-15 kernel. That made 2.6.22-14 the top-most kernel. By the end of the upgrade none of those kernels will matter anymore anyway. If you are in front of the box, you can just press &lt;code&gt;&amp;lt;Esc&amp;gt;&lt;/code&gt; at the grub menu.&lt;/p&gt;&#xA;&lt;p&gt;If you find yourself in the middle of an upgrade, frozen at “Generating locales…”, all is not lost. Get another shell on the system, look for the process tree (`&lt;code&gt;ps axfw&lt;/code&gt;`) with &lt;code&gt;locale-gen&lt;/code&gt; running, and kill &lt;code&gt;locale-gen&lt;/code&gt; off.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; For me, the upgrade continued on until the only packages left were &lt;code&gt;ubuntu-minimal&lt;/code&gt; and &lt;code&gt;locales&lt;/code&gt;. I had to kill off the &lt;code&gt;locale-gen&lt;/code&gt; process a couple of more times until the upgrade process was declared “failed”.&lt;/p&gt;&#xA;&lt;p&gt;At this point I reboot the box and something went awry as it didn&amp;rsquo;t come back again. 😮 It&amp;rsquo;s unclear from the logs what exactly happened (working remotely, I couldn&amp;rsquo;t watch the screen), but after a hard reset I was able to get back in again. Running `&lt;code&gt;dpkg --configure -a&lt;/code&gt;` had the locales generate instantly and everything was fine.&lt;/p&gt;&#xA;&lt;p&gt;The total joke about all of this is, as usual, it&amp;rsquo;s not documented on Ubuntu&amp;rsquo;s site in any useful place. Yes, I found it in the forum after I hit the bug and knew what to search for, but it&amp;rsquo;s a bit late at that point. You&amp;rsquo;d think there would be a “caveats” or “known problems” or “big nasty critical bugs you should avoid” section on the &lt;a href=&#34;https://help.ubuntu.com/community/HardyUpgrades&#34;&gt;help page about Hardy upgrades&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In an effort to prevent others from going down this road, I&amp;rsquo;ve put information in the following places:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Added a &lt;a href=&#34;https://help.ubuntu.com/community/HardyUpgrades#Known%20problems&#34;&gt;“Known problems” section&lt;/a&gt; to the HardyUpgrades help page.&lt;/li&gt;&#xA;&lt;li&gt;Added a comment to the &lt;a href=&#34;https://answers.launchpad.net/ubuntu/+source/update-manager/+question/34682&#34;&gt;update-manager fails 7.10 -&amp;gt; 8.04 LTS&lt;/a&gt; question.&lt;/li&gt;&#xA;&lt;li&gt;Opened &lt;a href=&#34;https://bugs.launchpad.net/update-manager/+bug/258879&#34;&gt;a bug against the update-manager package&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; (2008.08.19): The bug I filed against update-manager as been made a duplicate of a &lt;a href=&#34;https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.22/+bug/249340&#34;&gt;bug in linux-source-2.6.22&lt;/a&gt;. A lot of talk has been happening there and someone claims the developers are working on a fix.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; (2008.09.24): On August 25, a new kernel was released which fixed this problem. All the upgrades I&amp;rsquo;ve done with the new kernel have gone perfectly. That said, it does appear there are some people who are still running into this problem. See barbex&amp;rsquo;s comment below and see the &lt;a href=&#34;https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.22/+bug/249340&#34;&gt;bug in linux-source-2.6.22&lt;/a&gt; page.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;IMHO, it&amp;rsquo;s a good idea to try killing the highest process in the tree and work your way down to the root until you get the result you want.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>James from outta nowhere …</title>
      <link>https://brainsik.net/2008/james-from-outta-nowhere/</link>
      <pubDate>Wed, 30 Apr 2008 11:51:53 +0000</pubDate>
      <guid>https://brainsik.net/2008/james-from-outta-nowhere/</guid>
      <description>&lt;p&gt;Good basketball has me out of my seat waving, whooping, and worrying; wonderful emotions that come out during the NBA Playoffs. My neighbors must love me. 😉 Here&amp;rsquo;s a little audio excerpt of a great moment. I love it when the announcers are having just as good a time.&lt;/p&gt;&#xA;&lt;p&gt;&lt;audio style=&#34;width: 100%;&#34; controls=&#34;controls&#34;&gt;&lt;source type=&#34;audio/mpeg&#34; src=&#34;https://brainsik.theory.org/blog-2006/wp-content/uploads/2008/04/James-from-outta-nowhere.mp3&#34;&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Zabbix 1.4.4 packages for Ubuntu</title>
      <link>https://brainsik.net/2008/zabbix-144-packages-for-ubuntu/</link>
      <pubDate>Fri, 08 Feb 2008 10:56:55 +0000</pubDate>
      <guid>https://brainsik.net/2008/zabbix-144-packages-for-ubuntu/</guid>
      <description>&lt;p&gt;Step right up and get your Zabbix 1.4.4 packages for Ubuntu 7.10 (Gutsy Gibbon)! Packages are available for i386 and amd64 architectures (sorry, I don&amp;rsquo;t have a powerpc machine). To get them via apt add the following to your &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;:&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;deb http://packages.devsuki.com/ubuntu/ gutsy main&#xA;deb-src http://packages.devsuki.com/ubuntu/ gutsy main&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;You can also &lt;a href=&#34;http://packages.devsuki.com/ubuntu/pool/main/z/zabbix/&#34;&gt;download them manually&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Source packages were &lt;a href=&#34;http://packages.debian.org/source/sid/zabbix&#34;&gt;pulled from Debian sid&lt;/a&gt; and two modifications were made:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;postgresql-8.2&lt;/code&gt; was added as an alternative to &lt;code&gt;postgresql-8.1&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;The init.d scripts were modified to create &lt;code&gt;/var/run/zabbix-*&lt;/code&gt; directories on start.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Enjoy!&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;You may want to download &lt;a href=&#34;http://packages.devsuki.com/devsuki-signing-key.asc&#34;&gt;the package signing key&lt;/a&gt; and add it with &lt;code&gt;apt-key&lt;/code&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Ubuntu uses tmpfs for &lt;code&gt;/var/run&lt;/code&gt;, so these directories will disappear on reboot. I followed the suggestion in &lt;a href=&#34;http://www.zabbix.com/forum/showthread.php?t=8857&#34;&gt;this zabbix forum post&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Buying music online, part 1 (bleep.com)</title>
      <link>https://brainsik.net/2008/buying-music-online-part-1-bleepcom/</link>
      <pubDate>Fri, 25 Jan 2008 12:09:57 +0000</pubDate>
      <guid>https://brainsik.net/2008/buying-music-online-part-1-bleepcom/</guid>
      <description>&lt;p&gt;Over the last few years I&amp;rsquo;ve purchased music online from a variety of sites. Aside from wanting files that sound good, a hard requirement is &lt;strong&gt;songs must be &lt;a href=&#34;http://en.wikipedia.org/wiki/Digital_rights_management#DRM_opponents&#34;&gt;DRM-free&lt;/a&gt;&lt;/strong&gt;. Yep, that mostly means &lt;a href=&#34;http://en.wikipedia.org/wiki/FairPlay&#34;&gt;the iTunes store is out&lt;/a&gt;.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2006/wp-content/uploads/2008/01/bleepcomlogo.png&#34; alt=&#34;Bleep.com&#34; title=&#34;Bleep.com&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://bleep.com/&#34;&gt;My favorite place to buy/download music is bleep.com&lt;/a&gt;. There are two reasons:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;em&gt;very&lt;/em&gt; high quality, DRM-free tracks&lt;/li&gt;&#xA;&lt;li&gt;an awesome music preview system&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;When I say “&lt;em&gt;very&lt;/em&gt; high quality”, I mean it. All albums encoded after January 2006 come as 320K MP3s (the highest quality level) and are encoded with &lt;a href=&#34;http://lame.sourceforge.net/&#34;&gt;LAME&lt;/a&gt; (the highest quality encoder). And if that ain&amp;rsquo;t enough quality for you, they often have new albums available (for a little more $€£) in &lt;em&gt;lossless&lt;/em&gt; &lt;a href=&#34;http://flac.sourceforge.net/&#34;&gt;FLAC&lt;/a&gt;! Furthermore, I&amp;rsquo;ve probably bought about 10 albums from them and none have ever had any ripping audio artifacts (skips, pops, clicks, static, drop outs, etc.) — they&amp;rsquo;re clean as can be.&lt;/p&gt;&#xA;&lt;p&gt;As if all that wasn&amp;rsquo;t enough, their website lets you listen to every part of every song before you buy! This is just awesome. Typically, sites only give you the first 30s, which isn&amp;rsquo;t very useful for long and intricate tracks. I&amp;rsquo;ve spent many hours listening to tracks on bleep.com looking for a new album to buy. It&amp;rsquo;s an awesome feature and has gotten me to buy more music from them. 🙂&lt;/p&gt;&#xA;&lt;p&gt;The downside to bleep.com is also one of their strengths. Originally, they were started as store for &lt;a href=&#34;http://www.warprecords.com/&#34;&gt;Warp Records&lt;/a&gt;, a &lt;a href=&#34;http://en.wikipedia.org/wiki/Warp_Records#Notable_artists_from_past_and_present&#34;&gt;highly influential electronic music&lt;/a&gt; label. Since that inception the store has expanded to carry music from a huge list of labels, however the predominant flavor is still electronic music (IDM, breaks, dub, glitch, ambient, minimal, experimental, etc.). Thus, the downside is you aren&amp;rsquo;t going to find that metal, hip-hop, or jazz album you&amp;rsquo;ve been wanting, but the upside is if you are into interesting electronic music, you&amp;rsquo;ll poop your pants when you discover hard to find albums are only a few clicks away from playing on your stereo.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;I did buy one DRM-free track via iTunes when iTunes-plus launched (as a vote of support), but I have yet to find any other iTunes-plus tracks I&amp;rsquo;m interested in. Seriously, every time I look for an album it&amp;rsquo;s only available wrapped in iTunes&amp;rsquo; DRM. With the advent of amazonmp3.com, I&amp;rsquo;m probably going to stop checking the iTunes store at all. More on that later.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Fixing and reporting Ubuntu bugs</title>
      <link>https://brainsik.net/2008/fixing-and-reporting-ubuntu-bugs/</link>
      <pubDate>Fri, 18 Jan 2008 14:17:37 +0000</pubDate>
      <guid>https://brainsik.net/2008/fixing-and-reporting-ubuntu-bugs/</guid>
      <description>&lt;p&gt;My friend Matt and I have shared a number of stories regarding our frustrations with reporting bugs to Ubuntu. He recently wrote an overview of his experiences — &lt;em&gt;&lt;a href=&#34;https://blog.glyphobet.net/essay/140/&#34; title=&#34;Why I’ve stopped reporting bugs to Ubuntu&#34;&gt;Why I’ve stopped reporting bugs to Ubuntu&lt;/a&gt;&lt;/em&gt; — which was &lt;a href=&#34;https://www.osnews.com/story/19179/why-ive-stopped-reporting-bugs-to-ubuntu/&#34;&gt;linked to by OSNews&lt;/a&gt;. The comments there are mostly level and reasonable, but some people are missing the focus of his statement. He&amp;rsquo;s not whining “fix my bug!”, he&amp;rsquo;s drawing attention to the methodology used to process bugs.&lt;/p&gt;&#xA;&lt;p&gt;Matt and I have been involved with the &lt;a href=&#34;http://en.wikipedia.org/wiki/Free_software_movement&#34;&gt;free software movement&lt;/a&gt; for the last decade. One of the consequences of using software developed by people in their spare time is that bugs and emails can be ignored for long periods of time (e.g., forever). After almost 10 years, and a bunch of our own software projects, I like to think we&amp;rsquo;ve developed reasonable expectations for how things work (and don&amp;rsquo;t work).&lt;/p&gt;&#xA;&lt;p&gt;When I report a bug to Ubuntu I often include a debdiff (package patch). In other words, I&amp;rsquo;m not just whining about bugs, I&amp;rsquo;m fixxing them! This is because one of my day jobs is sysadmin for &lt;a href=&#34;http://mosuki.com/&#34;&gt;Mosuki&lt;/a&gt;. Every Ubuntu upgrade released has had problems of varying severity and it&amp;rsquo;s my job to patch the relevant packages and get them into &lt;a href=&#34;http://packages.devsuki.com/&#34; title=&#34;Devsuki apt repository&#34;&gt;our development apt repostory&lt;/a&gt;. I was annoyed by this process for a while, but I&amp;rsquo;ve come to accept it as the trade-off for getting a new stable set of software every 6 months (which we&amp;rsquo;ve come to rely on). This means, every Ubuntu release I find and fix a bunch of Ubuntu bugs.&lt;/p&gt;&#xA;&lt;p&gt;There are many reasons I use free software, but in the end, I want to give back to the community. For me, this means creating debdiffs of my work and submitting it to Launchpad. There&amp;rsquo;s little &lt;em&gt;practical&lt;/em&gt; benefit I receive from doing this.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; But I believe in free software; I want to make my work available to others and I want to make Ubuntu a better distribution.&lt;/p&gt;&#xA;&lt;p&gt;Simply, it comes down to this: If my work is ignored, then what is the purpose of doing the work? If the Launchpad bug tracker is not an adequate mechanism for getting my fixes into Ubuntu, then why should I use it? I&amp;rsquo;m jumping through their hoops for their own good, not mine.&lt;/p&gt;&#xA;&lt;p&gt;To reap the benefit of my work without waiting for Ubuntu, add the &lt;a href=&#34;http://devsuki.com/&#34;&gt;Devsuki&lt;/a&gt; apt repository to your &lt;code&gt;/etc/apt/sources.list&lt;/code&gt; and decide you trust my work (or inspect the changes I&amp;rsquo;ve made):&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;deb http://packages.devsuki.com/ubuntu/ gutsy main&#xA;deb-src http://packages.devsuki.com/ubuntu/ gutsy main&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Of course, I&amp;rsquo;d rather the packages be officially fixed rather than in my own repository, but that&amp;rsquo;s about it.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Earning the FAIL in failover</title>
      <link>https://brainsik.net/2007/earning-the-fail-in-failover/</link>
      <pubDate>Tue, 18 Dec 2007 12:33:16 +0000</pubDate>
      <guid>https://brainsik.net/2007/earning-the-fail-in-failover/</guid>
      <description>&lt;p&gt;This blows my mind: Involver, sort of a competitor to the &lt;a href=&#34;http://mosuki.com/&#34;&gt;far more interesting Mosuki&lt;/a&gt; :-), recently &lt;a href=&#34;http://blog.involver.com/?p=52&#34;&gt;posted on their blog&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;You may have noticed that our site broke this morning. Apparently the power supply on our database server decided to commit suicide while everyone was asleep.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;OMG. How can any social network site hoping for some semblance of success (or real funding) be running their DB on a single machine with no failover. I&amp;rsquo;m totally floored by this. Even when Mosuki was doing private &lt;em&gt;alpha&lt;/em&gt; testing 3½ years ago we had a hot-failover cluster. I wonder if they do backups.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Discovering suicide bombing</title>
      <link>https://brainsik.net/2007/discovering-suicide-bombing/</link>
      <pubDate>Tue, 13 Nov 2007 13:21:19 +0000</pubDate>
      <guid>https://brainsik.net/2007/discovering-suicide-bombing/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;http://www.wired.com/gaming/gamingreviews/commentary/games/2007/11/gamesfrontiers_1105&#34; title=&#34;Suicide Bombing Makes Sick Sense in Halo 3&#34;&gt;a very interesting article about suicide bombing in &lt;em&gt;Halo 3&lt;/em&gt;&lt;/a&gt;, the author describes how the “psychology of asymmetrical warfare” led him to take up the tactic. The article is not about the game but about his insight into when suicide tactics become the reasonable choice.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Even though I&amp;rsquo;ve read scores of articles, white papers and books on the psychology of terrorists in recent years, and even though I have (I think) a strong intellectual grasp of the roots of suicide terrorism, something about playing the game gave me an “aha” moment that I&amp;rsquo;d never had before: an ability to &lt;em&gt;feel&lt;/em&gt;, in whatever tiny fashion, the strategic logic and emotional calculus behind the act.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</description>
    </item>
    <item>
      <title>Pussyfinger at Robotspeak</title>
      <link>https://brainsik.net/2007/pussyfinger-at-robotspeak/</link>
      <pubDate>Mon, 12 Nov 2007 18:45:55 +0000</pubDate>
      <guid>https://brainsik.net/2007/pussyfinger-at-robotspeak/</guid>
      <description>&lt;p&gt;On October 28, I heard/saw &lt;a href=&#34;http://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&amp;amp;friendid=37791117&#34;&gt;Pussyfinger&lt;/a&gt; play at &lt;a href=&#34;http://www.robotspeak.com/&#34;&gt;Robotspeak&lt;/a&gt;&amp;rsquo;s 5th year anniversary party. They were completely awesome. Here&amp;rsquo;s a 30s clip I shot with my point and shoot camera:&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/JSiOLcU35xM&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Ubuntu 7.10 &#34;gutsy&#34; caveat: beware EVMS!</title>
      <link>https://brainsik.net/2007/ubuntu-710-gutsy-caveat-beware-evms/</link>
      <pubDate>Tue, 30 Oct 2007 13:23:14 +0000</pubDate>
      <guid>https://brainsik.net/2007/ubuntu-710-gutsy-caveat-beware-evms/</guid>
      <description>&lt;p&gt;A small PSA: If you are &lt;a href=&#34;https://help.ubuntu.com/community/GutsyUpgrades&#34;&gt;upgrading Ubuntu to 7.10 “gutsy”&lt;/a&gt;, check to see if you have the “evms” package installed. If you do, and you have no knowledge of installing it and don&amp;rsquo;t know what it is, then you probably should remove it. The consequences of keeping it are a spew of system messages:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;device-mapper: dm-linear: Device lookup failed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;device-mapper: error adding target to table&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Even worse, you may be unable to mount any partitions aside from &lt;code&gt;/&lt;/code&gt;! That&amp;rsquo;s what happened to me. 🙁&lt;/p&gt;&#xA;&lt;p&gt;There are &lt;a href=&#34;https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.22/+bug/115616&#34;&gt;lots of people having these device-mapper errors&lt;/a&gt;. Some explanation is given in the “Volume activation” section of the &lt;a href=&#34;http://evms.sourceforge.net/faq.html&#34;&gt;EVMS FAQ&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If you run into the problem where you reboot and no longer have a &lt;code&gt;/var&lt;/code&gt; partition, you should try preventing &lt;code&gt;evms&lt;/code&gt; from starting at boot and rebooting. For example, you can do this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mv /etc/rcS.d/S27evms /root&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;reboot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If your system doesn&amp;rsquo;t want to reboot, check for processes hung up on shutting down (I had to kill off something related to Alsa). If everything comes up fine, clean and purge:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mv /root/S27evms /etc/rcS.d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aptitude purge evms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Everything should be happy at this point. You can also clean up the junk that ended up in &lt;code&gt;/var&lt;/code&gt; when your &lt;code&gt;/var&lt;/code&gt; partition couldn&amp;rsquo;t be mounted. Just mount &lt;code&gt;/&lt;/code&gt; to another place, clean and unmount. Thanks to &lt;a href=&#34;http://codeville.org/&#34;&gt;Ross Cohen&lt;/a&gt; for telling me about multimount&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;“Since Linux 2.4 a single filesystem can be visible at multiple &lt;mark&gt;mount&lt;/mark&gt; points” —&lt;a href=&#34;http://linux.die.net/man/2/mount&#34;&gt;mount(2) man page&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Making a new file the Ubuntu way?</title>
      <link>https://brainsik.net/2007/making-a-new-file-the-ubuntu-way/</link>
      <pubDate>Thu, 25 Oct 2007 14:49:03 +0000</pubDate>
      <guid>https://brainsik.net/2007/making-a-new-file-the-ubuntu-way/</guid>
      <description>&lt;p&gt;While innocently reading the &lt;a href=&#34;http://www.ubuntu.com/getubuntu/releasenotes/710&#34; title=&#34;Ubuntu 7.10 Release Notes&#34;&gt;7.10 Release Notes&lt;/a&gt; my left eyebrow raised at their method for creating a new file with a single word in it.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;code&gt;echo letter | sudo tee /etc/papersize &amp;gt;/dev/null&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Say what? Why on Earth use &lt;code&gt;tee&lt;/code&gt; if you are going to dump it&amp;rsquo;s output to &lt;code&gt;/dev/null&lt;/code&gt;? I assume whoever wrote it ran into a file permission problem due to the redirection.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; How about the following:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo sh -c &lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#39;echo letter &amp;gt; papersize&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;m not going to complain that their way spawns an extra process; I dislike complaints which ignore the capacity of modern computers and that this command is run once by hand. Probably, I just think their way is ugly. 🙂&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;http://www.gratisoft.us/sudo/man/sudo.html#examples&#34;&gt;sudo manpage&lt;/a&gt; also suggests using &lt;code&gt;sh -c&lt;/code&gt; for making redirection work.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Reminding myself where I live</title>
      <link>https://brainsik.net/2007/reminding-myself-where-i-live/</link>
      <pubDate>Wed, 24 Oct 2007 17:18:23 +0000</pubDate>
      <guid>https://brainsik.net/2007/reminding-myself-where-i-live/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/brainsik/1730288889/sizes/l/&#34;&gt;&lt;img src=&#34;https://live.staticflickr.com/2181/1730288889_bf370c060c_b_d.jpg&#34; alt=&#34;Alamo-Haight near Sunrise&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This morning around 4am I was woken by the brightness of the nearly-full moon. My head was perfectly situated for viewing on the pillow and my eyes were blasted with light as their lids parted. The room was moonlit and a beautiful woman slept next to me. The sky was clear. The air was still. Moon features were visible even without glasses. A few minutes later, almost as suddenly as it appeared to me, the moon dipped behind some buildings and the room plunged into darkness. For a moment longer I appreciated &lt;em&gt;time&lt;/em&gt; and &lt;em&gt;timing&lt;/em&gt; and then fell back asleep.&lt;/p&gt;&#xA;&lt;p&gt;An hour later I was awake and felt energized. A big batch of red blood cells was probably made in the night — I don&amp;rsquo;t usually wake around 5am — yay! Twelve hours prior I was riding my bicycle to &lt;a href=&#34;http://maps.google.com/maps?q=Baker+Beach,+United+States&#34; title=&#34;Google map to Baker Beach&#34;&gt;Baker Beach&lt;/a&gt; and then later, with friends, to the &lt;a href=&#34;http://www.woodhousefish.com/&#34; title=&#34;Woodhouse Fish Co.&#34;&gt;Woodhouse Fish Company&lt;/a&gt;. Baker Beach was amazing. After so many years of living in San Francisco, it&amp;rsquo;s pretty ridiculous I never made it there before. However, it&amp;rsquo;s hard to imagine a more wonderful day than yesterday to be there. The weather was perfect — warm and without wind. I was relishing being in a t-shirt long after the sun dipped behind the cliffs. There are only a few days a year in San Francisco when this happens!&lt;/p&gt;&#xA;&lt;p&gt;Night fell and the lights on the Golden Gate Bridge came on slowly in a haphazard way. Stars came out. Friends showed up. Hunger visited and we left for the &lt;a href=&#34;http://www.woodhousefish.com/&#34; title=&#34;Woodhouse Fish Co.&#34;&gt;WFC&lt;/a&gt;, bicycling through the warm night air. We ate fresh fish and clams and talked a bit about the &lt;a href=&#34;http://en.wikipedia.org/wiki/Chuck_close&#34;&gt;Chuck Close&lt;/a&gt; retrospective from quite a while ago.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;On the way back home we stopped in an intersection between final destinations and talked for some time in the warm night, savoring it as rare SF treasure.&lt;/p&gt;&#xA;&lt;p&gt;While I was getting up so early this morning, the beautiful woman stirred and said I should go watch the sun rise. I did. There is a small spot in Alamo Square, near a tree, where you can see the sun poke it&amp;rsquo;s rays above the east bay mountains. There&amp;rsquo;s also a nice view of the ocean which I&amp;rsquo;ve never paid much attention to before. Walking home I saw my neighborhood bathed in morning, “&lt;a href=&#34;http://en.wikipedia.org/wiki/Golden_hour_%28photography%29&#34;&gt;magic hour&lt;/a&gt;” light. Struck by its present beauty and reminded of the wonderful day passed, I glowed from the reminder of where I live and how lucky I am now.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Mostly everyone at the table trying to convince me Mr. Close&amp;rsquo;s recent work has merit. Briefly, the retrospective was laid out in chronological order and I very much liked everything I was seeing. Then I got to the Polaroids and was deflated. I didn&amp;rsquo;t see them as artistic evolution but as a product of fame. It seemed to me that Mr. Close could carve his face into a potato and it would instantly be high-value. The value coming from it being &lt;em&gt;his&lt;/em&gt; face and that it was &lt;em&gt;he&lt;/em&gt; who produced it. In other words, his current “work” is his performance of art, not the art itself. Maybe this is true for any artist that hits the top, but it&amp;rsquo;s particularly stark in this case. While this in itself is somewhat interesting, and the endeavor of evolving a subject over a lifetime has academic merit, it does not inspire me. Understand, I did find most of his work inspiring, it&amp;rsquo;s just the recent stuff I find lacking. Through the next door was the &lt;a href=&#34;http://en.wikipedia.org/wiki/Kiki_smith&#34;&gt;Kiki Smith&lt;/a&gt; exhibit which I found inspiring from beginning to end.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Virtual stability and a complex systems paradigm</title>
      <link>https://brainsik.net/2007/virtual-stability-and-a-complex-systems-paradigm/</link>
      <pubDate>Thu, 18 Oct 2007 13:52:22 +0000</pubDate>
      <guid>https://brainsik.net/2007/virtual-stability-and-a-complex-systems-paradigm/</guid>
      <description>&lt;p&gt;Another &lt;a href=&#34;http://www.santafe.edu/events/index.php?pFilter=Seminar&#34; title=&#34;SFI seminars&#34;&gt;SFI seminar&lt;/a&gt; I wish I could have attended: &lt;a href=&#34;http://www.santafe.edu/events/abstract/1110&#34; title=&#34;Virtual stability&#34;&gt;&lt;em&gt;Virtual Stability: A General Characteristic of Complex Adaptive Systems?&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;[…] we define the concept of virtual stability as a state in which a system employs self-monitoring and adaptive control to maintain itself in a configuration that would otherwise be unstable. The energy expended in this gains the system a major increase in its flexibility of behavioral response to environmental change. Virtual stability is proposed as a general principle of complex adaptive systems.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;The speaker, Burton Voorhees, wrote a paper in 2002: &lt;a href=&#34;http://necsi.org/events/iccs/2002/Mo14_Vorhees.pdf&#34; title=&#34;Virtual Stability: A Principle of Complex Systems&#34;&gt;&lt;em&gt;Virtual Stability: A Principle of Complex Systems&lt;/em&gt;&lt;/a&gt; &lt;small&gt;[PDF]&lt;/small&gt;. Along with that stronger in-title assertion, the introduction says:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We suggest that virtual stability provides an answer to the question of whether or not there is a direction to evolution.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;A fairly bold statement. Perhaps he has endured some questioning and criticism seeing as the seminar title uses looser language and is phrased as a question. 🙂&lt;/p&gt;&#xA;&lt;p&gt;Curiously, “virtual stability” does not appear in &lt;a href=&#34;http://www.athabascau.ca/html/staff/academic/burtv.htm&#34; title=&#34;Burton Voorhees&#34;&gt;Dr. Voorhees&amp;rsquo; list of interests&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ignoring the uncertainty of the notion, virtual stability fits well in one of my favorite complex system paradigms:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;solid ↔ liquid ↔ gas&lt;/li&gt;&#xA;&lt;li&gt;order ↔ chaos ↔ random&lt;/li&gt;&#xA;&lt;li&gt;rest ↔ inhalation/exhalation ↔ seizure&lt;/li&gt;&#xA;&lt;li&gt;fixed/periodic ↔ complex ↔ chaotic&lt;/li&gt;&#xA;&lt;li&gt;stable ↔ &lt;strong&gt;virtually stable&lt;/strong&gt; ↔ unstable&lt;/li&gt;&#xA;&lt;li&gt;etc.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Where changes between states is like a &lt;a href=&#34;http://en.wikipedia.org/wiki/Phase_transition&#34; title=&#34;phase transition&#34;&gt;phase-transition&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;As far as I know this paradigm is in no way “official”, but I find it a meaningful guide. The idea was first presented to me in &lt;a href=&#34;http://en.wikipedia.org/wiki/Christopher_Langton&#34;&gt;Christopher Langton&lt;/a&gt;‘s thesis&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. If you are into complex systems, you should not hesitate to find a copy&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. Not only is it a wonderful story of discovery, it&amp;rsquo;s rife with humor! An inspiring work.&lt;/p&gt;&#xA;&lt;p&gt;As for Dr. Voorhees&amp;rsquo; ideas, I&amp;rsquo;d like to know more. It would be wonderful if &lt;a href=&#34;http://santafe.edu/&#34; title=&#34;Sante Fe Institute&#34;&gt;SFI&lt;/a&gt; would publish audio and/or video of their seminars.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;C. G. Langton. Computation at the edge of Chaos: Phase-Transitions and Emergent Computation. Ph.D. Thesis, University of Michigan (1990).&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;If you are in university, you may be able to use the inter-library loan system to borrow it from the University of Michigan. That&amp;rsquo;s what I did in 2000. There was also a company which sold thesis copies, but their quality was atrocious — perhaps being printed from microfiche!&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Wikipedia to relocate to San Francisco</title>
      <link>https://brainsik.net/2007/wikipedia-to-relocate-to-san-francisco/</link>
      <pubDate>Thu, 18 Oct 2007 10:51:44 +0000</pubDate>
      <guid>https://brainsik.net/2007/wikipedia-to-relocate-to-san-francisco/</guid>
      <description>&lt;p&gt;While looking for some voting information on &lt;a href=&#34;http://sfgov.org/&#34; title=&#34;SFGov&#34;&gt;San Francisco&amp;rsquo;s government website&lt;/a&gt;, I saw this &lt;a href=&#34;http://sfgov.org/site/mayor_index.asp?id=69196&#34; title=&#34;Wikipedia to Relocate to San Francisco&#34;&gt;press release: &lt;em&gt;Wikipedia to Relocate to San Francisco&lt;/em&gt;&lt;/a&gt;. Basically, the &lt;a href=&#34;http://wikimediafoundation.org/&#34; title=&#34;Wikimedia Foundation&#34;&gt;Wikimedia Foundation&lt;/a&gt; will be moving here at the beginning of 2008. Hopefully, that will bring more local talks by &lt;a href=&#34;http://en.wikipedia.org/wiki/Jimmy_Wales&#34; title=&#34;Jimmy Wales&#34;&gt;Jimmy Wales&lt;/a&gt;. The last time I heard him was at Stanford when &lt;a href=&#34;http://mosuki.com/&#34;&gt;Mosuki&lt;/a&gt; was attending &lt;a href=&#34;http://smartmobs.com/&#34; title=&#34;Smart Mobs&#34;&gt;Howard Rheingold&lt;/a&gt; and &lt;a href=&#34;http://www.iftf.org/people/asaveri.html&#34; title=&#34;Andrea Saveri&#34;&gt;Andrea Saveri&lt;/a&gt;‘s &lt;em&gt;Literacy of Cooperation&lt;/em&gt;. &lt;a href=&#34;http://www.archive.org/details/HowardRheingoldIFTFStanfordHumanitiesLabJimmyWales&#34;&gt;Jimmy Wales&amp;rsquo; lecture&lt;/a&gt; was one of my favorite.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s been a while since I&amp;rsquo;ve thought about the class, but it was quite good. We got to meet a lot of very interesting people with provocative ideas. The syllabus and class web page appear gone, but &lt;a href=&#34;http://wearethemedia.com/2005/10/30/towards-a-literacy-of-cooperation/&#34; title=&#34;Towards a Literacy of Cooperation&#34;&gt;Markus Sandy has a good description&lt;/a&gt; and &lt;a href=&#34;http://www.archive.org/search.php?query=creator%3A%22IFTF%22&#34; title=&#34;HUM202 lectures&#34;&gt;many of the lectures are on the Internet Archive&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>RIAA trial: Capitol v. Thomas</title>
      <link>https://brainsik.net/2007/riaa-trial-capitol-v-thomas/</link>
      <pubDate>Wed, 03 Oct 2007 14:59:31 +0000</pubDate>
      <guid>https://brainsik.net/2007/riaa-trial-capitol-v-thomas/</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally posted to the Self-Referential Orgy (SRO) list.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Some people on this list will probably be interested to know that this morning began the first jury trial between the RIAA and someone they accuse of sharing pirated music via KaZaa. So far, out of the 20,000 cases the RIAA has made against people for pirating, this is the first one to actually make it to court.&lt;/p&gt;&#xA;&lt;p&gt;Ars Technica is at the trial and making reports. Here are some choice parts:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://arstechnica.com/news.ars/post/20071002-sony-bmgs-chief-anti-piracy-lawyer-copying-music-you-own-is-stealing.html&#34;&gt;Sony BMG&amp;rsquo;s chief anti-piracy lawyer: “Copying” music you own is “stealing”&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://arstechnica.com/news.ars/post/20071002-music-industry-exec-p2p-litigation-is-a-money-pit.html&#34;&gt;RIAA anti-P2P campaign a real money pit, according to testimony&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;And the latest entry:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://arstechnica.com/news.ars/post/20071003-defendants-counsel-hammers-away-at-piracy-picture-painted-by-riaa.html&#34;&gt;Defendant&amp;rsquo;s counsel hammers away at piracy picture painted by RIAA&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Which has this humorous bit:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Judge Michael Davis gave his assent to the demonstration, and, after the jury filed back into the courtroom, Thomas ripped two CDs, timing it on her cell phone. When the first CD was done, she announced the time as 2:36.18. Gabriel immediately objected saying that they timed it at over four minutes. The apparently-amused judge said that the jurors could figure out the time for themselves. The second CD ripped in 2:17.71 according to the defendant&amp;rsquo;s timing (I timed the second demonstration in 2:18.97). Gabriel again objected, saying that he had it at three-and-a-half minutes.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</description>
    </item>
    <item>
      <title>Lost.</title>
      <link>https://brainsik.net/2006/lost/</link>
      <pubDate>Mon, 03 Jul 2006 12:17:08 +0000</pubDate>
      <guid>https://brainsik.net/2006/lost/</guid>
      <description>&lt;p&gt;Lost. Lost in this sea of modernity. My society, my world. Energy put into production, into consumption. For what? Living breathing energy or dead? To enjoy or to end. Cycle of life? Reincarnate? Faith, belief. More stories to tell ourselves. Bring us through the suffering of survival. Is there truth to any of it? Or another product. Build build build. Create, structure, model. Growth and destruction, ensuring we recognize the arrow of time. Our worldline bright.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Yeast After Me</title>
      <link>https://brainsik.net/2005/yeast-after-me/</link>
      <pubDate>Sun, 27 Nov 2005 01:32:48 +0000</pubDate>
      <guid>https://brainsik.net/2005/yeast-after-me/</guid>
      <description>&lt;p&gt;For some reason, a couple of lovely artists decided I could taint their show, &lt;a href=&#34;http://repeatafterme.org/&#34;&gt;Repeat After Me&lt;/a&gt;, with an attempt at Art (more likely, art). Being in love with the science of complexity, the topic of self-replication has come up more than a few times. Fortunately, my original, colder, less fun idea wouldn&amp;rsquo;t come to fruition in time for the show, so I&amp;rsquo;ve been forced towards a more seasonally appropriate goal: the creation, recording, and imbibing of beer.&lt;/p&gt;&#xA;&lt;p&gt;What better way to say “self-replicate” than helping billions of fungal organisms live and die, drinking their waste in celebration? This is a sound art project whose name is still undecided (though my collaborator Søren and I have a few good ideas). We&amp;rsquo;ve field recorded the brew cycle and will be conjuring the sound pieces into an audible reflection of the process. We&amp;rsquo;ve got one month to do it. Yikes!&lt;/p&gt;&#xA;&lt;p&gt;Tonight was the first I&amp;rsquo;ve played with the samples. If you are bored and I mean really bored (it&amp;rsquo;s really boring), you can &lt;a href=&#34;https://brainsik.theory.org/blog-2003/noise/beer-messaround1.mp3&#34;&gt;listen to the first exbeeriment&lt;/a&gt;. It&amp;rsquo;s here solely as something to look back at when we finish the final piece. Our work (including the crap linked previously) is licensed under the &lt;a href=&#34;http://creativecommons.org/licenses/sampling+/1.0/&#34;&gt;Creative Commons Sample Plus license&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>End of October; Clockwork Beast.</title>
      <link>https://brainsik.net/2005/end-of-october-clockwork-beast/</link>
      <pubDate>Mon, 24 Oct 2005 22:31:39 +0000</pubDate>
      <guid>https://brainsik.net/2005/end-of-october-clockwork-beast/</guid>
      <description>&lt;p&gt;for three (recorded) years, my brain goes twist around this time. it&amp;rsquo;s some sort of heralding of colder months, introspective moods, and the production of inspirational fuel for my next winter compilation.&lt;/p&gt;&#xA;&lt;p&gt;i&amp;rsquo;m constantly amazed by how our minds have both random, inexplicable, bursts and precise, inexplicable, cycles. wack stuff, it keeps it interesting. a nice combination of grounded regularity and general unknowingness.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Manhattan: First two photos.</title>
      <link>https://brainsik.net/2005/manhattan-first-two-photos/</link>
      <pubDate>Sat, 23 Jul 2005 11:54:21 +0000</pubDate>
      <guid>https://brainsik.net/2005/manhattan-first-two-photos/</guid>
      <description>&lt;p&gt;Living in the East Village (NY, NY) for the summer. Keeping a loose journal on the wiki. Email me if you want a link to it. It&amp;rsquo;s not super private, but it&amp;rsquo;s not so much meant for other people, i.e. it may be boring. &lt;code&gt;:)&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/nycsumma/3-08065w.jpg&#34; alt=&#34;3-08065w.jpg&#34; title=&#34;3-08065w.jpg&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/nycsumma/3-08071w.jpg&#34; alt=&#34;3-08071w.jpg&#34; title=&#34;3-08071w.jpg&#34;&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>CodeCon 2005</title>
      <link>https://brainsik.net/2005/codecon-2005/</link>
      <pubDate>Fri, 11 Feb 2005 15:53:24 +0000</pubDate>
      <guid>https://brainsik.net/2005/codecon-2005/</guid>
      <description>&lt;p&gt;The next three days is &lt;a href=&#34;http://www.codecon.org/&#34;&gt;CodeCon&lt;/a&gt;. This year I&amp;rsquo;m officially on staff handling the &lt;a href=&#34;http://codecon.mosuki.com/&#34;&gt;CodeCon Live Audio&lt;/a&gt; streams. You can &lt;a href=&#34;http://www.codecon.org/2005/schedule.html&#34;&gt;view the schedule&lt;/a&gt; to see what topic is at hand.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Buckwheat Maki?</title>
      <link>https://brainsik.net/2005/buckwheat-maki/</link>
      <pubDate>Tue, 25 Jan 2005 17:13:11 +0000</pubDate>
      <guid>https://brainsik.net/2005/buckwheat-maki/</guid>
      <description>&lt;p&gt;There is no respect for the sushi roll. While trying to whip up something quick and macrobiotic inspired I refound the buckwheat grains (why have i not touched these all winter!!). They were toasted and cooked into fluffy comfort (steam smelling feeling like a large easy chair in a mahogany study).&lt;/p&gt;&#xA;&lt;p&gt;Into the grain went carrot and avocado and I made a sauce by mixing tahini and the world&amp;rsquo;s best shoyu (Ohsawa® Nama® Shoyu). A leafy something or other was in need, but the avo, carrot and shoyu were screaming “Maki! Maki!” Could I?&lt;/p&gt;&#xA;&lt;p&gt;The nori came out, the contents of the pot was mixed and thrown down off-center seaweed. Add a bit of umeboshi paste and sprinkle gomasio, roll, seal — hot damn, it&amp;rsquo;s good! A side of oshitashi would make this complete.&lt;/p&gt;&#xA;&lt;p&gt;Looking for suggestions on a ginger drink. I&amp;rsquo;m making a strong ginger juice using a soy milk maker, but i&amp;rsquo;m at a loss for spices to add. Ginger juice and sweetener are good, but I know this can be made really good.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>RNC Quick Update</title>
      <link>https://brainsik.net/2004/rnc-quick-update/</link>
      <pubDate>Mon, 30 Aug 2004 21:37:08 +0000</pubDate>
      <guid>https://brainsik.net/2004/rnc-quick-update/</guid>
      <description>&lt;p&gt;Before I write up my personal experience of yesterday&amp;rsquo;s Bike Bloc, here are links to good information about the last couple of days.&lt;/p&gt;&#xA;&lt;p&gt;For up to the minute news, visit &lt;a href=&#34;http://nyc.indymedia.org/&#34;&gt;NYC Indymedia&lt;/a&gt;. If you &lt;em&gt;really&lt;/em&gt; want to be on the up and up, register your phone with &lt;a href=&#34;http://txtmob.com/&#34;&gt;Text Mob&lt;/a&gt; and join the “comms_dispatch” group to receive text messages used by protesters to determine routes and actions.&lt;/p&gt;&#xA;&lt;p&gt;A &lt;em&gt;fantastic&lt;/em&gt; &lt;a href=&#34;http://www.democracynow.org/article.pl?sid=04/08/30/1453256&#34;&gt;piece about Friday&amp;rsquo;s critical mass&lt;/a&gt; was on Monday&amp;rsquo;s &lt;a href=&#34;http://www.democracynow.org/&#34;&gt;Democracy Now!&lt;/a&gt;. Includes bike mounted camera footage of the ride, the producer being arrested, and the police swinging batons at a crowd chanting for the release of a bicyclist. Democracy Now! is covering the actions and protests surrounding the Republican National Convention with video footage, photos and interviews.&lt;/p&gt;&#xA;&lt;p&gt;Some recent articles:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://nyc.indymedia.org/newswire/display/108067/index.php&#34;&gt;Today&amp;rsquo;s Marches: AP News + Photos&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://nytimes.com/2004/08/30/politics/campaign/30protest.html&#34;&gt;Vast Anti-Bush Rally Greets Republicans in New York&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.democracynow.org/article.pl?sid=04/08/30/1453250&#34;&gt;Antiwar Voices Address March: Michael Moore, Jesse Jackson, Fernando Suarez, Charles Barron and More&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;One of the funnier actions occuring tomorrow: &lt;a href=&#34;http://www.defendjohnnycash.org/&#34;&gt;Defend Johnny Cash&lt;/a&gt; — Man-In-Black Bloc.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>BNC Critical Mass</title>
      <link>https://brainsik.net/2004/bnc-critical-mass/</link>
      <pubDate>Sat, 28 Aug 2004 13:53:49 +0000</pubDate>
      <guid>https://brainsik.net/2004/bnc-critical-mass/</guid>
      <description>&lt;p&gt;Last night &lt;a href=&#34;http://en.wikipedia.org/wiki/Critical_Mass&#34;&gt;critical mass&lt;/a&gt; rode as what is likely the largest mass of riders in its world history. The low estimate by police and media is between 5000 and 6000 riders while the reasonable high estimate is as many as 10,000. The &lt;a href=&#34;http://times-up.org/bnc/index.php&#34;&gt;Bike National Convention&lt;/a&gt;, spearheaded by bike activist group &lt;a href=&#34;http://times-up.org/&#34;&gt;Times-Up!&lt;/a&gt;, was a major force behind the swell of riders in last night&amp;rsquo;s tour of the city.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/rnc/bnc-critmass-xsq.jpg&#34; alt=&#34;Critical Mass rides through Times Square&#34; title=&#34;Critical Mass rides through Times Square&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Critical Mass events have been occuring on the last friday of the month in NYC for over 8 years. For the first time, police declared riders were violating the law, creating unsafe traffic conditions and would be arrested if the mass proceeded as usual. A &lt;a href=&#34;http://nyc.indymedia.org/newswire/display/104538/index.php&#34;&gt;flier of fear&lt;/a&gt; was distributed by police to riders meeting in Union Square. In the past, NYPD fear tactics have successfully reduced the size of Times-Up organized bike events. However, last night&amp;rsquo;s deep failure to reduce the size of the ride may have served to frustrate the police force, leading them to unnecessarily arrest over 250 bicyclists.&lt;/p&gt;&#xA;&lt;p&gt;For over a month, a large after party was being organized for the end of last night&amp;rsquo;s ride. A space was secured as was valet bike parking. The purpose was to end the ride in celebration and provide the space and resources to accomodate an expected large group of riders. However, over the last week police and coast guard were regularly visiting the chosen establishment&amp;rsquo;s owners in an attempt to scare them from hosting the planned celebration. Two days before the ride, their tactics were successful and the owner pulled out.&lt;/p&gt;&#xA;&lt;p&gt;By successfully removing the critical mass after-party, the New York Police Department effectively created the scenario of thousands of riders pouring through the streets with no final destination. Quickly, Times-Up secured a much smaller space, St Marks church. The venue became less of an afterparty and more of an attempt by the NYPD to cover their failings.&lt;/p&gt;&#xA;&lt;p&gt;The ride stopped in front of St. Marks but the large mass of people was only able to slowly move inside the grounds. Street watchers filled sidewalks further impeding the the bicyclists street exit. Boxed in, the NYPD swept into the street riot style and arrested anyone present (whether they were trying to leave or not).&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/rnc/bnc-critmass-bconfisc.jpg&#34; alt=&#34;BNC Critical Mass bike confiscation&#34; title=&#34;BNC Critical Mass bike confiscation&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;As noted by Times-Up organizers, this loss of after-venue and it&amp;rsquo;s effective result in arrest and chaos is a possible first sign of what will happen with RNC protest marches in the face of non-granted Central Park permits.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Update: 8:30pm Eastern&lt;/strong&gt; — &lt;a href=&#34;http://www.nytimes.com/2004/08/28/politics/campaign/28protest.html&#34;&gt;A reasonable NY Times article.&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;My friend Brandon will also be keeping a blog during the RNC, check out &lt;a href=&#34;http://roar.theory.org/&#34;&gt;Learning to Roar&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Sunday</title>
      <link>https://brainsik.net/2004/sunday/</link>
      <pubDate>Mon, 23 Aug 2004 12:08:14 +0000</pubDate>
      <guid>https://brainsik.net/2004/sunday/</guid>
      <description>&lt;p&gt;Before my window. Breeze coming through, blowing across the stripped bed. Birds are chirpping, a harmonica is played, the gospel church sings, and the clocktower slowly bongs 12pm.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Shell variable interpolation</title>
      <link>https://brainsik.net/2004/shell-variable-interpolation/</link>
      <pubDate>Fri, 20 Aug 2004 07:33:17 +0000</pubDate>
      <guid>https://brainsik.net/2004/shell-variable-interpolation/</guid>
      <description>&lt;p&gt;Alright, this is fairly geeky, but I&amp;rsquo;d like to know if there is a better way of doing this.&lt;/p&gt;&#xA;&lt;p&gt;Something I love about &lt;a href=&#34;http://en.wikipedia.org/wiki/Perl&#34;&gt;perl&lt;/a&gt; is how many places it lets you interpolate. Being used to this flexibility, I wanted to do something similar in a shell script (in particular, my &lt;code&gt;.bash_profile&lt;/code&gt;). This is my first stab at it:&lt;/p&gt;&#xA;&lt;p&gt;To interpolate shell variables into a new variable:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#79c0ff&#34;&gt;abc&lt;/span&gt;&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt;`&lt;/span&gt;eval echo &lt;span style=&#34;color:#79c0ff&#34;&gt;\$&lt;/span&gt;&lt;span style=&#34;color:#79c0ff&#34;&gt;$a$b$c&lt;/span&gt;&lt;span style=&#34;color:#a5d6ff&#34;&gt;`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As a side, BASH allows you to do single variable interpolation by: &lt;code&gt;${!var}&lt;/code&gt; .&lt;/p&gt;&#xA;&lt;p&gt;Please let me know if there is a better way!&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Qingdao treats</title>
      <link>https://brainsik.net/2004/qingdao-treats/</link>
      <pubDate>Wed, 07 Jul 2004 17:27:09 +0000</pubDate>
      <guid>https://brainsik.net/2004/qingdao-treats/</guid>
      <description>&lt;p&gt;For sensory experience, last night in Qingdao was pretty golden. A swift jaunt was made to the local Carre 4 — a French company bringing China their version of Walmart. I bought some nice looking green and oolong teas sold in bulk and pitched in to get a cake for Lancelot (it was his birthday). Lancelot is not his real name, but many of the chinese students have created english names (loosely based on their true names) in order to help the westerners stop butchering their language. Similarly, I had someone translate my name into chinese characters so it could be pronounced more easily.&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;span style=&#39;font-size: 4em;&#39;&gt;杰瑞米&lt;span&gt;&lt;/p&gt;&#xA;&lt;!-- ![jeremy pronounced in chinese characters](https://brainsik.theory.org/blog-2003/foto/qingdao/jieruimi.png &#34;jeremy pronounced in chinese characters&#34;) --&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Into the streets we went. The groups fractured and I found myself wandering Qingdao city with Lancelot from Beijing and Allan from Boston. First mission was to find out why there were tapped kegs of beer on so many sidewalks. Two yuan were handed over to someone sitting by a keg and a weighed kilogram of beer in a plastic shopping bag was handed over; along with a wrapped juice straw. A gross distortion of drinking capri-sun back in the day.&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/qingdao/3-04606w.jpg&#34; alt=&#34;beer weighing&#34; title=&#34;beer weighing&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/qingdao/3-04614w.jpg&#34; alt=&#34;allan and lancelot with bags of beer&#34; title=&#34;allan and lancelot with bags of beer&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/qingdao/3-04615w.jpg&#34; alt=&#34;jeremy drinks a bag of beer&#34; title=&#34;jeremy drinks a bag of beer&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Drinking and talking, cultures colliding, we found ourselves next to an array of kebab stands selling various creatures cooked on sticks. Allan eyed the box of wiggling, larvae-like things. Some translations were made by Lancelot and we found they were silk worms. They were very strange to watch. One end of their body was spiraling round and round. Allan decided a new food discovery could not be passed up. 5 for 2 yuan. Onto a wooden stick they silk worms went. A yellow fluid oozed from them. I cringed. A sauce of hot spices was applied with a brush, and onto the grill they went. I ordered squid on a stick, a Qingdao specialty.&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/qingdao/3-04620w.jpg&#34; alt=&#34;workin the kebab shop&#34; title=&#34;workin the kebab shop&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/qingdao/3-04617w.jpg&#34; alt=&#34;live silkworms waiting for their skewer&#34; title=&#34;live silkworms waiting for their skewer&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Allan made little hesitation to try his new found food. He popped a cooked silkworm into his mouth and chewed heartily. “This is fairly disgusting”. He spat the remains into the bushes nearby. I offered some of my squid, which was great. After his bite of squid he said, “you should try the silkworm.” Though his experience offered humor, it did little to entice. “Oh come on,” he persisted, “you can have silkworm with a squid chaser.” I sighed.&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/qingdao/3-04621w.jpg&#34; alt=&#34;silkworm and squid on a stick&#34; title=&#34;silkworm and squid on a stick&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Much hesitation ensued, but I found myself waving a stick of silkworms in front of me until finally, i was chomping down on one. Cooked, leathery flesh compressed between my teeth. The flavor of spice mingled with the fresh silkworm insides squeezed out like toothpaste from a tube. I chewed. It wasn&amp;rsquo;t as bad as I was expecting. It wasn&amp;rsquo;t so good, but it wasn&amp;rsquo;t terrible. It reminded me of scallop you&amp;rsquo;ve been chewing on too long.&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/qingdao/3-04624w.jpg&#34; alt=&#34;jeremy eating the silkworm&#34; title=&#34;jeremy eating the silkworm&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Mango &amp; Mint, part iii</title>
      <link>https://brainsik.net/2004/mango-mint-part-iii/</link>
      <pubDate>Fri, 04 Jun 2004 23:30:20 +0000</pubDate>
      <guid>https://brainsik.net/2004/mango-mint-part-iii/</guid>
      <description>&lt;p&gt;Three infusions were made.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Into vodka was placed mango and mint&lt;/li&gt;&#xA;&lt;li&gt;Into vodka was placed mango, mint and cucumber&lt;/li&gt;&#xA;&lt;li&gt;Into gin was placed mango and a bit of cucumber&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;They all have their pros and cons, though the gin infusion is possibly too strange to be practical.&lt;/p&gt;&#xA;&lt;p&gt;Tonight&amp;rsquo;s cocktail is simple and enlightening: a Rickey made with mango, mint and cucumber infused vodka. It&amp;rsquo;s very nice and heading towards a finale. The next drink should have a small amount of simple syrup (½ teaspoon) to enhance the mango flavor, slices of mango and cucumber, and mint sprigs for garnish.&lt;/p&gt;&#xA;&lt;p&gt;It was surprising how much the lime juice really brought the drink together. Whereas the lime seemed to force out the mango in the Mojango, in this drink it helps settle it in. We&amp;rsquo;ll see what happens when the simple syrup and garnish come into play.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Mango &amp; Mint, part ii</title>
      <link>https://brainsik.net/2004/mango-mint-part-ii/</link>
      <pubDate>Sun, 23 May 2004 23:59:31 +0000</pubDate>
      <guid>https://brainsik.net/2004/mango-mint-part-ii/</guid>
      <description>&lt;p&gt;So we have not so bad, and we have bad. Tonight we had a bit of both and none of the definitely good. I sip upon a mango, chartreuse, vodka cocktail. Of note, color matters: green and yellow are not fine bedfellows, and my browinsh, baby shit colored cocktail tastes intriguing and looks repulsive.&lt;/p&gt;&#xA;&lt;p&gt;When the juicer was whipped out, I knew bad things were in store. But desire for experimentation outweighed theories of chemical concentrations. Mint was juiced into a substance similar to wheat grass. It was a combination of minty and chlorophyll. Mango was juiced into a sludge reminiscent of “juiced” banana. The mixture was colorfully offensive and the flavor a sad attempt at being creative.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://brainsik.net/2004/mojango&#34;&gt;Mojango&lt;/a&gt; was closer to something worth building. New theory: the mango is such a specific flavor, it would be best infused into a clean alcohol like vodka and honored in a subtle way. This means I need to look into the Chartreuse and vodka drinks, because I&amp;rsquo;d really like to find the combination of Chartreuese and mango to swoon my favorite bartender. I&amp;rsquo;m wary of a mango gin because of the strong personalities, but some experimentation will lend insight.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Mojango</title>
      <link>https://brainsik.net/2004/mojango/</link>
      <pubDate>Fri, 21 May 2004 21:48:00 +0000</pubDate>
      <guid>https://brainsik.net/2004/mojango/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Nothing is so bad as that which is not &lt;em&gt;so&lt;/em&gt; bad.&lt;/p&gt;&#xA;&lt;p&gt;— The Scarlet Pimpernel&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Tonight was the first experiment towards a mango &amp;amp; mint cocktail. With only enough light rum for a single drink, the Mojito was chosen as the basis to build upon: fresh mango was muddled with mint, lime, and simple syrup. The lime made me uneasy, but since I&amp;rsquo;m still feeling very lost and new at the art of cocktail creation, I am in a serious data collection role. Learning what flavors mismatch is as interesting as learning which flavors match.&lt;/p&gt;&#xA;&lt;p&gt;The Mojango was a failure as a “mango &amp;amp; mint cocktail”. Although, not so bad, it literally tasted like someone had thrown some mango into a Mojito: there was little sense of a marriage between the mango and the rest of the flavors. The current theory is the problem lies with the lime. The lime brings together the Mojito so well, I&amp;rsquo;m not sure there is room for the mango. Hence, experiment #2: Mango Rum Smash.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Ghetto #1</title>
      <link>https://brainsik.net/2004/ghetto-1/</link>
      <pubDate>Tue, 18 May 2004 17:10:43 +0000</pubDate>
      <guid>https://brainsik.net/2004/ghetto-1/</guid>
      <description>&lt;p&gt;What happens when you run out of ice and your guests are asking for more alcohol? You aim for whatever you got refridgerated. In this case, there was a bottle of sweetened cranberry juice in the fridge.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;These are rough estimates of what probably happened.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;In mixing glass, no ice:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;1-2 part gin&lt;/li&gt;&#xA;&lt;li&gt;1 part freshly squeeze grapefruit&lt;/li&gt;&#xA;&lt;li&gt;2-3 part sweetened cranberry juice (cold)&lt;/li&gt;&#xA;&lt;li&gt;Stir well&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Pour above into cocktail glass:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Add ½ - 1 oz tonic water&lt;/li&gt;&#xA;&lt;li&gt;Stir briefly&lt;/li&gt;&#xA;&lt;li&gt;Add lemon twist&lt;/li&gt;&#xA;&lt;li&gt;Serve with apology&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;While I was building this, I had an idea for a mango-mint drink. Something on the order of a mango mojito, the mojango. Experiment to come.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>evening sykes</title>
      <link>https://brainsik.net/2004/evening-sykes/</link>
      <pubDate>Thu, 01 Apr 2004 10:10:35 +0000</pubDate>
      <guid>https://brainsik.net/2004/evening-sykes/</guid>
      <description>&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/smykesture.jpg&#34; alt=&#34;small, texturous, evening image of river, rocks, trees leading to Sykes hot springs&#34; title=&#34;small, texturous, evening image of river, rocks, trees leading to Sykes hot springs&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>the sound of azuki beans</title>
      <link>https://brainsik.net/2004/the-sound-of-azuki-beans/</link>
      <pubDate>Sat, 06 Mar 2004 18:02:24 +0000</pubDate>
      <guid>https://brainsik.net/2004/the-sound-of-azuki-beans/</guid>
      <description>&lt;p&gt;refamiliarizing myself with the self-healing cookbook, i decided to cook up some &lt;a href=&#34;https://en.wikipedia.org/wiki/Azuki_bean&#34;&gt;azuki beans&lt;/a&gt;. one half-hour into their simmer they should be cold shocked.&lt;/p&gt;&#xA;&lt;p&gt;listening to the beans boil against the pot, i was enjoying the rhythm in which they scraped against the metal vessel. as if the bubbles rattling the beans were coming from a bellows. the sound of submerged, scraping beans was padded with the quiet rumble of escaping vapor. &lt;!-- a nice balance of highs and lows. --&gt;&lt;/p&gt;&#xA;&lt;p&gt;the balance changed over time (as the beans soften, the high-tones degrade). slowly, the highs muted away until finally, the sound of bean scraping metal was gone. then i looked at the time and saw it was the half-hour point. which made me wonder if this was how the half-hour point was chosen.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Ode to Glenna</title>
      <link>https://brainsik.net/2004/ode-to-glenna/</link>
      <pubDate>Thu, 04 Mar 2004 12:02:48 +0000</pubDate>
      <guid>https://brainsik.net/2004/ode-to-glenna/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;pick pick&lt;br/&gt;&#xA;poke poke&lt;br/&gt;&#xA;what&amp;rsquo;s that?&lt;br/&gt;&#xA;oops, it&amp;rsquo;s bleeding.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</description>
    </item>
    <item>
      <title>Rx Gallery: Jiffy-Scuttler Two</title>
      <link>https://brainsik.net/2004/rx-gallery-jiffy-scuttler-two/</link>
      <pubDate>Tue, 02 Mar 2004 11:56:13 +0000</pubDate>
      <guid>https://brainsik.net/2004/rx-gallery-jiffy-scuttler-two/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.rxgallery.com/&#34;&gt;Rx Gallery&lt;/a&gt;: &lt;a href=&#34;http://jiffyscuttler.praemedia.com/&#34;&gt;Jiffy-Scuttler&lt;/a&gt; 2&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/js2/blithesons.jpg&#34; alt=&#34;Blithe Sons&#34; title=&#34;Blithe Sons&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;My favorite artist, &lt;a href=&#34;http://www.23five.org/chasse.html&#34;&gt;Loren Chasse&lt;/a&gt; (front), playing with Glenn Donaldson as The Blithe Sons; absolutely sublime.&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/js2/danielle.jpg&#34; alt=&#34;Danielle DeGruttola on cello&#34; title=&#34;Danielle DeGruttola on cello&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.cs.berkeley.edu/~hodes/danisue/&#34;&gt;Danielle DeGruttola&lt;/a&gt; ripping on her electric cello. Gliding through subtle, experimental sound, classical composition and metal enthused noise.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Rx Gallery: Jiffy-Scuttler One</title>
      <link>https://brainsik.net/2004/rx-gallery-jiffy-scuttler-one/</link>
      <pubDate>Sun, 01 Feb 2004 02:30:46 +0000</pubDate>
      <guid>https://brainsik.net/2004/rx-gallery-jiffy-scuttler-one/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.rxgallery.com/&#34;&gt;Rx Gallery&lt;/a&gt;: &lt;a href=&#34;http://jiffyscuttler.praemedia.com/&#34;&gt;Jiffy-Scuttler&lt;/a&gt; 1&lt;/p&gt;&#xA;&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/rx1/rx1-1.jpg&#34; alt=&#34;rx gallery projection and consoles&#34; title=&#34;rx gallery projection and consoles&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/rx1/rx1-2.jpg&#34; alt=&#34;playing ms. pacman&#34; title=&#34;playing ms. pacman&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/rx1/rx1-3.jpg&#34; alt=&#34;glowing computer on pedestal&#34; title=&#34;glowing computer on pedestal&#34;&gt; &#xA;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/rx1/rx1-4.jpg&#34; alt=&#34;flanged, a couple about to shake hands, video projection in pieces behind&#34; title=&#34;flanged, a couple about to shake hands, video projection in pieces behind&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/rx1/rx1-5.jpg&#34; alt=&#34;rx gallery bar and projection and people&#34; title=&#34;rx gallery bar and projection and people&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;&lt;em&gt;What follows is a failed, forced attempt at descriptive writing:&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Never having heard of &lt;a href=&#34;http://www.sukothai.com/&#34;&gt;Carl Stone&lt;/a&gt; before, I was informed he is one of the original San Francisco electronic + &lt;a href=&#34;http://www.fieldeffects.org/&#34;&gt;field recording&lt;/a&gt; artists. Mr. Stone&amp;rsquo;s full and rich field samples were processed clean and crisp. The warm field recordings, so coolly post-processed, were delicate and satisfying. Sounds were layered onto and into one another with the care of experience; vocal scraps were released within lush shrubs of crunchy static. Transitions between moods were slow and smooth; a few times along the journey, I lost track of where some of the aural personalities had gone.&lt;/p&gt;&#xA;&lt;p&gt;Under this veil of mastery, I expected a complete and whole story. Instead, the end came rather abruptly, devoid of the care I felt sheparding transitions. The unfortunate end made me question the piece as a whole; I was unable to understand the journey I had taken. Was this merely a meandering through the land of electronica, or was there a deeper structure transparent to my naive gaze? Mostly, my disappointment rises from a long-standing issue: the majority of laptop musicians I&amp;rsquo;ve heard don&amp;rsquo;t understand beginning, middle, and end. Particularly, end.&lt;/p&gt;&#xA;&lt;p&gt;The evening concluded with nostalgic visits to 80s era arcade games and consoles: Asteroids, Missile Command, Pole Position II, an Atari 2600 (which I still have in my grandmother&amp;rsquo;s home), and more. The games, open for free play, are part of &lt;a href=&#34;http://www.rxgallery.com/&#34;&gt;Rx Gallery&lt;/a&gt;‘s current exhibition by &lt;a href=&#34;http://www.blasthaus.com/bolt_manifesto.html&#34;&gt;the BOLT&lt;/a&gt;: A Low Tech Odyssey.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Saturday Morning Grey Sky, San Francisco</title>
      <link>https://brainsik.net/2004/saturday-morning-grey-sky-san-francisco/</link>
      <pubDate>Sat, 24 Jan 2004 13:52:06 +0000</pubDate>
      <guid>https://brainsik.net/2004/saturday-morning-grey-sky-san-francisco/</guid>
      <description>&lt;div align=&#34;center&#34;&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://brainsik.theory.org/blog-2003/foto/brkfst040124.jpg&#34; alt=&#34;quiet breakfast in san francisco&#34; title=&#34;quiet breakfast in san francisco&#34;&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;(For amusement, &lt;a href=&#34;http://www.google.com/search?q=grey+gray+spelling&#34;&gt;Google for “grey gray spelling”&lt;/a&gt;)&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Boogaloo</title>
      <link>https://brainsik.net/2004/boogaloo/</link>
      <pubDate>Tue, 20 Jan 2004 08:02:10 +0000</pubDate>
      <guid>https://brainsik.net/2004/boogaloo/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;The dance basically means to do simple weird movements with your feet, hips and body (kinda like speaking in tongues, in dancing). It makes sense only to the dancer who is doing it at the moment. A good example is James Brown.&lt;/p&gt;&#xA;&lt;p&gt;— &lt;a href=&#34;http://www.streetswing.com/histmain/z3bogal1.htm&#34;&gt;Sonny Watson&amp;rsquo;s Dance History&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</description>
    </item>
    <item>
      <title>Revelation of Possibility</title>
      <link>https://brainsik.net/2004/revelation-of-possibility/</link>
      <pubDate>Tue, 06 Jan 2004 13:39:10 +0000</pubDate>
      <guid>https://brainsik.net/2004/revelation-of-possibility/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;ah. well, it reminds me of when i get that rush in my chest, as if a giant wave of water and oxygen and possibility were moving through me, connecting me to the past, the future, and other beings.&lt;/p&gt;&#xA;&lt;p&gt;— &lt;a href=&#34;http://squashco.com/&#34;&gt;Sasha&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;What some of us tech steeped peoples go through from time to time when we think about the possibilities of social technology. A great revelation of the possibility of things. Naively, i feel it is akin to something like &lt;a href=&#34;http://www.dict.org/bin/Dict?Form=Dict2&amp;amp;Database=*&amp;amp;Query=satori&#34;&gt;satori&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I want to believe this feeling is related to the process of cellularization and interconnection we see in the natural world. That there is a similarity between why we find the view from a mountain top so beautiful and the idea of beings becoming increasingly interconnected so exhilirating. I like to believe it is a deep recognition of an underlying, universal structure.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Germane to recent life philosophies.</title>
      <link>https://brainsik.net/2003/germane-to-recent-life-philosophies/</link>
      <pubDate>Tue, 30 Dec 2003 12:42:29 +0000</pubDate>
      <guid>https://brainsik.net/2003/germane-to-recent-life-philosophies/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Only those who dare to fail greatly can ever achieve greatly.&lt;/p&gt;&#xA;&lt;p&gt;— Robert F. Kennedy&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;It&amp;rsquo;s more rewarding biking through a crowded street rather sitting in a padded cyclo. Though both are surely interesting.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Putting People in Possession of Knowledge</title>
      <link>https://brainsik.net/2003/putting-people-in-possession-of-knowledge/</link>
      <pubDate>Fri, 26 Dec 2003 14:33:35 +0000</pubDate>
      <guid>https://brainsik.net/2003/putting-people-in-possession-of-knowledge/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;It is one thing to show a man that he is in error, and another to put him in possession of truth.&lt;/p&gt;&#xA;&lt;p&gt;— John Locke&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This quote reminds me how knowledge is passed around in geek communities. It is not enough to explain that someone is wrong, we tend to require backup (references) of our claims and sometimes will forgo even the mention of why someone is wrong and just yellout “&lt;a href=&#34;http://www.dict.org/bin/Dict?Form=Dict2&amp;amp;Database=*&amp;amp;Query=RTFM&#34;&gt;RTFM&lt;/a&gt;!”.&lt;/p&gt;&#xA;&lt;p&gt;It appears this line of reasoning is also becoming a staple in grassroot organizations. It is the mantra of &lt;a href=&#34;http://www.truthout.org/&#34;&gt;truthout&lt;/a&gt; (where the quote was found), can be seen as the footnotes in the &lt;a href=&#34;http://www.misleader.org/&#34;&gt;Daily Misleader&lt;/a&gt;, and was one of the operating principles in the &lt;a href=&#34;http://www.mattgonzalez.com/&#34;&gt;Matt Gonzalez&lt;/a&gt; mayorial campaign&amp;rsquo;s attempt to educate the voters (instead of muckrake the opponent).&lt;/p&gt;&#xA;&lt;p&gt;Perhaps a product of an online world where providing reference links is part of our writing system and a response to the &lt;a href=&#34;http://www.dict.org/bin/Dict?Form=Dict2&amp;amp;Database=vera&amp;amp;Query=fud&#34;&gt;FUD&lt;/a&gt; we find ourselves constantly bombarded by.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Dancing Sand Grains, Ringing Earth</title>
      <link>https://brainsik.net/2003/dancing-sand-grains-ringing-earth/</link>
      <pubDate>Mon, 22 Dec 2003 18:20:06 +0000</pubDate>
      <guid>https://brainsik.net/2003/dancing-sand-grains-ringing-earth/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;For an earthquake this size, every single sand grain on the planet dances to the music of those seismic waves. You may not be able to feel them, but the entire planet is rung like a bell.&lt;/p&gt;&#xA;&lt;p&gt;— &lt;a href=&#34;https://web.archive.org/web/20031205165805/http://quake.wr.usgs.gov/research/deformation/modeling/people/ross.html&#34;&gt;Ross Stein&lt;/a&gt;, &lt;a href=&#34;https://web.archive.org/web/20040119112339/http://www.reuters.com/newsArticle.jhtml?type=scienceNews&amp;amp;storyID=4034355&#34;&gt;Calif. Earthquake Rang Planet ‘Like a Bell’&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</description>
    </item>
  </channel>
</rss>
