<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://relvokcor.xyz/~brennen">
  <title>http://relvokcor.xyz/~brennen</title>
  <link rel="alternate" href="http://relvokcor.xyz/~brennen" type="text/html"/>
  <entry xml:base="http://relvokcor.xyz/~brennen">
    <title>Changes since 2014-12-16T03:25:09</title>
    <link rel="alternate" href="http://relvokcor.xyz/~brennen" type="text/html"/>
    <content type="html">&lt;h2&gt;Monday, December 15&lt;/h2&gt;&lt;p&gt;Text editors I have known and loved:&lt;a href="https://en.wikipedia.org/wiki/Pfs:Write"&gt;pfs:Write&lt;/a&gt;&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Pfs:Write"&gt;pfs:Write&lt;/a&gt; for DOS&lt;li&gt;DOS Edit / QBasic&lt;li&gt;Notepad&lt;sup&gt;1&lt;/sup&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;li&gt;Pico&lt;li&gt;BBEdit&lt;li&gt;Some weird Windows thing that had a bunch of menus of HTML tags built in&lt;li&gt;The super-90s-Windowsy text controls embedded in mIRC&lt;li&gt;XEmacs&lt;li&gt;Vim&lt;p&gt;Games I really liked:&lt;li&gt;That one where you were a little smiley face and you went around the dungeon finding artefacts and sometimes typing things like &lt;tt&gt;DRINK POTION&lt;/tt&gt;.&lt;tt&gt;DRINK POTION&lt;/tt&gt;&lt;li&gt;That one where you were a little smiley face and you went around the dungeon finding artefacts and sometimes typing things like &lt;tt&gt;DRINK POTION&lt;/tt&gt;.&lt;li&gt;The first super-pixelly &lt;i&gt;Commander Keen&lt;/i&gt;, with the little green Vorticons running around.&lt;i&gt;Commander Keen&lt;/i&gt;&lt;li&gt;The first super-pixelly &lt;i&gt;Commander Keen&lt;/i&gt;, with the little green Vorticons running around.&lt;i&gt;Cosmo&amp;#39;s Cosmic Adventure&lt;/i&gt;&lt;li&gt;That artillery game on the Apple ][ where you had little castles shooting at each other.&lt;i&gt;Scorched Earth&lt;/i&gt;&lt;li&gt;&lt;i&gt;Scorched Earth&lt;/i&gt;, where little tanks shot at each other.&lt;i&gt;Worms&lt;/i&gt;&lt;li&gt;&lt;i&gt;Worms&lt;/i&gt;, where a bunch of little worms shot at each other.&lt;sup&gt;2&lt;/sup&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;i&gt;Bolo&lt;/i&gt;&lt;li&gt;&lt;i&gt;Bolo&lt;/i&gt;, where little tanks shot at each other but it was top-down and real-time and there was a Little Green Man to do your bidding and it was &lt;i&gt;networked multiplayer&lt;/i&gt;.&lt;i&gt;networked multiplayer&lt;/i&gt;&lt;li&gt;&lt;i&gt;Bolo&lt;/i&gt;, where little tanks shot at each other but it was top-down and real-time and there was a Little Green Man to do your bidding and it was &lt;i&gt;networked multiplayer&lt;/i&gt;.&lt;i&gt;Taipan&lt;/i&gt;&lt;li&gt;&lt;i&gt;Taipan&lt;/i&gt;, where you had a merchant ship and shot at pirates.&lt;i&gt;Tempest&lt;/i&gt;&lt;li&gt;&lt;i&gt;Tempest&lt;/i&gt;, which featured both shooting and abstract colorful shapes.&lt;i&gt;Spy Hunter&lt;/i&gt;&lt;li&gt;&lt;i&gt;Spy Hunter&lt;/i&gt; on the NES. Also the version of &lt;i&gt;Spy Hunter&lt;/i&gt; at the Pizza Hut in Wayne, NE.&lt;i&gt;Spy Hunter&lt;/i&gt;&lt;li&gt;&lt;i&gt;Spy Hunter&lt;/i&gt; on the NES. Also the version of &lt;i&gt;Spy Hunter&lt;/i&gt; at the Pizza Hut in Wayne, NE.&lt;sup&gt;1&lt;/sup&gt;&lt;small&gt;&lt;sup&gt;1&lt;/sup&gt; Ok to be fair I never actually loved Notepad.&lt;/small&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;small&gt;&lt;sup&gt;2&lt;/sup&gt; I&amp;#39;ve never really warmed to subsequent entries in this (enormously successful) series. They all struck me as the wrong kind of cartoony. I think this is a lesson in how the constraints on an aesthetic can force it into channels more broadly appealing than the same artists will later find with bigger budgets and greater technological capacity. Either that or a lesson on how weirdos like me often prefer low-res hackery. Either way, there is probably an analogy to country music and George Lucas somewhere in here.&lt;/small&gt;&lt;h2&gt;Sunday, December 14&lt;/h2&gt;&lt;p&gt;Here&amp;#39;s an interesting little thing: &lt;a href="http://protocol.club/~datagrok/beta-wiki/tdp.html"&gt;Tilde Description Protocol&lt;/a&gt;.&lt;a href="http://protocol.club/~datagrok/beta-wiki/tdp.html"&gt;Tilde Description Protocol&lt;/a&gt;&lt;p&gt;Here&amp;#39;s an interesting little thing: &lt;a href="http://protocol.club/~datagrok/beta-wiki/tdp.html"&gt;Tilde Description Protocol&lt;/a&gt;.&lt;p&gt;I have the following going in relation to this:&lt;a href="http://squiggle.city/tilde.json"&gt;squiggle.city/tilde.json&lt;/a&gt;&lt;a href="http://squiggle.city/tilde.txt"&gt;squiggle.city/tilde.txt&lt;/a&gt;&lt;a href="http://squiggle.city/users.json"&gt;squiggle.city/users.json&lt;/a&gt;&lt;a href="http://squiggle.city/users.txt"&gt;squiggle.city/users.txt&lt;/a&gt;&lt;a href="https://githug.com/squigglecity/squiggle.city"&gt;squiggle.city repo with listusers.pl&lt;/a&gt;</content>
    <author>
      <name>brennen@relvokcor.xyz</name>
    </author>
    <id>930e704e-c171-3390-aca1-544006414bf6</id>
    <published>2014-12-16T03:25:09Z</published>
    <updated>2014-12-16T03:25:09Z</updated>
  </entry>
  <entry xml:base="http://relvokcor.xyz/~brennen">
    <title>Changes since 2014-12-10T02:42:49</title>
    <link rel="alternate" href="http://relvokcor.xyz/~brennen" type="text/html"/>
    <content type="html">&lt;h2&gt;Tuesday, December 9&lt;/h2&gt;&lt;p&gt;A few sections in &lt;a href="http://squiggle.city/~brennen/workings-book/"&gt;workings&lt;/a&gt;:&lt;a href="http://squiggle.city/~brennen/workings-book/"&gt;workings&lt;/a&gt;&lt;p&gt;A few sections in &lt;a href="http://squiggle.city/~brennen/workings-book/"&gt;workings&lt;/a&gt;:&lt;a href="http://squiggle.city/~brennen/workings-book/#makecitizen-wednesday-december-3-2014"&gt;on a script to make new users&lt;/a&gt;&lt;a href="http://squiggle.city/~brennen/workings-book/#single-board-computers"&gt;on messing around with single-board computers&lt;/a&gt;&lt;a href="http://squiggle.city/~brennen/workings-book/#namespaces-scope"&gt;on namespaces &amp;amp; scope&lt;/a&gt;&lt;p&gt;In more interesting news, a bunch of people have asked for squiggle.city accounts lately. That&amp;#39;s pretty cool. I do wish I knew how to encourage more people who aren&amp;#39;t demographically within a couple of degrees of me to sign up.</content>
    <author>
      <name>brennen@relvokcor.xyz</name>
    </author>
    <id>b966ce5f-56ee-325e-9050-7fa141142a4c</id>
    <published>2014-12-10T02:42:49Z</published>
    <updated>2014-12-10T02:42:49Z</updated>
  </entry>
  <entry xml:base="http://relvokcor.xyz/~brennen">
    <title>Changes since 2014-12-06T20:23:53</title>
    <link rel="alternate" href="http://relvokcor.xyz/~brennen" type="text/html"/>
    <content type="html">&lt;p&gt;&lt;a href="feed.xml" title="an atom feed of updates"&gt;feed&lt;/a&gt; | &lt;a href="http://squiggle.city/"&gt;squiggle.city&lt;/a&gt; | &lt;a href="http://relvokcor.xyz/"&gt;relvokcor.xyz&lt;/a&gt; | &lt;a href="https://p1k3.com/" title="a blog"&gt;p1k3&lt;/a&gt; | &lt;a href="https://p1k3.com/userland-book/" title="a book about the command line for humans"&gt;userland&lt;/a&gt; | &lt;a href="http://squiggle.city/~brennen/workings-book/" title="a technical notebook"&gt;workings&lt;/a&gt;&lt;a href="http://squiggle.city/~brennen/workings-book/" title="a technical notebook"&gt;workings&lt;/a&gt;&lt;hr /&gt;&lt;h2&gt;Saturday, December 6&lt;/h2&gt;&lt;p&gt;I just started a new project that I&amp;#39;m going to host on squiggle.city: &lt;a href="http://squiggle.city/~brennen/workings-book/"&gt;&lt;i&gt;workings&lt;/i&gt;&lt;/a&gt; is an attempt at an ongoing technical notebook. I plan for it to get huge, and expect it to be really boring, if you&amp;#39;re not me. Hopefully it will be useful for remembering stuff I do, and a place for the rough notes on things I&amp;#39;m going to turn into finished writing later.&lt;i&gt;workings&lt;/i&gt;&lt;p&gt;I just started a new project that I&amp;#39;m going to host on squiggle.city: &lt;a href="http://squiggle.city/~brennen/workings-book/"&gt;&lt;i&gt;workings&lt;/i&gt;&lt;/a&gt; is an attempt at an ongoing technical notebook. I plan for it to get huge, and expect it to be really boring, if you&amp;#39;re not me. Hopefully it will be useful for remembering stuff I do, and a place for the rough notes on things I&amp;#39;m going to turn into finished writing later.&lt;p&gt;This idea owes something to an experience I had in jr. high and highschool of being required to keep a daily logbook for science classes. (Ed Brogie, if you ever google yourself, here&amp;#39;s a little ego bump for you, which I will temper by observing that the &lt;a href="http://en.wikipedia.org/wiki/Bloom%27s_taxonomy#Cognitive"&gt;Bloom&amp;#39;s taxonomy&lt;/a&gt; trip you were on was really weird and probably super counterproductive - but hey, at least you tried to get people to write every day.)&lt;a href="http://en.wikipedia.org/wiki/Bloom%27s_taxonomy#Cognitive"&gt;Bloom&amp;#39;s taxonomy&lt;/a&gt;&lt;p&gt;This idea owes something to an experience I had in jr. high and highschool of being required to keep a daily logbook for science classes. (Ed Brogie, if you ever google yourself, here&amp;#39;s a little ego bump for you, which I will temper by observing that the &lt;a href="http://en.wikipedia.org/wiki/Bloom%27s_taxonomy#Cognitive"&gt;Bloom&amp;#39;s taxonomy&lt;/a&gt; trip you were on was really weird and probably super counterproductive - but hey, at least you tried to get people to write every day.)&lt;p&gt;I could put this kind of effort into contributing on Stack Exchange or something, but doing &lt;a href="https://p1k3.com/userland-book/"&gt;userland&lt;/a&gt; showed me that I really like the &lt;i&gt;idea&lt;/i&gt; of a book as a container for effort, and anyway I can&amp;#39;t stand all that gamified bullshit with roaming packs of vicious procedure jockeys constantly assailing useful questions and answers as incorrectly framed, categorized, or imagined. This kind of thing is also why I no longer invest time in the bureaucratic hell that is the machinery of Wikipedia. Life is just too short and time too precious.&lt;a href="https://p1k3.com/userland-book/"&gt;userland&lt;/a&gt;&lt;p&gt;I could put this kind of effort into contributing on Stack Exchange or something, but doing &lt;a href="https://p1k3.com/userland-book/"&gt;userland&lt;/a&gt; showed me that I really like the &lt;i&gt;idea&lt;/i&gt; of a book as a container for effort, and anyway I can&amp;#39;t stand all that gamified bullshit with roaming packs of vicious procedure jockeys constantly assailing useful questions and answers as incorrectly framed, categorized, or imagined. This kind of thing is also why I no longer invest time in the bureaucratic hell that is the machinery of Wikipedia. Life is just too short and time too precious.&lt;i&gt;idea&lt;/i&gt;&lt;p&gt;I could put this kind of effort into contributing on Stack Exchange or something, but doing &lt;a href="https://p1k3.com/userland-book/"&gt;userland&lt;/a&gt; showed me that I really like the &lt;i&gt;idea&lt;/i&gt; of a book as a container for effort, and anyway I can&amp;#39;t stand all that gamified bullshit with roaming packs of vicious procedure jockeys constantly assailing useful questions and answers as incorrectly framed, categorized, or imagined. This kind of thing is also why I no longer invest time in the bureaucratic hell that is the machinery of Wikipedia. Life is just too short and time too precious.</content>
    <author>
      <name>brennen@relvokcor.xyz</name>
    </author>
    <id>2b5df380-4cd4-383a-847c-a956a6dd5454</id>
    <published>2014-12-06T20:23:53Z</published>
    <updated>2014-12-06T20:23:53Z</updated>
  </entry>
  <entry xml:base="http://relvokcor.xyz/~brennen">
    <title>Changes since 2014-12-03T15:27:34</title>
    <link rel="alternate" href="http://relvokcor.xyz/~brennen" type="text/html"/>
    <content type="html">&lt;h2&gt;Tuesday, December 2&lt;/h2&gt;&lt;p&gt;There&amp;#39;s a list of updated pages on the &lt;a href="http://squiggle.city/"&gt;squiggle.city home page&lt;/a&gt;, generated from &lt;a href="#2014-11-12"&gt;a script&lt;/a&gt;. For a while, I was updating this by deleting it and running a vim command to pull it back in:&lt;a href="http://squiggle.city/"&gt;squiggle.city home page&lt;/a&gt;&lt;p&gt;There&amp;#39;s a list of updated pages on the &lt;a href="http://squiggle.city/"&gt;squiggle.city home page&lt;/a&gt;, generated from &lt;a href="#2014-11-12"&gt;a script&lt;/a&gt;. For a while, I was updating this by deleting it and running a vim command to pull it back in:&lt;a href="#2014-11-12"&gt;a script&lt;/a&gt;&lt;p&gt;There&amp;#39;s a list of updated pages on the &lt;a href="http://squiggle.city/"&gt;squiggle.city home page&lt;/a&gt;, generated from &lt;a href="#2014-11-12"&gt;a script&lt;/a&gt;. For a while, I was updating this by deleting it and running a vim command to pull it back in:&lt;code&gt;
