<?xml version="1.0"?>
<rss version="2.0">
  <channel>
    <title>Advogato blog for joey</title>
    <link>http://www.advogato.org/person/joey/</link>
    <description>Advogato blog for joey</description>
    <language>en-us</language>
    <generator>mod_virgule</generator>
    <pubDate>Fri, 10 Feb 2012 16:34:03 GMT</pubDate>
    <item>
      <pubDate>Fri, 3 Feb 2012 21:11:06 GMT</pubDate>
      <title>more on ghc filename encodings</title>
      <link>http://www.advogato.org/person/joey/diary.html?start=481</link>
      <guid>http://kitenet.net/~joey/blog/entry/more_on_ghc_filename_encodings/</guid>
      <description>&lt;p&gt;My &lt;a href="http://kitenet.net/~joey/blog/./entry/unicode_ate_my_homework/" &gt;last post&lt;/a&gt; missed an important thing about
GHC 7.4's handling of encodings for FileName. It can in fact be safe to use
FilePath to write a command like &lt;code&gt;rm&lt;/code&gt;. This is because GHC internally uses
a special encoding for FilePath data, that is documented to allow
"arbitrary undecodable bytes to be round-tripped through it". (It seems to
do this by encoding the undecodable bytes as very high unicode code
points.) So, when presented with a filename that cannot be decoded using
utf-8 (or whatever the system encoding is), it still handles it, and using
the resulting FilePath will in fact operate on the right file. Whew!&lt;/p&gt;

&lt;p&gt;Moral of the story is that if you're going to be using GHC 7.4 to read or
write filenames from a pipe, or a file, you need to arrange for the Handle
you're reading or writing to use this special encoding too.
I use this to set up my Handles:&lt;/p&gt;

&lt;pre&gt;
  &lt;code&gt;import System.IO
import GHC.IO.Encoding
import GHC.IO.Handle

fileEncoding :: Handle -&amp;gt; IO ()
fileEncoding h = hSetEncoding h =&amp;lt;&amp;lt; getFileSystemEncoding
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;Even if you're only going to write a FilePath to stdout, you
need to do this. Otherwise, your program will crash on some filenames!
This doesn't seem quite right to me, but I hesitate to file a bug report.
(And this is not a new problem in GHC anyway.)
If I did, it would have this testcase:&lt;/p&gt;

&lt;pre&gt;
  &lt;code&gt;# touch "me&#xA1;"
# LANG=C ghc
Prelude&amp;gt; :m System.Directory
Prelude System.Directory&amp;gt; mapM_ putStrLn =&amp;lt;&amp;lt; getDirectoryContents "."
me*** Exception: &amp;lt;stdout&amp;gt;: hPutChar: invalid argument (invalid character)
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;Since git-annex reads lots of filenames from git commands and other places,
I had to deal with this extensively. Unfortunatly I have not found a way to
read Text from a Handle using the fileSystemEncoding. So I'm stuck with
slow Strings. But, it does seem to work now.&lt;/p&gt;

&lt;hr/&gt;&lt;p&gt;PS: I found a bug in GHC 7.4 today where one of those famous Haskell
immutable values seems to get well, mutated. Specifically a [FilePath]
that is non-empty at the top of a function ends up empty at the bottom.
Unless IO is done involving it at the top. Really.
Hope to develop a test case soon. Happily, the code that triggered it
did so while working around a bug in GHC that is &lt;em&gt;fixed&lt;/em&gt; in 7.4.
Language bugs.. gotta love em.&lt;/p&gt;</description>
    </item>
    <item>
      <pubDate>Thu, 2 Feb 2012 23:11:08 GMT</pubDate>
      <title>unicode ate my homework</title>
      <link>http://www.advogato.org/person/joey/diary.html?start=480</link>
      <guid>http://kitenet.net/~joey/blog/entry/unicode_ate_my_homework/</guid>
      <description>&lt;p&gt;I've just spent several days trying to adapt git-annex to changes in ghc
4.7's handling of unicode in filenames. And by spent, I mean, time
withdrawn from the bank, and frittered away.&lt;/p&gt;

&lt;p&gt;In kindergarten, the top of the classrom wall was encircled by the aA bB
cC of the alphabet. I'll bet they still put that up on the walls.
And all the kids who grow up to become involved with computers learn
that was a lie. The alphabet doesn't stop at zZ. It wouldn't all fit
on a wall anymore.&lt;/p&gt;