:r !perl listusers.pl
      &lt;/code&gt;&lt;p&gt;I wanted to make this automatic. In the old days, I would have turned on Server Side Includes in Apache and written something kind of like:&lt;code&gt;
&amp;lt;!--#exec cmd=&amp;quot;perl /var/www/listusers.pl&amp;quot; --&amp;gt;
      &lt;/code&gt;&lt;p&gt;Unfortunately, squiggle.city is running nginx, and while nginx is pretty groovy these days, its SSI module only does includes, not execs. What I settled on instead is this include directive:&lt;code&gt;
&amp;lt;!--# include file=&amp;quot;listusers.html&amp;quot; --&amp;gt;
      &lt;/code&gt;&lt;p&gt;Coupled with typing &lt;code&gt;su www-data&lt;/code&gt;, followed by &lt;code&gt;crontab -e&lt;/code&gt; and adding this:&lt;code&gt;su www-data&lt;/code&gt;&lt;p&gt;Coupled with typing &lt;code&gt;su www-data&lt;/code&gt;, followed by &lt;code&gt;crontab -e&lt;/code&gt; and adding this:&lt;code&gt;crontab -e&lt;/code&gt;&lt;p&gt;Coupled with typing &lt;code&gt;su www-data&lt;/code&gt;, followed by &lt;code&gt;crontab -e&lt;/code&gt; and adding this:&lt;code&gt;