&lt;p&gt;So we're in a transition period, where we've all learnt deeply the
alphabet, but the reality is much more complicated. And the collision
between that intuitive sense of the world and the real world makes things
more complicated still. And so, until we get much farther along in this
transition period, you have to be very lucky indeed to not have wasted
time dealing with that complexity, or at least having encountered
&lt;a href="https://en.wikimedia.org/wiki/Mojibake" &gt;Mojibake&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Most of the pain centers around programming languages, and libraries,
which are all at different stages of the transition from ascii
and other legacy encodings to unicode.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;If you're using C, you likely deal with all characters as raw bytes,
and rely on the backwards compatability built into UTF-8, or you
go to long lengths to manually deal with wide characters, so you can
intelligently manipulate strings. The transition has barely begin,
and will, apparently, never end.&lt;/li&gt;
&lt;li&gt;If you're using perl (at least like I do in ikiwiki), everything
is (probably) unicode internally, but every time you call a library
or do IO you have to manually deal with conversions, that are generally
not even documented. You constantly find new encoding bugs.
(If you're lucky, you don't find outright language bugs... I have.)
You're at a very uncomfortable midpoint of the transition.&lt;/li&gt;
&lt;li&gt;If you're using haskell, or probably lots of other languages like python
and ruby, everything is unicode all the time.. except for when it's not.&lt;/li&gt;
&lt;li&gt;If you're using javascript, the transition is basically complete.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;My most recent pain is because the haskell GHC compiler is moving along
in the transition, getting closer to the end. Or at least finishing
the second 80% and moving into the third 80%. (This is not a quick
transition..)&lt;/p&gt;

&lt;p&gt;The change involves filename encodings, a situation that, at least on unix
systems, is a vast mess of its own. Any filename, anywhere, can be in any
encoding, and there's no way to know what's the right one, if you dislike
guessing.&lt;/p&gt;

&lt;p&gt;Haskell folk like strongly typed stuff, so this ambiguity about what type
of data is contained in a &lt;code&gt;FilePath&lt;/code&gt; type was surely anathama. So GHC is
changing to always use UTF-8 for operations on &lt;code&gt;FilePath&lt;/code&gt;.
(Or whatever the system encoding is set to, but let's just assume it's
UTF-8.)&lt;/p&gt;

&lt;p&gt;Which is great and all, unless you need to write a Haskell program
that can deal with arbitrary files. Let's say you want to delete
a file. Just a simple &lt;code&gt;rm&lt;/code&gt;. Now there are two problems:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;The input filename is assumed to be in the system encoding aka unicode.
What if it cannot be validly interpreted in that encoding?
Probably your &lt;code&gt;rm&lt;/code&gt; throws an exception.&lt;/li&gt;
&lt;li&gt;Once the &lt;code&gt;FilePath&lt;/code&gt; is loaded, it's been decoded to unicode characters.
In order to call &lt;code&gt;unlink&lt;/code&gt;, these have to be re-encoded to get a
filename. Will that be the same bytes as the input filename and the
filename on disk? Possibly not, and then the &lt;code&gt;rm&lt;/code&gt; will delete the wrong
thing, or fail.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;But haskell people are smart, so they thought of this problem, and provided
a separate type that can deal with it. &lt;code&gt;RawFilePath&lt;/code&gt; hearks back to
kindergarten; the filename is simply a series of bytes with no encoding.
Which means it cannot be converted to a &lt;code&gt;FilePath&lt;/code&gt; without encountering the
above problems. But does let you write a safe &lt;code&gt;rm&lt;/code&gt; in ghc 4.7.&lt;/p&gt;

&lt;p&gt;So I set out to make something more complicated than a rm, that still needs
to deal with arbitrary filename encodings. And I soon saw it would be
problimatic. Because the things ghc can do with &lt;code&gt;RawFilePaths&lt;/code&gt; are limited.
It can't even split the directory from the filename. We often do need to
manipulate filenames in such ways, even if we don't know their encoding,
when we're doing something more complicated than &lt;code&gt;rm&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you use a library that does anything useful with &lt;code&gt;FilePath&lt;/code&gt;, it's not
available for &lt;code&gt;RawFilePath&lt;/code&gt;. If you used standard haskell stuff like
&lt;code&gt;readFile&lt;/code&gt; and &lt;code&gt;writeFile&lt;/code&gt;, it's not available for &lt;code&gt;RawFilePath&lt;/code&gt; either.
Enjoy your low-level POSIX interface!&lt;/p&gt;

&lt;p&gt;So, I went lowlevel, and wrote my own &lt;code&gt;RawFilePath&lt;/code&gt; versions of pretty much
all of &lt;code&gt;System.FilePath&lt;/code&gt;, and &lt;code&gt;System.Directory&lt;/code&gt;, and parts of &lt;code&gt;MissingH&lt;/code&gt;
and other libraries. (And noticed that I can understand all this Haskell
code.. yay!) And I got it close enough to working that, I'm sure,
if I wanted to chase type errors for a week, I could get git-annex, with
ghc 4.7, to fully work on any encoding of filenames.&lt;/p&gt;

&lt;p&gt;But, now I'm left wondering what to do, because all this work is
regressive; it's swimming against the tide of the transition. GHC's
change is certainly the right change to make for most programs, that are
not like &lt;code&gt;rm&lt;/code&gt;. And so most programs and libraries won't use &lt;code&gt;RawFilePath&lt;/code&gt;.
This risks leaving a program that does a fish out of water.&lt;/p&gt;

&lt;p&gt;At this point, I'm inclined to make git-annex support only unicode (or the
system encoding). That's &lt;em&gt;easy&lt;/em&gt;. And maybe have a branch that uses
&lt;code&gt;RawFilePath&lt;/code&gt;, in a hackish and type-unsafe way, with no guarantees
of correctness, for those who really need it.&lt;/p&gt;

&lt;hr/&gt;&lt;p&gt;Previously: &lt;a href="http://kitenet.net/~joey/blog/./entry/unicode_eye_chart/" &gt;unicode eye chart&lt;/a&gt; &lt;a href="http://kitenet.net/~joey/blog/./entry/wanted_on_a_bumper_sticker/" &gt;wanted on a bumper sticker&lt;/a&gt; &lt;a href="http://kitenet.net/~joey/blog/./entry/abc/" &gt;abc&lt;/a&gt;
&lt;a href="http://kitenet.net/~joey/blog/./entry/boxes/" &gt;boxes&lt;/a&gt; &lt;a href="http://kitenet.net/~joey/blog/./entry/unpacking_boxes/" &gt;unpacking boxes&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <pubDate>Thu, 26 Jan 2012 05:11:45 GMT</pubDate>
      <title>announcing github-backup</title>
      <link>http://www.advogato.org/person/joey/diary.html?start=479</link>
      <guid>http://kitenet.net/~joey/blog/entry/announcing_github-backup/</guid>
      <description>&lt;p&gt;Partly as a followup to &lt;a href="http://kitenet.net/~joey/blog/./entry/a_Github_survey/" &gt;a Github survey&lt;/a&gt;, and partly because
I had a free evening and the need to write more haskell code, any haskell
code, I present to you,
&lt;strong&gt;&lt;a href="https://github.com/joeyh/github-backup" &gt;github-backup&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;github-backup is a simple tool you run in a git repository you cloned from
Github. It backs up everything Github knows about the repository, including
other forks, issues, comments, milestones, pull requests, and watchers.&lt;/p&gt;

&lt;p&gt;This is all stored &lt;em&gt;in&lt;/em&gt; the repository, as regular files, on a "github"
branch.&lt;/p&gt;

&lt;p&gt;Available in Cabal now, in Debian maybe if someone packages
&lt;a href="http://hackage.haskell.org/package/github" &gt;haskell-github&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <pubDate>Sat, 21 Jan 2012 21:11:07 GMT</pubDate>
      <title>olduse.net 1982</title>
      <link>http://www.advogato.org/person/joey/diary.html?start=478</link>
      <guid>http://kitenet.net/~joey/blog/entry/olduse.net_1982/</guid>
      <description>&lt;p&gt;Hard to believe I've consumed all of 1981's Usenet posts now on
&lt;a href="http://olduse.net/" &gt;olduse.net&lt;/a&gt;, and it's been running for 7 months
already.&lt;/p&gt;

&lt;hr/&gt;&lt;p&gt;Last night, there was a "very long"
&lt;a href="http://article.olduse.net/1983@Acbosgd.UUCP" &gt;post&lt;/a&gt;, describing nearly
every node on usenet in 1982. There had been a warning about this post the
day before, since it would take many sites half an hour to download
at 300 baud. It was handily formatted as a shell script, which created
per-node files.&lt;/p&gt;