# m h  dom mon dow   command
0,5,15,25,45 * * * *    perl /var/www/listusers.pl &amp;gt; /var/www/listusers.html
      &lt;/code&gt;&lt;p&gt;Which should refresh the list on minutes 0, 5, 15, 25, and 45 of every hour. (The intervals are arbitrary. I just kind of felt like those were the right minutes.)&lt;p&gt;There is pretty good &lt;a href="http://nginx.org/en/docs/http/ngx_http_ssi_module.html"&gt;documentation&lt;/a&gt; on enabling the nginx ssi module and writing directives for it. I just had to do this in &lt;code&gt;/etc/nginx/sites-enabled/default&lt;/code&gt;:&lt;a href="http://nginx.org/en/docs/http/ngx_http_ssi_module.html"&gt;documentation&lt;/a&gt;&lt;p&gt;There is pretty good &lt;a href="http://nginx.org/en/docs/http/ngx_http_ssi_module.html"&gt;documentation&lt;/a&gt; on enabling the nginx ssi module and writing directives for it. I just had to do this in &lt;code&gt;/etc/nginx/sites-enabled/default&lt;/code&gt;:&lt;code&gt;/etc/nginx/sites-enabled/default&lt;/code&gt;&lt;p&gt;There is pretty good &lt;a href="http://nginx.org/en/docs/http/ngx_http_ssi_module.html"&gt;documentation&lt;/a&gt; on enabling the nginx ssi module and writing directives for it. I just had to do this in &lt;code&gt;/etc/nginx/sites-enabled/default&lt;/code&gt;:&lt;code&gt;
      location /index.html {
              ssi on;
      }
      &lt;/code&gt;&lt;h2&gt;Monday, December 1&lt;/h2&gt;&lt;p&gt;I&amp;#39;m out on the plains for a few days.&lt;p&gt;It&amp;#39;s a strange season in a strange century. The news cycle is still working the kind of groove that feels like it would fit pretty well in the opening infodump of a film about the collapse of civilization. (You can practically hear Godspeed swelling over the measured tones of NPR personalities and the stridencies of ChristoRepubliFascistCatholiFamilyTalk radio alike, complete with little bursts of punctuating static.)&lt;p&gt;And then on the other hand, things are not so abnormal as all that. My cousins are having babies. My sisters are getting married. The people who were my age when I first knew them are twice my age now.</content>
    <author>
      <name>brennen@relvokcor.xyz</name>
    </author>
    <id>5b27a0a4-dad4-3a2c-979b-ae44d441ca58</id>
    <published>2014-12-03T15:27:34Z</published>
    <updated>2014-12-03T15:27:34Z</updated>
  </entry>
  <entry xml:base="http://relvokcor.xyz/~brennen">
    <title>Changes since 2014-11-26T22:34:16</title>
    <link rel="alternate" href="http://relvokcor.xyz/~brennen" type="text/html"/>
    <content type="html">&lt;h2&gt;Wednesday, November 27, 12:27 p.m.&lt;/h2&gt;&lt;p&gt;It turns out there&amp;#39;s now an IHOP attached to the Flying J Limon, CO. I think this is a relatively new establishment, but truck stops have a way of aging in quickly, so it&amp;#39;s hard to tell.&lt;p&gt;I&amp;#39;m having the quick two-egg breakfast, eggs over medium, bacon, wheat toast. The eggs are pretty much actually over medium, which is a thing you can&amp;#39;t always rely on.</content>
    <author>
      <name>brennen@relvokcor.xyz</name>
    </author>
    <id>5c684666-8f9f-35a0-aecc-0b9252dd1d39</id>
    <published>2014-11-26T22:34:16Z</published>
    <updated>2014-11-26T22:34:16Z</updated>
  </entry>
  <entry xml:base="http://relvokcor.xyz/~brennen">
    <title>Changes since 2014-11-25T12:04:49</title>
    <link rel="alternate" href="http://relvokcor.xyz/~brennen" type="text/html"/>
    <content type="html">&lt;h2&gt;Tuesday, November 25, early a.m.&lt;/h2&gt;&lt;a href="https://github.com/stars/brennen"&gt;Things I have starred on GitHub&lt;/a&gt;&lt;p&gt;&lt;a href="https://github.com/stars/brennen"&gt;Things I have starred on GitHub&lt;/a&gt;.&lt;p&gt;A thing about lists like this: They&amp;#39;re often full of touchstones for personal memory. Here&amp;#39;s me getting worried about e-mail. Here&amp;#39;s me keeping an eye on the big boss. Here&amp;#39;s when &lt;a href="http://danacoalition.org/"&gt;Erik Winn&lt;/a&gt; died. Here&amp;#39;s that &lt;a href="https://p1k3.com/2014/1/14"&gt;detour&lt;/a&gt; into weird text editors. Here&amp;#39;s that &lt;a href="https://github.com/sinker/tacofancy"&gt;taco thing&lt;/a&gt;, when they &lt;a href="https://www.metafilter.com/125946/Google-Illiterate#4870602"&gt;closed&lt;/a&gt; Google Reader, that &lt;a href="https://www.youtube.com/watch?v=mzL04B9WPQg"&gt;day with the model train&lt;/a&gt;...&lt;a href="http://danacoalition.org/"&gt;Erik Winn&lt;/a&gt;&lt;p&gt;A thing about lists like this: They&amp;#39;re often full of touchstones for personal memory. Here&amp;#39;s me getting worried about e-mail. Here&amp;#39;s me keeping an eye on the big boss. Here&amp;#39;s when &lt;a href="http://danacoalition.org/"&gt;Erik Winn&lt;/a&gt; died. Here&amp;#39;s that &lt;a href="https://p1k3.com/2014/1/14"&gt;detour&lt;/a&gt; into weird text editors. Here&amp;#39;s that &lt;a href="https://github.com/sinker/tacofancy"&gt;taco thing&lt;/a&gt;, when they &lt;a href="https://www.metafilter.com/125946/Google-Illiterate#4870602"&gt;closed&lt;/a&gt; Google Reader, that &lt;a href="https://www.youtube.com/watch?v=mzL04B9WPQg"&gt;day with the model train&lt;/a&gt;...&lt;a href="https://p1k3.com/2014/1/14"&gt;detour&lt;/a&gt;&lt;p&gt;A thing about lists like this: They&amp;#39;re often full of touchstones for personal memory. Here&amp;#39;s me getting worried about e-mail. Here&amp;#39;s me keeping an eye on the big boss. Here&amp;#39;s when &lt;a href="http://danacoalition.org/"&gt;Erik Winn&lt;/a&gt; died. Here&amp;#39;s that &lt;a href="https://p1k3.com/2014/1/14"&gt;detour&lt;/a&gt; into weird text editors. Here&amp;#39;s that &lt;a href="https://github.com/sinker/tacofancy"&gt;taco thing&lt;/a&gt;, when they &lt;a href="https://www.metafilter.com/125946/Google-Illiterate#4870602"&gt;closed&lt;/a&gt; Google Reader, that &lt;a href="https://www.youtube.com/watch?v=mzL04B9WPQg"&gt;day with the model train&lt;/a&gt;...&lt;a href="https://github.com/sinker/tacofancy"&gt;taco thing&lt;/a&gt;&lt;p&gt;A thing about lists like this: They&amp;#39;re often full of touchstones for personal memory. Here&amp;#39;s me getting worried about e-mail. Here&amp;#39;s me keeping an eye on the big boss. Here&amp;#39;s when &lt;a href="http://danacoalition.org/"&gt;Erik Winn&lt;/a&gt; died. Here&amp;#39;s that &lt;a href="https://p1k3.com/2014/1/14"&gt;detour&lt;/a&gt; into weird text editors. Here&amp;#39;s that &lt;a href="https://github.com/sinker/tacofancy"&gt;taco thing&lt;/a&gt;, when they &lt;a href="https://www.metafilter.com/125946/Google-Illiterate#4870602"&gt;closed&lt;/a&gt; Google Reader, that &lt;a href="https://www.youtube.com/watch?v=mzL04B9WPQg"&gt;day with the model train&lt;/a&gt;...&lt;a href="https://www.metafilter.com/125946/Google-Illiterate#4870602"&gt;closed&lt;/a&gt;&lt;p&gt;A thing about lists like this: They&amp;#39;re often full of touchstones for personal memory. Here&amp;#39;s me getting worried about e-mail. Here&amp;#39;s me keeping an eye on the big boss. Here&amp;#39;s when &lt;a href="http://danacoalition.org/"&gt;Erik Winn&lt;/a&gt; died. Here&amp;#39;s that &lt;a href="https://p1k3.com/2014/1/14"&gt;detour&lt;/a&gt; into weird text editors. Here&amp;#39;s that &lt;a href="https://github.com/sinker/tacofancy"&gt;taco thing&lt;/a&gt;, when they &lt;a href="https://www.metafilter.com/125946/Google-Illiterate#4870602"&gt;closed&lt;/a&gt; Google Reader, that &lt;a href="https://www.youtube.com/watch?v=mzL04B9WPQg"&gt;day with the model train&lt;/a&gt;...&lt;a href="https://www.youtube.com/watch?v=mzL04B9WPQg"&gt;day with the model train&lt;/a&gt;&lt;p&gt;A thing about lists like this: They&amp;#39;re often full of touchstones for personal memory. Here&amp;#39;s me getting worried about e-mail. Here&amp;#39;s me keeping an eye on the big boss. Here&amp;#39;s when &lt;a href="http://danacoalition.org/"&gt;Erik Winn&lt;/a&gt; died. Here&amp;#39;s that &lt;a href="https://p1k3.com/2014/1/14"&gt;detour&lt;/a&gt; into weird text editors. Here&amp;#39;s that &lt;a href="https://github.com/sinker/tacofancy"&gt;taco thing&lt;/a&gt;, when they &lt;a href="https://www.metafilter.com/125946/Google-Illiterate#4870602"&gt;closed&lt;/a&gt; Google Reader, that &lt;a href="https://www.youtube.com/watch?v=mzL04B9WPQg"&gt;day with the model train&lt;/a&gt;...&lt;h2&gt;Monday, November 24&lt;/h2&gt;&lt;a href="https://p1k3.com/2014/11/24"&gt;On not spamming&lt;/a&gt;&lt;p&gt;&lt;a href="https://p1k3.com/2014/11/24"&gt;On not spamming&lt;/a&gt;.</content>
    <author>
      <name>brennen@relvokcor.xyz</name>
    </author>
    <id>dda1cbfb-2cd0-3d46-8df1-9191c2569b1c</id>
    <published>2014-11-25T12:04:49Z</published>
    <updated>2014-11-25T12:04:49Z</updated>
  </entry>
  <entry xml:base="http://relvokcor.xyz/~brennen">
    <title>Changes since 2014-11-23T00:11:58</title>
    <link rel="alternate" href="http://relvokcor.xyz/~brennen" type="text/html"/>
    <content type="html">&lt;h1&gt;~brennen&lt;/h1&gt;&lt;hr /&gt;&lt;h2&gt;Saturday, November 22&lt;/h2&gt;&lt;p&gt;So as we were drinking beers yesterday, &lt;a href="http://squiggle.city/~stilldavid"&gt;~stilldavid&lt;/a&gt; pointed out that you should be able to mail everyone on the server.&lt;a href="http://squiggle.city/~stilldavid"&gt;~stilldavid&lt;/a&gt;&lt;p&gt;So as we were drinking beers yesterday, &lt;a href="http://squiggle.city/~stilldavid"&gt;~stilldavid&lt;/a&gt; pointed out that you should be able to mail everyone on the server.&lt;p&gt;I figured this should be pretty easy, but it took more googling and grepping and general head-scratching than I really would have liked to remember that &lt;code&gt;/etc/aliases&lt;/code&gt; is a file which exists, and then to determine that the version of exim installed here supports a line like this one:&lt;code&gt;/etc/aliases&lt;/code&gt;&lt;p&gt;I figured this should be pretty easy, but it took more googling and grepping and general head-scratching than I really would have liked to remember that &lt;code&gt;/etc/aliases&lt;/code&gt; is a file which exists, and then to determine that the version of exim installed here supports a line like this one:&lt;code&gt;