&lt;p&gt;So, I ran this code nobody has run since 1982. It worked. I got files. I
tossed them on the olduse.net wiki, and used some ikiwiki
code TOVA contracted me to write just a few months ago, to make
clickable links on my usenet map.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="http://olduse.net/blog/usenet_map_mashup/" &gt;
    &lt;img src="http://kitenet.net/~joey/blog/./pics/oldusenetmap.png" width="458" height="268" alt="usenet map" class="img"/&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;The map data was contributed in another post a while back. By 1982, usenet is
getting nearly impossible to map with 1982 technology of ascii art. I enjoyed
throwing graphviz, git, wikis, and the web at it.&lt;/p&gt;

&lt;p&gt;So, we have a collaboration across time, me and "Mark" and a lot of
people who described their usenet nodes and piles of technology
that make creating a mashup easy. Awesome!&lt;/p&gt;

&lt;hr/&gt;&lt;p&gt;I blog about stuff I find on the &lt;a href="http://olduse.net/blog/" &gt;olduse.net
blog&lt;/a&gt;. It's an open blog;
&lt;a href="https://koldfront.dk/" &gt;Koldfront&lt;/a&gt; also blogs there, and we welcome other
bloggers.&lt;/p&gt;

&lt;p&gt;Some of the highlights for me have included:&lt;/p&gt;

&lt;p&gt;As the space shuttle program is winding down, reading the excitement about
the first shuttle flights, and the play-by-play coverage of a launch,
posted to &lt;code&gt;net.columbia&lt;/code&gt; by a high school student borrowing his dad's
account. (A usegroup name that's hard to read without remembering
&lt;a href="http://en.wikipedia.org/wiki/Space_shuttle_columbia#Final_mission_and_destruction" &gt;its fate&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The announcements of the Motorola M68k, the IBM PC, and the CD-ROM.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.worldipv6launch.org/wp-content/themes/ipv6/downloads/World_IPv6_launch_banner_256.png" alt="world ipv6 launch" align="right"/&gt;
Reading the TCP-IP digest, and Postel's plans for launching IPv4 soon,
while the &lt;a href="http://www.worldipv6launch.org/" &gt;world IPv6 launch&lt;/a&gt; is being
planned now. (The nay-sayers are especially fun to read. Including the
guy who was concerned about the address space size, in 1981!)&lt;/p&gt;

&lt;p&gt;Learning that nethack ascention tales have a history streching back 30 years,
to rogue, and that the stories back then
&lt;a href="http://olduse.net/blog/rogue_and_nethack/" &gt;had much the same flavor as they do today&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Various celebrity sightings. &lt;a href="http://olduse.net/blog/Dennis_Ritchie/" &gt;Dennis Ritchie&lt;/a&gt;
teaching C and Unix. Bill Joy talking vi. RMS talking .. nuclear politics?&lt;/p&gt;

&lt;p&gt;The general development of usenet. B-news being rolled out, groups
proliferating, many first inklings of what will be major problems
and developments in 5 or 10 years. A shift in tone is already apparent,
by now usenet is not only about announcements, there are already some flames.&lt;/p&gt;

&lt;p&gt;
  &lt;img src="http://olduse.net/img/appleshot.png" alt="oldusenet in a period terminal" width="640" height="375"/&gt;&lt;/p&gt;

&lt;p&gt;Still 9 years to go!&lt;/p&gt;</description>
    </item>
    <item>
      <pubDate>Mon, 16 Jan 2012 03:09:10 GMT</pubDate>
      <title>version numbers</title>
      <link>http://www.advogato.org/person/joey/diary.html?start=477</link>
      <guid>http://kitenet.net/~joey/blog/entry/version_numbers/</guid>
      <description>&lt;p&gt;Today I released two entirely different pieces of software with the
identical version number 3.20120115. Debian developers also will be soon
noticing a piece of software I released with the version number 9.20120115.&lt;/p&gt;

&lt;p&gt;I expect to move more of my software to this version number scheme over
time, unless I find something badly wrong with it. It reflects how I think
about versions for my software; there's a kind of continual "now" that
development progresses through, in which individual releases have little
discrete meaning and at the same time, there can also be significant
discontinuities, that require the user to do something to deal with
(such as a new debhelper compat version, or a new git-annex repository
format).&lt;/p&gt;

&lt;p&gt;Those two things are really all that I need a version number for my
software to communicate. I can do without the rest of the things that
version numbers are used for:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;The marketing of version 1.0 and 2.0.&lt;/li&gt;
&lt;li&gt;The comparative nuances such as whether 1.0 to 1.1 is a relatively
big change, and 1.0 to 1.0.1 is a relatively small change&lt;/li&gt;
&lt;li&gt;The implication that 0.99 is &lt;em&gt;almost&lt;/em&gt; 1.0 ready, and 1.1a is some kind
of alpha release.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;There is so much software, with so many version numbers that any signal
encoded in such version numbers is swamped in the noise. Even on projects
that I develop a version number like 2.88 is meaningless to &lt;em&gt;me&lt;/em&gt;. All
I care about is, how long ago was that version? Has there been a major
change breaking compatibility since that version? "2.88" doesn't answer
these questions well; "3.20111111" does.&lt;/p&gt;

&lt;p&gt;It is a little wordy to have the full year in there, and it can be annoying
to remember to set the version to the right date on release day (TODO:
automate). This is balanced with the version not being so wordy as to
include the time of day, which means I might have to do a 3.20120115.1 if I
goof up. These minor problems are worth it to instantly know how old a
version is when a user pastes it into a bug report.&lt;/p&gt;

&lt;p&gt;And that is probably all I will ever have to say about version numbers. :)&lt;/p&gt;</description>
    </item>
    <item>
      <pubDate>Sun, 1 Jan 2012 23:11:09 GMT</pubDate>
      <title>a resolution that stuck</title>
      <link>http://www.advogato.org/person/joey/diary.html?start=476</link>
      <guid>http://kitenet.net/~joey/blog/entry/a_resolution_that_stuck/</guid>
      <description>&lt;p&gt;Last year, my new year's resolution was to write in my journal every day.
That actually stuck, I wrote 262 journal entries in 2011. While I've been
keeping a journal intermittently since 1998, last year I doubled the number
of entries in it. And wrote a novel's worth of entries -- 53 thousand words!&lt;/p&gt;

&lt;p&gt;Most of it is of course banal and mundane stuff. Not good compared with
Lars, who does something with his journal where he goes into some detail
about code he's working on, and other work. The excerpts I've seen are
quite nice. But after I've written code, written a commit message,
documentation, perhaps bug reports etc, I often can't find much to say
about it in my journal, beyond the bare bones that I worked on $foo today or
faced a particularly hard bug. I also worry that the journal, and my
reluctance to repeat myself, often tips the balance away from me blogging,
if I write down something in the journal first.&lt;/p&gt;

&lt;hr/&gt;&lt;p&gt;Here's my journal for today:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Compare what jokes are funny now with those in 1982.
  The 1982 ones from net.jokes on olduse.net seem juvenile.
  Now compare what Unix joke man pages are funny now with
  those I'm reading from 1982. They seem basically the same.
  What would Biella make of this?&lt;/p&gt;
  
  &lt;p&gt;Liw noticed ikiwiki OOM on pell. Tracked down to a perl markdown
  bug with long lines. Had quite enough of perl markdown; ikiwiki will be
  moving to a different engine. Added discount support to it today,
  still needs Debian package tho.&lt;/p&gt;
  
  &lt;p&gt;[censored]&lt;/p&gt;
  
  &lt;p&gt;Really gorgeous sunset, with a high wind, moon, puffy low, fast moving
  clouds. Enjoyed it ecstaticly. It's going to get cold soon. Very rainy
  early, but then got intermittently sunny; power is holding out ok.&lt;/p&gt;
  
  &lt;p&gt;Was going to roast a chicken today, but got distracted and had a large 
  lunch besides. Need to find some quick food for supper.&lt;/p&gt;
  
  &lt;p&gt;I need to start a new book, should it be the River Cottage book about 
  meat that I stole from Anna, or some SF?&lt;/p&gt;
  
  &lt;p&gt;Blogged about journaling, and put this journal entry in it, so also 
  journaled about blogging. Wrote it somewhat self-conciously.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr/&gt;&lt;p&gt;The benefits for me have ranged from being able to go back and work out