citizens: acg,ahava,ben,berkay,brennen,bri_huang,burnedboard,casey,danlyke,delio,drun,erik,fazol,frencil,hord,ianremsen,jbd,jenleelind,jimblom,joe,kache2k,kirstenrk,leducmills,mike,mshorter,nallen,nick,nightliz,pearcebot,randy,robacarp,sgmustadio,sibicle,skk,stilldavid,thcipriani,todd,tonicorinne,trevor,typexawesome,zinefer
      &lt;/code&gt;&lt;p&gt;...which means that if you&amp;#39;re logged into squiggle.city, you can write to citizens@squiggle.city in your mailer of choice and we should all see your message.&lt;p&gt;Send some e-mail?&lt;h2&gt;Friday, November 21&lt;/h2&gt;&lt;a href="http://squiggle.city/~robacarp"&gt;Pretty good answer&lt;/a&gt;&lt;p&gt;&lt;a href="http://squiggle.city/~robacarp"&gt;Pretty good answer&lt;/a&gt;.</content>
    <author>
      <name>brennen@relvokcor.xyz</name>
    </author>
    <id>0cda411b-9b32-31ad-9edc-bfcd17b05842</id>
    <published>2014-11-23T00:11:58Z</published>
    <updated>2014-11-23T00:11:58Z</updated>
  </entry>
  <entry xml:base="http://relvokcor.xyz/~brennen">
    <title>Changes since 2014-11-20T14:50:50</title>
    <link rel="alternate" href="http://relvokcor.xyz/~brennen" type="text/html"/>
    <content type="html">&lt;title&gt;~brennen: QUESTION FOR ROBACARP&lt;/title&gt;&lt;hr /&gt;&lt;hr /&gt;&lt;h2&gt;Wednesday, November 19&lt;/h2&gt;&lt;p&gt;Hey &lt;a href="http://squiggle.city/~robacarp"&gt;~robacarp&lt;/a&gt;, long-time listener, first-time caller here. I just have a couple of questions for you and then I&amp;#39;ll take my response off the air, thanks:&lt;a href="http://squiggle.city/~robacarp"&gt;~robacarp&lt;/a&gt;&lt;p&gt;Hey &lt;a href="http://squiggle.city/~robacarp"&gt;~robacarp&lt;/a&gt;, long-time listener, first-time caller here. I just have a couple of questions for you and then I&amp;#39;ll take my response off the air, thanks:&lt;li&gt;Where the heck do you get lanolin? Is this just a &amp;quot;now we have the internet and you can mail order literally anything&amp;quot; phenomenon, or is there a kind of store you go to and they have lanolin in a jar on the shelf like some kind of normal thing that you would normally buy in a store?&lt;li&gt;Second, and really Rob this is more of a comment, but second, isn&amp;#39;t there an &amp;quot;i&amp;quot; in &amp;quot;manifesto&amp;quot;?</content>
    <author>
      <name>brennen@relvokcor.xyz</name>
    </author>
    <id>370a6eda-c400-300a-b955-d92babda13ca</id>
    <published>2014-11-20T14:50:50Z</published>
    <updated>2014-11-20T14:50:50Z</updated>
  </entry>
  <entry xml:base="http://relvokcor.xyz/~brennen">
    <title>Changes since 2014-11-18T12:34:58</title>
    <link rel="alternate" href="http://relvokcor.xyz/~brennen" type="text/html"/>
    <content type="html">&lt;h2&gt;Monday, November 17&lt;/h2&gt;&lt;p&gt;Here are &lt;a href="http://squiggle.city/~brennen/drawrings/"&gt;some drawings&lt;/a&gt;.&lt;a href="http://squiggle.city/~brennen/drawrings/"&gt;some drawings&lt;/a&gt;&lt;p&gt;Here are &lt;a href="http://squiggle.city/~brennen/drawrings/"&gt;some drawings&lt;/a&gt;.&lt;hr /&gt;&lt;script&gt;
       // This is a jQuery convention for calling this function when
       // the document's ready, pretty much.  Some things about jQuery
       // still annoy me, but honestly it's just really nice to have
       // around in general:

       $(function () {
         // syntax highlighting - see http://shjs.sourceforge.net/
         // I was going to use http://prismjs.com/, which seems neat,
         // but that one doesn't come with Perl highlighting out of the
         // box, and the thing I wanted to highlight was a Perl script.
         // This one's been around for a while, and seems to do a pretty
         // nice job, really.
         sh_highlightDocument();

         $('#hidebody').click(function () {
           $('section').hide();
         });

         // A really simple p5.js sketch - google p5.js:
         var s1 = function(sketch) {
           var square, world;

           var handle_bounce = function () {
             world.bounces++;

             if (Math.random() &gt; .3) {
               randomitup();
             }
           };

           var randomitup = function () {
             square.step  = Math.random() * ($(window).height() / 18);
             square.size  = Math.random() * world.max_square_size;

             square.red   = Math.round(Math.random() * 255);
             square.green = Math.round(Math.random() * 255);
             square.blue  = Math.round(Math.random() * 255);

             // occasionally, reset the world
             if ((world.bounces &gt; world.minimum_bounces) &amp;&amp; (Math.random() &gt; .95)) {
               world.do_a_reset = true;
             }
           };

           sketch.setup = function() {
             world = {
               bounces: 0,
               minimum_bounces: Math.round(Math.random() * 400),

               // size of the canvas
               width: $(window).width(),
               height: $(window).height(),

               // background fill
               background_color: sketch.color(
                 Math.round(Math.random() * 255),
                 Math.round(Math.random() * 255),
                 Math.round(Math.random() * 255)
               )
             };

             // how big can the box get in this world?
             world.max_square_size = Math.round((world.width / 5) * Math.random());

             if (typeof console.log !== undefined) {
               console.log(world);
             }

             square = {
               // where we draw the box
               x: Math.random() * world.width,
               y: Math.random() * world.height,

               // what we add to x &amp; y to move the box
               x_mover: Math.random() - Math.random(),
               y_mover: Math.random() - Math.random()
             };

             randomitup();
             sketch.createCanvas(world.width, world.height);
             sketch.background(world.background_color);
             sketch.fill(255);
           };

           sketch.draw = function() {

             if (world.do_a_reset) {
               world.do_a_reset = false;
               world.bounces = 0;
               sketch.setup();
             }

             if (square.x &gt; world.width) {
               square.x_mover = 0 - (Math.random());
               handle_bounce();
             }

             if (square.y &gt; world.height) {
               square.y_mover = 0 - (Math.random());
               handle_bounce();
             }

             if (square.x &lt;= 0) {
               square.x_mover = Math.random();
               handle_bounce();
             }

             if (square.y &lt;= 0) {
               square.y_mover = Math.random();
               handle_bounce();
             }

             square.x += square.x_mover * square.step;
             square.y += square.y_mover * square.step;

             sketch.push();
               sketch.stroke(square.red, square.green, square.blue);
               sketch.fill(square.red, square.green, square.blue);
               sketch.rect(square.x, square.y, square.size, square.size);
             sketch.pop();
           };
         };

         var s2 = function(sketch) {
           var square, world;

           var handle_bounce = function () {
             world.bounces++;

             if (Math.random() &gt; .3) {
               randomitup();
             }
           };

           var randomitup = function () {
             var color_space = 255;

             square.step  = Math.random() * ($(window).height() / 15);
             square.size  = Math.random() * world.max_square_size;

             square.red   = Math.round(Math.random() * color_space);
             square.green = Math.round(Math.random() * color_space);
             square.blue  = Math.round(Math.random() * color_space);
           };

           sketch.setup = function() {
             world = {
               bounces: 0,

               // size of the canvas
               width: $(window).width(),
               height: $(window).height(),

               // background fill
               background_color: sketch.color(
                 Math.round(Math.random() * 255),
                 Math.round(Math.random() * 255),
                 Math.round(Math.random() * 255)
               )
             };

             // how big can the box get in this world?
             world.max_square_size = Math.round((world.width / 4) * Math.random());

             if (typeof console.log !== undefined) {
               console.log(world);
             }

             square = {
               // where we draw the box
               x: Math.random() * world.width,
               y: Math.random() * world.height,

               // what we add to x &amp; y to move the box
               x_mover: Math.random() - Math.random(),
               y_mover: Math.random() - Math.random()
             };

             randomitup();
             sketch.createCanvas(world.width, world.height);
             sketch.background(world.background_color);
             sketch.fill(255);
           };

           sketch.draw = function() {

             var bounced = false;

             if (square.x &gt; world.width) {
               square.x_mover = 0 - (Math.random());
               bounced = true;
             }

             if (square.y &gt; world.height) {
               square.y_mover = 0 - (Math.random());
               bounced = true;
             }

             if (square.x &lt;= 0) {
               square.x_mover = Math.random();
               bounced = true;
             }

             if (square.y &lt;= 0) {
               square.y_mover = Math.random();
               bounced = true;
             }

             if (bounced) {
               handle_bounce();
             }

             square.x += (square.x_mover * square.step);
             square.y += (square.y_mover * square.step);

             sketch.push();
               sketch.stroke(square.red, square.green, square.blue);
               sketch.fill(square.red, square.green, square.blue);
               sketch.rect(square.x, square.y, square.size, square.size);
             sketch.pop();
           };
         };

         var myp5;
         if (Math.random() &gt; .5) {
           myp5 = new p5(s1, 'squiggleCanvas');
         } else {
           myp5 = new p5(s2, 'squiggleCanvas');
         }

         $(window).resize(function () {
           myp5.setup();
         });
       });
     &lt;/script&gt;</content>
    <author>
      <name>brennen@relvokcor.xyz</name>
    </author>
    <id>0060eed2-d3f3-3a1c-9265-be764b39a54a</id>
    <published>2014-11-18T12:34:58Z</published>
    <updated>2014-11-18T12:34:58Z</updated>
  </entry>
  <entry xml:base="http://relvokcor.xyz/~brennen">
    <title>Changes since 2014-11-16T20:39:05</title>
    <link rel="alternate" href="http://relvokcor.xyz/~brennen" type="text/html"/>
    <content type="html">&lt;button id="hidebody"&gt;hide text&lt;/button&gt;&lt;hr /&gt;&lt;p&gt;In which I install a MUSH engine:&lt;hr /&gt;&lt;p&gt;If you have JavaScript turned on, &lt;del&gt;this&lt;/del&gt; the background of this page should be a silly &lt;a href="http://p5js.org/"&gt;p5.js&lt;/a&gt; doodle.&lt;del&gt;this&lt;/del&gt;&lt;p&gt;If you have JavaScript turned on, &lt;del&gt;this&lt;/del&gt; the background of this page should be a silly &lt;a href="http://p5js.org/"&gt;p5.js&lt;/a&gt; doodle.&lt;hr /&gt;&lt;p&gt;If you have JavaScript turned on, &lt;del&gt;this&lt;/del&gt; the background of this page should be a silly &lt;a href="http://p5js.org/"&gt;p5.js&lt;/a&gt; doodle.&lt;hr /&gt;&lt;script&gt;
       // This is a jQuery convention for calling this function when
       // the document's ready, pretty much.  Some things about jQuery
       // still annoy me, but honestly it's just really nice to have
       // around in general:

       $(function () {
         // syntax highlighting - see http://shjs.sourceforge.net/
         // I was going to use http://prismjs.com/, which seems neat,
         // but that one doesn't come with Perl highlighting out of the
         // box, and the thing I wanted to highlight was a Perl script.
         // This one's been around for a while, and seems to do a pretty
         // nice job, really.
         sh_highlightDocument();

         $('#hidebody').click(function () {
           $('section').hide();
         });

         // A really simple p5.js sketch - google p5.js:
         var s = function(sketch) {
           var square, world;

           var handle_bounce = function () {
             world.bounces++;

             if (Math.random() &gt; .3) {
               randomitup();
             }
           };

           var randomitup = function () {
             square.step  = Math.random() * ($(window).height() / 18);
             square.size  = Math.random() * world.max_square_size;

             square.red   = Math.round(Math.random() * 255);
             square.green = Math.round(Math.random() * 255);
             square.blue  = Math.round(Math.random() * 255);

             // occasionally, reset the world
             if ((world.bounces &gt; world.minimum_bounces) &amp;&amp; (Math.random() &gt; .95)) {
               world.do_a_reset = true;
             }
           };

           sketch.setup = function() {
             world = {
               bounces: 0,
               minimum_bounces: Math.round(Math.random() * 400),

               // size of the canvas
               width: $(window).width(),
               height: $(window).height(),

               // background fill
               background_color: sketch.color(
                 Math.round(Math.random() * 255),
                 Math.round(Math.random() * 255),
                 Math.round(Math.random() * 255)
               )
             };

             // how big can the box get in this world?
             world.max_square_size = Math.round((world.width / 5) * Math.random());

             if (typeof console.log !== undefined) {
               console.log(world);
             }

             square = {
               // where we draw the box
               x: Math.random() * world.width,
               y: Math.random() * world.height,

               // what we add to x &amp; y to move the box
               x_mover: Math.random() - Math.random(),
               y_mover: Math.random() - Math.random()
             };

             randomitup();
             sketch.createCanvas(world.width, world.height);
             sketch.background(world.background_color);
             sketch.fill(255);
           };

           sketch.draw = function() {

             if (world.do_a_reset) {
               world.do_a_reset = false;
               world.bounces = 0;
               sketch.setup();
             }

             if (square.x &gt; world.width) {
               square.x_mover = 0 - (Math.random());
               handle_bounce();
             }

             if (square.y &gt; world.height) {
               square.y_mover = 0 - (Math.random());
               handle_bounce();
             }

             if (square.x &lt;= 0) {
               square.x_mover = Math.random();
               handle_bounce();
             }

             if (square.y &lt;= 0) {
               square.y_mover = Math.random();
               handle_bounce();
             }

             square.x += square.x_mover * square.step;
             square.y += square.y_mover * square.step;

             sketch.push();
               sketch.stroke(square.red, square.green, square.blue);
               sketch.fill(square.red, square.green, square.blue);
               sketch.rect(square.x, square.y, square.size, square.size);
             sketch.pop();
           };
         };

         var myp5 = new p5(s, 'squiggleCanvas');

         $(window).resize(function () {
           myp5.setup();
         });
       });
     &lt;/script&gt;</content>
    <author>
      <name>brennen@relvokcor.xyz</name>
    </author>
    <id>f7ab3d1b-a543-33fb-8b2e-6634f8cc76f8</id>
    <published>2014-11-16T20:39:05Z</published>
    <updated>2014-11-16T20:39:05Z</updated>
  </entry>
  <entry xml:base="http://relvokcor.xyz/~brennen">
    <title>Changes since 2014-11-16T04:26:44</title>
    <link rel="alternate" href="http://relvokcor.xyz/~brennen" type="text/html"/>
    <content type="html">&lt;h2&gt;Saturday, November 15, evening&lt;/h2&gt;&lt;code&gt;