dates of events, to forwarding the odd excerpts to others. The best thing
though is certianly having a regular time of introspection, to look back
over my the day.&lt;/p&gt;

&lt;p&gt;If you've not got a new year's resolution yet, I recommend this one.
(Learning Haskell would be another good one, if you haven't yet.)&lt;/p&gt;

&lt;p&gt;Just write something, anything, down in your journal every day.&lt;/p&gt;</description>
    </item>
    <item>
      <pubDate>Sat, 31 Dec 2011 19:11:12 GMT</pubDate>
      <title>solar year</title>
      <link>http://www.advogato.org/person/joey/diary.html?start=475</link>
      <guid>http://kitenet.net/~joey/blog/entry/solar_year/</guid>
      <description>&lt;p&gt;I've been at the cabin, on solar power, for a year now. I have a year of
data!&lt;/p&gt;

&lt;p&gt;
  &lt;a href="http://kitenet.net/~joey/blog/./pics/volt_log_2011.png" &gt;
    &lt;img src="http://kitenet.net/~joey/blog/./pics/volt_log_2011.png" width="1000" height="480" class="img"/&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Everything went pretty well until last month. There was an April rainy
spell where power felt slightly tight. Then over the summer, plenty of
power, no need to conserve. The last month though had what seemed like
weeks of continual grey clouds, where I never saw the sun.&lt;/p&gt;

&lt;table&gt;&lt;caption&gt;high noon today&lt;/caption&gt;
  &lt;tr&gt;&lt;td&gt;
      &lt;a href="http://kitenet.net/~joey/blog/./pics/high_noon.jpg" &gt;
        &lt;img src="http://kitenet.net/~joey/blog/./pics/high_noon.jpg" width="300" height="402" class="img"/&gt;&lt;/a&gt;
    &lt;/td&gt;
  &lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Of course, even on a sunny day in winter, it does not get far
above the hills, and the peak production window is only a few hours.
This bad combination had my battery power dipping below the 10 volts
that I consider low, down to 9, and even to 8 volts.&lt;/p&gt;

&lt;p&gt;I use kerosine lamps in the winter. (I prefer the light anway.)
I've also started unplugging my Thecus server at night to conserve power,
meaning no internet late or early. For four or so nights, I had no power to
run even my laptop after sunset. On one notable day, there was no power
even in the daytime.&lt;/p&gt;

&lt;p&gt;Even when it turned sunny again, I found that the batteries would seem to
charge to 12 volts during the day, but then precipitously drop to 10 and 9
volts at night. I think the problem was not damaged batteries, but that
these Nicads charge most efficiently above 12 volts (14 volts is best), and
there was never enough power saved up to get them full enough that they
could charge really efficiently.&lt;/p&gt;

&lt;p&gt;So, I reluctantly spent three days away this week, to let the batteries
soak up sun and recover. It seems to have worked; they've been holding
a 12 volt charge overnight again.&lt;/p&gt;</description>
    </item>
    <item>
      <pubDate>Tue, 27 Dec 2011 18:11:07 GMT</pubDate>
      <title>a Github survey</title>
      <link>http://www.advogato.org/person/joey/diary.html?start=474</link>
      <guid>http://kitenet.net/~joey/blog/entry/a_Github_survey/</guid>
      <description>&lt;p&gt;The great thing about git and other distributed version control systems is
that once you clone (or fork) a repository, you have all the data. You
don't have to trust that Github will preserve it; everyone who develops
the project is a backup.&lt;/p&gt;

&lt;p&gt;Github carries this principle quite far amoung the features they provide.
But not all the way. Today I have surveyed their features, and where the
data for each is stored.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;source code -- in git, of course!&lt;/li&gt;
&lt;li&gt;user and project &lt;a href="http://pages.github.com" &gt;pages&lt;/a&gt; and wiki -- in git&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/" &gt;gists&lt;/a&gt; -- in git&lt;/li&gt;
&lt;li&gt;issues -- in a database accessible by an &lt;a href="http://developer.github.com" &gt;API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;notes on commits -- in a database accessible by an API&lt;/li&gt;
&lt;li&gt;relationships between repos (who forked what, pull requests)
-- in a database accessible by an API&lt;/li&gt;
&lt;li&gt;your account details and activity -- in a database, accessible
by you via an API&lt;/li&gt;
&lt;li&gt;list of all projects and users -- in a closed database (AFAIK)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The two that really stand out are the issues and notes not being stored in
git. This means that, if a project uses github, it gets locked into github
to a degree. The records of bugs and features, all the planning, and
communication, is locked away in a database where it cannot be cloned,
where every developer is &lt;em&gt;not&lt;/em&gt; a backup.&lt;/p&gt;

&lt;p&gt;Github's intent here is &lt;em&gt;not&lt;/em&gt; to control this data to lock you in (to the
extent they want to lock you in, they do that by providing a proprietary UI
that people rave about); it was probably only expedient to use some sort of
database, rather than git, when implementing these features.&lt;/p&gt;

&lt;p&gt;They should automatically produce git repository branches containing a
project's issues, and notes, based on the contents of their database.
(For notes, &lt;code&gt;git notes&lt;/code&gt; is the obviously right storage location.)
Along with ensuring every developer checkout is a backup, this would
allow accessing that data while offline, which is one of the reasons
we use distributed version control.&lt;/p&gt;

&lt;p&gt;The lack of a global list of projects is problimatic in a more global sense.
It means that we can't make a backup of all the (public) repositories in
Github (assuming that we had the bandwidth and storage to do it). I
recently backed up all the repositories on Berlios.de, when it looked to be
shutting down; this was only possible because they allowed enumerating them
all.&lt;/p&gt;

&lt;p&gt;People at The Internet Archive say that their archival coverage of free
software is actually quite &lt;em&gt;bad&lt;/em&gt;. We trust our version control systems
to save our free software data, but while this works individually, it
will result in data loss globally over time. I'd encourage Github to help
the Internet Archive improve their collections by donating periodic snapshots
of their public git repositories to the Archive. You're located in the same
city, 5 miles apart; they have lots of hard drives (though less right
now during the shortage than usual); this should be pretty easy to do.&lt;/p&gt;

&lt;hr/&gt;&lt;p&gt;Full disclosure: Github has bought me dinner and seemed like
stand-up guys to me.&lt;/p&gt;</description>
    </item>
    <item>
      <pubDate>Wed, 23 Nov 2011 22:03:08 GMT</pubDate>
      <title>roundtrip latency from a cabin with dialup in 2011</title>
      <link>http://www.advogato.org/person/joey/diary.html?start=473</link>
      <guid>http://kitenet.net/~joey/blog/entry/roundtrip_latency_from_a_cabin_with_dialup_in_2011/</guid>
      <description>&lt;p&gt;alt="imagine an xkcd-style infographic here"&lt;/p&gt;