TOPICS

  Help available on the following Topics:

  $-COMMANDS               ARBITRARY COMMANDS       ATTRIBUTE OWNERSHIP
  BEING KILLED             BOGUS COMMANDS           BOOLEAN VALUES
  COMMAND EVALUATION       COMSYS                   CONTROL
  COSTS                    CREDITS                  DROP-TO
  ENACTOR                  EXITS                    FAILURE
  FLAG LIST                FLAGS                    FUNCTION LIST
  FUNCTIONS                GENDER                   GOALS
  HERE                     HOMES                    LINKING
  LISTENING                LISTS                    LOOPING
  ME                       MONEY                    MOVING
  OBJECT TYPES             PARENT OBJECTS           PARENT ROOMS
  PIPING                   POWERS LIST              PUEBLO
  PUPPETS                  REGEXPS                  ROBBERY
  SEARCH CLASSES           SEMAPHORES               SPOOFING
  STACK                    SUBSTITUTIONS            SUCCESS
  SWITCHES                 USER-DEFINED COMMANDS    VERBS
  WIZARDS                  ZONES

help wizards
WIZARDS

  Wizards are the people that help run the game and make sure that everything
  is working properly.  They have special powers to tweak reality in ways
  mortals can only dream of.  Be nice to them, they are going out of their
  way to help keep the game running smoothly. And remember, if you have any
  problems or just want to talk to someone, they will be there for you as
  well.


      &lt;/code&gt;&lt;p&gt;Yesssssssssssssss.&lt;h2&gt;Saturday, November 15, afternoon&lt;/h2&gt;&lt;hr /&gt;&lt;p&gt;For folks with squiggle.city pages, there are a few resources at &lt;a href="http://squiggle.city/js/"&gt;squiggle.city/js/&lt;/a&gt; if you&amp;#39;d like to include jQuery, p5.js, or syntax highlighting on your pages without cluttering your &lt;code&gt;~/public_html&lt;/code&gt; or relying on somebody&amp;#39;s CDN.&lt;hr /&gt;&lt;script&gt;
       // This is a jQuery convention for calling this function when
       // the document's ready, pretty much.  Some things about jQuery
       // still annoy me, but honestly it's just really nice to have
       // around in general:

       $(function () {
         // syntax highlighting - see http://shjs.sourceforge.net/
         // I was going to use http://prismjs.com/, which seems neat,
         // but that one doesn't come with Perl highlighting out of the
         // box, and the thing I wanted to highlight was a Perl script.
         // This one's been around for a while, and seems to do a pretty
         // nice job, really.
         sh_highlightDocument();

         // A really simple p5.js sketch - google p5.js:
         var s = function(sketch) {
           var square = {
             // where we draw the box
             x: 1,
             y: 1,

             // what we add to x &amp; y to move the box
             x_mover: 1,
             y_mover: 1
           };

           var world = {
             // size of the canvas
             width: 300,
             height: 400,
             background_color: sketch.color(
               Math.round(Math.random() * 255),
               Math.round(Math.random() * 255),
               Math.round(Math.random() * 255)
             ),

             // how big can the box get?
             max_square_size: 50 * Math.random()
           };

           var randomitup_sometimes = function () {
             if (Math.random() &gt; .3) {
               randomitup();
             }
           };

           var randomitup = function () {
             square.step         = Math.random() * 20;
             square.size  = Math.random() * world.max_square_size;
             square.red   = Math.round(Math.random() * 255);
             square.green = Math.round(Math.random() * 255);
             square.blue  = Math.round(Math.random() * 255);
           };

           sketch.setup = function() {
             randomitup();
             sketch.createCanvas(world.width, world.height);
             sketch.background(world.background_color);
             sketch.fill(255);
           };

           sketch.draw = function() {

             if (square.x &gt; world.width) {
               square.x_mover = 0 - (Math.random());
               randomitup_sometimes();
             }

             if (square.y &gt; world.height) {
               square.y_mover = 0 - (Math.random());
               randomitup_sometimes();
             }

             if (square.x &lt;= 0) {
               square.x_mover = Math.random();
               randomitup_sometimes();
             }

             if (square.y &lt;= 0) {
               square.y_mover = Math.random();
               randomitup_sometimes();
             }

             square.x += square.x_mover * square.step;
             square.y += square.y_mover * square.step;

             sketch.push();
               sketch.stroke(square.red, square.green, square.blue);
               sketch.fill(square.red, square.green, square.blue);
               sketch.rect(square.x, square.y, square.size, square.size);
             sketch.pop();
           };
         };

         var myp5 = new p5(s, 'squiggleCanvas');
       });
     &lt;/script&gt;</content>
    <author>
      <name>brennen@relvokcor.xyz</name>
    </author>
    <id>9f9f9116-00a4-33f8-9029-4e43e34f2c40</id>
    <published>2014-11-16T04:26:44Z</published>
    <updated>2014-11-16T04:26:44Z</updated>
  </entry>
  <entry xml:base="http://relvokcor.xyz/~brennen">
    <title>Changes since 2014-11-16T01:16:22</title>
    <link rel="alternate" href="http://relvokcor.xyz/~brennen" type="text/html"/>
    <content type="html">&lt;h2&gt;Saturday, November 15&lt;/h2&gt;&lt;p&gt;If you have JavaScript turned on, this should be a silly &lt;a href="http://p5js.org/"&gt;p5.js&lt;/a&gt; doodle:&lt;a href="http://p5js.org/"&gt;p5.js&lt;/a&gt;&lt;p&gt;If you have JavaScript turned on, this should be a silly &lt;a href="http://p5js.org/"&gt;p5.js&lt;/a&gt; doodle:&lt;p&gt;For folks with squiggle.city pages, there are a now a few resources at &lt;a href="http://squiggle.city/js/"&gt;squiggle.city/js/&lt;/a&gt; if you&amp;#39;d like to include jQuery, p5.js, or syntax highlighting on your pages without cluttering your &lt;code&gt;~/public_html&lt;/code&gt; or relying on somebody&amp;#39;s CDN.&lt;a href="http://squiggle.city/js/"&gt;squiggle.city/js/&lt;/a&gt;&lt;p&gt;For folks with squiggle.city pages, there are a now a few resources at &lt;a href="http://squiggle.city/js/"&gt;squiggle.city/js/&lt;/a&gt; if you&amp;#39;d like to include jQuery, p5.js, or syntax highlighting on your pages without cluttering your &lt;code&gt;~/public_html&lt;/code&gt; or relying on somebody&amp;#39;s CDN.&lt;code&gt;~/public_html&lt;/code&gt;&lt;p&gt;For folks with squiggle.city pages, there are a now a few resources at &lt;a href="http://squiggle.city/js/"&gt;squiggle.city/js/&lt;/a&gt; if you&amp;#39;d like to include jQuery, p5.js, or syntax highlighting on your pages without cluttering your &lt;code&gt;~/public_html&lt;/code&gt; or relying on somebody&amp;#39;s CDN.&lt;hr /&gt;&lt;code&gt;
#!/usr/bin/perl

use strict;
use warnings;
use 5.10.0;

# we&amp;#39;ll use this to filter out people who haven&amp;#39;t logged in.
# pretty silly!
my %whitelist;
my (@lastlog) = split /\n/, `lastlog | grep -v Never | awk &amp;#39;{ print \$1; }&amp;#39;`;
foreach my $user (@lastlog) {
  $whitelist{$user} = 1;
}

opendir(my $dh, &amp;#39;/home/&amp;#39;)
  or die &amp;quot;could not open /home/: $!&amp;quot;;

my %dirs;
my %titles;
while (my $dir = readdir $dh) {
  next if $dir =~ /^[.]/;
  next unless $whitelist{$dir};

  my $index_html_path = &amp;quot;/home/$dir/public_html/index.html&amp;quot;;

  if (-e $index_html_path) {
    $dirs{$dir} = (stat $index_html_path)[9]; # mtime
    $titles{$dir} = get_title_from_file($index_html_path);
  }
}
close $dh;

sub sort_by_time {
   $dirs{$b} &amp;lt;=&amp;gt; $dirs{$a};
}

my $list = &amp;quot;&amp;lt;table&amp;gt;\n&amp;quot;;
foreach my $key (sort sort_by_time (keys(%dirs))) {
   $list .= &amp;#39;  &amp;lt;tr&amp;gt;&amp;#39;
          . &amp;#39;&amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;/~&amp;#39; . $key . &amp;#39;/&amp;quot;&amp;gt;~&amp;#39; . $key . &amp;#39;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;#39;
          . &amp;#39;&amp;lt;td&amp;gt;&amp;#39; . $titles{$key} . &amp;#39;&amp;lt;/td&amp;gt;&amp;#39;
          . &amp;#39;&amp;lt;td class=tiny&amp;gt;&amp;#39; . $dirs{$key} . &amp;#39;&amp;lt;/td&amp;gt;&amp;#39;
          . &amp;quot;&amp;lt;/tr&amp;gt;\n&amp;quot;;
}

$list .= &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;

say $list;

sub get_title_from_file {
  my ($filespec) = @_;
  my $html = slurp($filespec);

  if ($html =~ m{&amp;lt;title&amp;gt;(.*?)&amp;lt;/title&amp;gt;}is) {
    return $1;
  }
  return &amp;#39;&amp;#39;;
}

sub slurp {
  my ($file) = @_;
  my $everything;

  open my $fh, &amp;#39;&amp;lt;&amp;#39;, $file
    or die &amp;quot;Couldn&amp;#39;t open $file: $!\n&amp;quot;;

  # line separator:
  local $/ = undef;
  $everything = &amp;lt;$fh&amp;gt;;

  close $fh
    or die &amp;quot;Couldn&amp;#39;t close $file: $!&amp;quot;;

  return $everything;
}
      &lt;/code&gt;&lt;hr /&gt;&lt;script&gt;
       // This is a jQuery convention for calling this function when
       // the document's ready, pretty much.  Some things about jQuery
       // still annoy me, but honestly it's just really nice to have
       // around in general:

       $(function () {
         // syntax highlighting - see http://shjs.sourceforge.net/
         // I was going to use http://prismjs.com/, which seems neat,
         // but that one doesn't come with Perl highlighting out of the
         // box, and the thing I wanted to highlight was a Perl script.
         // This one's been around for a while, and seems to do a pretty
         // nice job, really.
         sh_highlightDocument();

         // A really simple p5.js sketch - google p5.js:
         var s = function(sketch) {
           // where we draw the box
           var x = 1;
           var y = 1;

           // what we add to x &amp; y to move the box
           var x_mover = 1;
           var y_mover = 1;

           // size of the canvas
           var width = 300;
           var height = 400;

           // various color params, movement step
           var square_size, square_red, square_green, square_blue,
               step;

           var background_color = sketch.color(
             Math.round(Math.random() * 255),
             Math.round(Math.random() * 255),
             Math.round(Math.random() * 255)
           );

           // how big can the box get?
           var max_square_size = 50 * Math.random();


           var randomitup = function () {
             step = Math.random() * 20;
             square_size = Math.random() * max_square_size;
             square_red = Math.round(Math.random() * 255);
             square_green = Math.round(Math.random() * 255);
             square_blue = Math.round(Math.random() * 255);
           };


           sketch.setup = function() {
             randomitup();
             sketch.createCanvas(width, height);
             sketch.background(background_color);
             sketch.fill(255);
           };

           sketch.draw = function() {

             if (x &gt; width) {
               x_mover = 0 - (Math.random());
               randomitup();
             }

             if (y &gt; height) {
               y_mover = 0 - (Math.random());
               randomitup();
             }

             if (x &lt;= 0) {
               x_mover = Math.random();
               randomitup();
             }

             if (y &lt;= 0) {
               y_mover = Math.random();
               randomitup();
             }

             x += x_mover * step;
             y += y_mover * step;

             sketch.push();
               sketch.stroke(square_red, square_green, square_blue);
               sketch.fill(square_red, square_green, square_blue);
               sketch.rect(x, y, square_size, square_size);
             sketch.pop();
           };
         };

         var myp5 = new p5(s, 'squiggleCanvas');
       });
     &lt;/script&gt;</content>
    <author>
      <name>brennen@relvokcor.xyz</name>
    </author>
    <id>67c966a2-5acc-3f09-973d-b2e006eb9176</id>
    <published>2014-11-16T01:16:22Z</published>
    <updated>2014-11-16T01:16:22Z</updated>
  </entry>
</feed>