&lt;h2&gt;0 seconds&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;peace and quiet&lt;/li&gt;
&lt;li&gt;full history of all my projects (git repos)&lt;/li&gt;
&lt;li&gt;my blog&lt;/li&gt;
&lt;li&gt;email&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;0.5 seconds&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;chatting on IRC&lt;/li&gt;
&lt;li&gt;searching through all email received since 1994&lt;/li&gt;
&lt;li&gt;music&lt;/li&gt;
&lt;li&gt;cached web pages&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;5 seconds&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;ssh to a server&lt;/li&gt;
&lt;li&gt;search the web&lt;/li&gt;
&lt;li&gt;lwn, hacker news, reddit, metafilter, and other web aggregators&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;10 seconds&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;resuming laptop from sleep and waiting for network-manager&lt;/li&gt;
&lt;li&gt;view an unnecessarily pastebinned scrap of text&lt;/li&gt;
&lt;li&gt;access local Debian mirror&lt;/li&gt;
&lt;li&gt;looking up a typical bug report&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;20 seconds&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;click on a typical link from a web aggregator&lt;/li&gt;
&lt;li&gt;an hour of video pulled from a USB drive with git-annex&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;2 minutes&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;downloading new email&lt;/li&gt;
&lt;li&gt;an increasing number of websites that force https
(average of 3 reloads needed due to timeouts)&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;5 minutes&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;viewing a single file, bug report, or merge request on github&lt;/li&gt;
&lt;li&gt;cloning the full content of a typical not too large git repo&lt;/li&gt;
&lt;li&gt;retriving data from archival drives via git-annex&lt;/li&gt;
&lt;li&gt;going offline and making a phone call&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apt-get update&lt;/code&gt; (thanks aj, for the pdiffs)&lt;/li&gt;
&lt;li&gt;viewing a single a twitter page (megabytes of crud and &lt;code&gt;#!&lt;/code&gt; redirections)&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;10 minutes&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;entering a state of flow while programming&lt;/li&gt;
&lt;li&gt;boingboing.net (with all the pretty pictures)&lt;/li&gt;
&lt;li&gt;my mailbox (after a nice walk down a long driveway)&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;22 minutes&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;milk and eggs&lt;/li&gt;
&lt;li&gt;a swim in the river&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;30 minutes&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;broadband internet access&lt;/li&gt;
&lt;li&gt;someone else who knows what linux is&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;32 minutes&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;an hour of video pulled from my server with git-annex
(includes travel time to broadband access point)&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;70 minutes&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;a halfway decent but slightly overpriced grocery store&lt;/li&gt;
&lt;li&gt;a produce stand&lt;/li&gt;
&lt;li&gt;a coffee shop&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;180 minutes&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;family&lt;/li&gt;
&lt;li&gt;a bakery with real bread&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;300 minutes&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;downloading a typical podcast&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <pubDate>Thu, 3 Nov 2011 01:02:31 GMT</pubDate>
      <title>the Engelbart demo</title>
      <link>http://www.advogato.org/person/joey/diary.html?start=472</link>
      <guid>http://kitenet.net/~joey/blog/entry/the_Engelbart_demo/</guid>
      <description>&lt;p&gt;Just watched the whole &lt;a href="http://en.wikipedia.org/wiki/The_Mother_of_All_Demos" &gt;Douglas Engelbart demo from
1968&lt;/a&gt;.
Somehow I'd only heard of this as the first demo of the computer mouse,
and only seen a brief clip on youtube. All three 30-minute reels of
the film are &lt;a href="http://www.archive.org/details/XD300-23_68HighlightsAResearchCntAugHumanIntellect" &gt;available online&lt;/a&gt;,
and well worth a watch in full.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://kitenet.net/~joey/blog/./pics/demo/face.png" &gt;&lt;img src="http://kitenet.net/~joey/blog/./entry/the_Engelbart_demo/200x-face.png" width="200" height="152" class="img"/&gt;&lt;/a&gt;
&lt;a href="http://kitenet.net/~joey/blog/./pics/demo/mouse.png" &gt;&lt;img src="http://kitenet.net/~joey/blog/./entry/the_Engelbart_demo/200x-mouse.png" width="200" height="153" class="img"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The mouse is the least of it, the demo includes an outlining text editor,
model-view-controller, hypertext, wiki, domain specific programming
languages, a precurser to email, bug tracking, version control(?), a
chorded keyboard. (Ok, that last one didn't really take off.) Probably a
dozen other things I've forgotten. All in a single interface, and all
before I was born.&lt;/p&gt;

&lt;p&gt;Just like any tech demo, there are fumbles and mistakes, which is
reassuring to anyone who has tried to give a tech demo.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://kitenet.net/~joey/blog/./pics/demo/camera.png" &gt;&lt;img src="http://kitenet.net/~joey/blog/./entry/the_Engelbart_demo/200x-camera.png" width="200" height="152" class="img" align="left"/&gt;&lt;/a&gt;
There's also the awesome crazy hack shown here. 
They could only afford these
tiny, round CRTs, so they pointed a television camera at it, and the
camera image was piped to their television console. (So add KVM switch to
the list of firsts!) The demo 
was done in San Fransisco, with the computer system remote in Palo Alto, so
in this image you see the text on the CRT overlaid with the video from the
camera. &lt;/p&gt;

&lt;p&gt;
  &lt;a href="http://kitenet.net/~joey/blog/./pics/demo/google.png" &gt;
    &lt;img src="http://kitenet.net/~joey/blog/./entry/the_Engelbart_demo/200x-google.png" width="200" height="152" class="img" align="right"/&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Engelbart points out that the delay this added to the system acts as a
short-term memory that filtered out flicker in the original display (and
made the mouse have a mouse trail). To me it gives the whole demo a unique
quality, as if it were underwater.&lt;/p&gt;

&lt;p&gt;Despite the piping around of audio and video signals, and the multiuser
system, the glaring thing missing from the demo that we have these days is
networking. Although there is this amusing bit at the end where they compile
a regular expression and then apply it, in order to search for documents
containing certain terms, and end up with a hyperlinked list of 10 results,
ordered by relevance. Yes, think Google.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>

