This is a valid RSS feed.
This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.
... that were here from the start.</p></description><link>http://www.t ...
^
line 69, column 0: (13 occurrences) [help]
</description><guid isPermaLink="true">http://www.thok.org/intranet/rants/re ...
... Jun 2004 10:00:00 -0000</pubDate></item></channel></rss>
^
<rss version="2.0"><channel><title>Everything Classic THOK</title><description><p>All postings and categories under <a href="http://www.thok.org/intranet">http://www.thok.org/intranet</a> unified into a
single common feed. "Classic" THOK because it doesn't include the
rehosted blogs at the top level, just things that were here from the start.</p></description><link>http://www.thok.org/intranet/everything.rss</link><item><title>rants: Tue Dec 2 22:49:00 2014</title><description><p><strong>C privilege</strong></p>
<p><a href="readme_1415503800.html">Previously</a> I went on at length about the
flaws in the language-based package manager model; coincidentally I
got to see some of the background/sausage-making<sup id="fnref:Sausage"><a class="footnote-ref" href="#fn:Sausage">1</a></sup> of a Debian
attempt to reconcile certain
<a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=771794">pip vs. dpkg issues.</a>
While I have a lot of respect for the people involved and the effort
they're putting in to the problem, I stood (quietly) by my belief that
the whole space is wrong... and then a digression about C led someone<sup id="fnref:Someone"><a class="footnote-ref" href="#fn:Someone">2</a></sup>
to state that</p>
<blockquote>
<p><em>it could be argued that distros packaging </em><em>is</em><em> the C package manager</em></p>
</blockquote>
<p>which collided with a few other ideas floating around in my head:</p>
<ul>
<li>The extent to which a programming language is "real" rather than
"scripting" matches closely with how easy it is to get at C from
it - Go breaks the model, but (to be a little mean) Java doesn't</li>
<li>C was there first, everything else has to play by C's rules even
when they're stupid (see <a href="readme_1289812140.html"><code>career_limiting_memcpy</code></a>)</li>
<li>People who "have" C tend to defend its difficulty (discussions of
programmer interviewing techniques come to mind though I don't
have good references handy, the internet mostly has bad ones)</li>
<li>Concrete examples of
<a href="http://blog.valerieaurora.org/2014/10/03/operating-systems-war-story-how-feminism-helped-me-solve-one-of-file-systems-oldest-conundrums/">human-oriented approaches to hard-core engineering problems</a>
(the <code>relatime</code> story specifically, as an instance of a solution
that implies a class of approaches.)</li>
</ul>
<p>All of this clicked into shape as a pattern of <em>privilege</em> - not to
coopt the language of the very real problems the industry faces, but
just to look at the "anti-pattern" of the conflict between distro and
language package management from a perspective that makes some sense
of why language package managers refuse to die off - it's not <em>just</em>
that the people who work on them are persistent and/or stubborn.
Certainly it turns the question around: given all the other
language-specific package managers, <em>where is</em> the C one? And, as with
social privilege, once you start looking for it, you realize that
maybe "you're soaking in it" - and that Unix has been, since the
1970's, an extended support system for the C language, so of <em>course</em>
any "distro packaging system" is going to be heavily C-program biased.</p>
<p>Now is that a <em>helpful</em> epiphany? It has the initial smell of "reduced
to a previously unsolved problem", but it does suggest that attempting
to credit C with it's proper share of the packaging burden might be
productive; that leads to the idea that instead of "why would a
language have anything intelligent to say about where files get
installed" that in fact, the language may have one set of things to
say, and the distro has a <em>different</em> set of things to say, and while
we need them to mesh, they are more likely (today) to grind. It also
suggests the fun mental exercise of considering a world, perhaps not
<em>without</em> C but one where you assume your language of choice (yes,
Python) as a starting point - maybe not as deeply special as the Lisp
Machine, but it could still lead to some implementable insight.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:Sausage">
<p>"If you like law, or sausage, best not watch them being made" - not
actually said by Otto von Bismarck, according to <a href="http://en.wikiquote.org/wiki/Otto_von_Bismarck">wikiquote</a>. <a class="footnote-backref" href="#fnref:Sausage" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:Someone">
<p>Pretty sure it was <a href="https://twitter.com/schmichael">@schmichael</a>
but I could be mistaken. <a class="footnote-backref" href="#fnref:Someone" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>
</description><guid isPermaLink="true">http://www.thok.org/intranet/rants/readme_1417596540.html</guid><pubDate>Wed, 03 Dec 2014 08:49:00 -0000</pubDate></item><item><title>exif: Tue Dec 2 22:22:00 2014</title><description><p>Just noticed an actual "stuttering" repeat upload caused by the <code>flickr</code>/<code>flickd</code> processing mishandling duplicated file (one md5sum, 3 "file" names and it would re-upload the last one but tag the first one as <code>flickd</code>...) After fixing the immediate problem by hand (deleting the duplicates on Flickr itself, then moving the <code>flickd</code> tags around with emacs) I tried to measure the scope of the problem:</p>
<div class="codehilite"><pre><span></span><code><span class="kn">import</span> <span class="nn">kimdaba_album</span>
<span class="n">album</span> <span class="o">=</span> <span class="n">kimdaba_album</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">kimdaba_album</span><span class="o">.</span><span class="n">kimdaba_default_album</span><span class="p">())</span>
<span class="n">km</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">img</span> <span class="ow">in</span> <span class="n">album</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s2">"images/image"</span><span class="p">):</span>
<span class="n">mm</span> <span class="o">=</span> <span class="n">img</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"md5sum"</span><span class="p">)</span>
<span class="n">ff</span> <span class="o">=</span> <span class="n">img</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"file"</span><span class="p">)</span>
<span class="n">km</span><span class="p">[</span><span class="n">mm</span><span class="p">]</span> <span class="o">=</span> <span class="n">km</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">mm</span><span class="p">,</span> <span class="p">[])</span> <span class="o">+</span> <span class="p">[</span><span class="n">ff</span><span class="p">]</span>
<span class="nb">print</span> <span class="nb">len</span><span class="p">([</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">km</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">])</span>
</code></pre></div>
<p>Turns out there are 289 distinct images that each have multiple paths - one of which is the less-surprising 18 zero-length files, primarily from old cellphones, one is the 3-way that caused the problem, and the rest are duplicates of various kinds. Not <em>much</em> of a mess given that there are 131446 entries total, but it still caused a visible problem and needs fixing.</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/exif/readme_1417594920.html</guid><pubDate>Wed, 03 Dec 2014 08:22:00 -0000</pubDate></item><item><title>Yay, youtube takes care of this now</title><description><p>In 2012, Google
<a href="http://googleresearch.blogspot.com/2012/05/video-stabilization-on-youtube.html">added video stabilization to youtube</a>
under <code>Edit -&gt; Enhancements</code> so I fed it the hawk video and applied it;
<a href="http://www.youtube.com/watch?v=0B-A_EA93yc">http://www.youtube.com/watch?v=0B-A_EA93yc</a> shows that it works quite
nicely, and saves me the effort of doing any packaging work on this
code. (They've also included much more advanced techniques like
<a href="http://research.google.com/pubs/pub37744.html">Rolling Shutter removal</a>
which I hadn't even considered as a solvable problem.)</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/hawk/readme_1392650820.html</guid><pubDate>Mon, 17 Feb 2014 15:27:00 -0000</pubDate></item><item><title>newthing: Mon Aug 5 12:34:00 2013</title><description><p>A year later and <em>that</em> clearly worked well. Let's try again, maybe with something simple like</p>
<ul>
<li>
<code>Makefile</code>s (gnu is fine, esp. with guile support :-)</li>
<li>split <code>README.md</code> into snippets</li>
<li>basic styling, even if not bootstrap...</li>
</ul>
<p>(In practice, it turns out that getting the <em>existing</em> tools running again under Raring has taken a couple of evenings, but at least it is producing output, so maybe I shouldn't be even that ambitious :-)</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/newthing/readme_1375738440.html</guid><pubDate>Mon, 05 Aug 2013 21:34:00 -0000</pubDate></item><item><title>zephyr_page: Sat Oct 15 01:47:00 2011</title><description><p><code>zgather.py</code> has been vaguely useful, but the web interface didn't really go anywhere, and I mostly use <code>barnowl</code> as a backlog reader (along with my traditional logger.) Recent thoughts inspired a new architecture:</p>
<ul>
<li>
<code>couchdb</code> holding zephyrgrams<ul>
<li>so split out the subscribing part of <code>zgather.py</code> into a "<code>tzc</code> with JSON instead of S-expressions"</li>
<li>then we can run multiple subscribers, letting couchdb eliminate duplicates</li>
<li>then a <code>barnowl</code> backend can be a couchdb client</li>
<li>continuity over upgrades is handled by extra <code>couchdb</code> instances, <em>and</em> extra subscribers</li>
<li>same db can hold "read this" and "liked/saved this" info</li>
<li>an IMAP interface can work with all that, allowing K-9 to be a mobile client...</li>
<li>a JSON interface to the couchdb can be the "remote" part, either by getting a backlog stream from the dbs, or looking at a freshly-instantiated local mirror</li>
</ul>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/zephyr_page/readme_1318675620.html</guid><pubDate>Sat, 15 Oct 2011 10:47:00 -0000</pubDate></item><item><title>mark-eichin-blogspot-com: Thu Mar 3 19:20:00 2011</title><description><p><strong>Tool Building</strong></p>
<p>I've put what is probably an unreasonable amount of time into building my own software tools - not particularly <em>novel</em> tools, necessarily, just glue to create support my own idiosyncratic ways of working. For example, back in 2003 I had a Sony Clié; as a way of attempting to understand what the big deal about blogging was, I put together a working mobile-photoblog with a .forward file and 50 lines of shell script - I could take a picture from the Clié, add text and a title to an email message which would go to my posting address. Even had a handful of readers. About the same time I started turning my README files into blog input (I was already doing plenty of writing, so why change my habits when I could build tools around them?) This led to some kind of gross ad-hoc parsers for the kind of text-shorthand I used, which at least worked as a way of getting them on the web.</p>
<p>These days, I've come to believe it's worth some amount of effort to use the tools other people come up with, rather than inventing <em>everything</em> from scratch, satisfying though that is. For example, <a href="http://daringfireball.net/projects/markdown/">MarkDown</a> syntax appeared in 2004, is close enough to what I was doing already that simply hand-re-writing my README files into it would be trivial, and gets me away from having spent 7 years on and off tweaking regular expressions to generate what I have now. Of course I can argue that spending that time is <em>why</em> I now know that MarkDown is what I wanted in the first place, and it was a good playground in which to develop skills with various bits of Python... but it's getting in the way more than it is helping, at this point. I've actually got a prototype that takes the RSS of this blog, upgrades it to MarkDown with some extensions, and generates the corresponding page on my own site... eventually this will point there instead, and "gadgets and tech" will go back to being a category and not an entirely separate project.</p>
<p>This isn't the only bit of consolidation I've been doing - I finally have <em>all</em> of my photography in one collection, a single 33M KPhotoAlbum XML file with tags and metadata for over 80 thousand pictures. There are still a bunch of older captions (from <em>bins</em>, the old perl gallery tool, and from some ad-hoc software of my own) that need to be folded in, but not an enormous number of them. This has allowed me to dig up a few interesting things from my earliest photographic efforts, so it hasn't just been a filing exercise; it has also been a good way to see the progress in both camera tech and personal skill over a decade.</p>
<p>Pycon 2011 is in Atlanta, GA, next week, and while I hope to do a bunch of coding while I'm there, I don't want to build up quite as much of a backlog of future projects and wishful thinking as I have in the past - while by habit I do seem to be a builder of infrastructure, it's primarly bespoke personal infrastructure, and doesn't <em>really</em> increase my development velocity that much - I want to <em>make things happen</em>. We'll see if I actually pull that off :-)</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/mark-eichin-blogspot-com/readme_1299216000.html</guid><pubDate>Fri, 04 Mar 2011 05:20:00 -0000</pubDate></item><item><title>toodledo: Sat Jan 29 02:22:00 2011</title><description><p>While I still have hundreds of personal todo items filed in <code>hiveminder</code>, the exposed-perl-guts API has kept me from getting very far with my own client code - and the limited number of other non-web clients suggests that I'm not alone in this. Looking for other apps that I can cleanly use on my (Android) phone, and after some failures with <code>RememberTheMilk</code> (in particular, somehow tasks filed from clients were only visible to other clients, not on the website) and some uninspired efforts at writing my own, I came across ToodleDo; there were multiple iOS and Android clients, several of which took the approach of doing their own "model" for tasks, but also pushing them to ToodleDo, rather than being specifically ToodleDo clients. ToodleDo's API docs seem to encourage this some by talking explicitly about synchronization.</p>
<p>Turns out that once you get past the slightly odd (and not particularly secure) ToodleDo authentication step, you can write commandline apps for it using <code>curl</code> and <code>xmlstarlet</code> - I don't recommend it, but </p>
<div class="codehilite"><pre><span></span><code><span class="s s-Atom">curl</span> <span class="o">-</span><span class="s s-Atom">s</span> <span class="s2">"&lt;http://api.toodledo.com/api.php?method=getContexts;key=$short_term_key"</span><span class="o">&gt;</span> <span class="p">|</span> <span class="s s-Atom">xmlstarlet</span> <span class="s s-Atom">sel</span> <span class="o">-</span><span class="nv">T</span> <span class="o">-</span><span class="s s-Atom">t</span> <span class="o">-</span><span class="s s-Atom">m</span> <span class="s s-Atom">contexts</span><span class="o">/</span><span class="s s-Atom">context</span> <span class="o">-</span><span class="s s-Atom">s</span> <span class="nv">T</span><span class="o">:-:-</span> <span class="s s-Atom">'*'</span> <span class="o">-</span><span class="s s-Atom">v</span> <span class="s s-Atom">'text()'</span> <span class="o">-</span><span class="s s-Atom">n</span>
</code></pre></div>
<p>did actually work. Of course I went from there directly to python, again getting distracted with messing around with the authentication steps... finally I took another look and found <code>poodledo</code>, a simple python API wrapper that is unmaintained but functional, and since one of my left-over resolutions from 2009 was to put more effort into using other people's code instead of writing it from scratch, I took a shot at it.</p>
<p>This turns out to work just fine, at least for various filtered versions of <code>getTasks</code>. A simple task-adder is next, probably similar to my hiveminder <code>todo.py</code> tool. Turns out I went a little overboard with a class that stashes key-value-expiration into a sqlite db in one's homedir, for things like remembering the username, password, and short-term api key (4 hour expiration) - that's something that is common enough that there should be <em>some</em> existing version to use, but I'm not sure what to actually call it so I can search for it :-) I suppose the right answer is to store the password with <code>python-keyring</code> but that still leaves a host of other user-specific data to store, so it doesn't actually simplify the code at all to use it.</p>
<p>(Not actually posting the code here until I implement a few more features and actually use them for a bit, but since I was checking it in, I figured I'd blog about it a bit too.)</p>
<ul>
<li>hiveminder <a href="http://task.hm">http://task.hm</a>
</li>
<li>iMinder <a href="http://iminder.worldairmaillinks.com/">http://iminder.worldairmaillinks.com/</a> (but note that with 700+ tasks, it falls over pretty quickly on the iPad)</li>
<li>RememberTheMilk <a href="http://www.rememberthemilk.com/">http://www.rememberthemilk.com/</a>
</li>
<li>ToodleDo <a href="http://www.toodledo.com/">http://www.toodledo.com/</a>
</li>
<li>ToodleDo API <a href="http://api.toodledo.com/2/index.php">http://api.toodledo.com/2/index.php</a>
</li>
<li>poodledo python wrapper <a href="http://code.google.com/p/poodledo/">http://code.google.com/p/poodledo/</a>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/toodledo/readme_1296303720.html</guid><pubDate>Sat, 29 Jan 2011 12:22:00 -0000</pubDate></item><item><title>android: Thu Dec 2 02:15:00 2010</title><description><p>I still love the G1 keyboard, but it's now way too underprovisioned for my day-to-day use (TouchDown, the activesync-in-isolation client that actually works with my new employer's Outlook 2007 install, takes up around 1/6th of the available memory all by itself, and that's just not really workable - especially since I treat it as a PDA first and a phone third) so I picked up a second-hand Nexus 1 (no keyboard at all, but it's not like any of the new keyboard-phones have decent 5-row keyboards <em>anyway</em>) and installed CyanogenMod 6 on it (so I get bluetooth keyboard use out-of-the-box, and can use Titanium Backup to get nightly incrementals and weekly full backups...)</p>
<p>In the last couple of weeks, though, I've been running in to a problem - sometimes, after running the battery into the ground (something relatively easy to do, as I leave 802.11 on, and noone is making jumbo batteries like they did for the G1) I'll charge it and power it back up and find that</p>
<ul>
<li>the HOME key does nothing (with haptics turned on, it clicks, but it doesn't <em>act</em> at all - long press doesn't work either)</li>
<li>the SEARCH key does nothing (likewise)</li>
<li>the system refuses to lock the screen, even with the "Lock Screen" app</li>
<li>the power-button menu only says "power off" and "reboot" - it doesn't list "airplane mode" or "silent mode"</li>
</ul>
<p>The only way I've found to recover from this seems to be what the rest of the web has found - hard reset (and restore apps and data from backups.) With 170 apps installed (based on how Titanium Backup counts them, so this includes system apps and cyanogen stuff too) this takes a while, especially as I need to use the "classic" restore mode that requires two button presses per install (due to what appears to be some corrupted apks, something that needs more investigation.) Once I realized that <em>all</em> of the above complaints might be related, I found some useful links, mostly starting from <a href="http://code.google.com/p/android/issues/detail?id=4358">http://code.google.com/p/android/issues/detail?id=4358</a> though <a href="http://groups.google.com/group/android-porting/browse_thread/thread/61baf6058966fe31">http://groups.google.com/group/android-porting/browse_thread/thread/61baf6058966fe31</a> was particularly helpful in showing the actual repair technique:</p>
<div class="codehilite"><pre><span></span><code>$<span class="w"> </span>adb<span class="w"> </span>shell
<span class="c1"># sqlite3 /data/data/com.android.providers.settings/databases/settings.db</span>
INSERT<span class="w"> </span>INTO<span class="w"> </span><span class="s2">"secure"</span><span class="w"> </span><span class="o">(</span>name,<span class="w"> </span>value<span class="o">)</span><span class="w"> </span>VALUES<span class="w"> </span><span class="o">(</span><span class="s1">'device_provisioned'</span>,<span class="w"> </span><span class="m">1</span><span class="o">)</span><span class="p">;</span>
.quit
</code></pre></div>
<p>and then reboot the phone for it to actually take effect. Apparently <code>device_provisioned</code> is used by <code>inKeyguardRestrictedKeyInputMode</code> in <code>frameworks/base/core/java/android/view/WindowManagerPolicy.java</code> as part of preventing the new phone user from stumbling out of the setup wizard, though a little more digging suggest it's screen-lock related as well; looking through the android tree for <code>DEVICE_PROVISIONED</code> seems to find the relevant code (which tells me it also turns off doing anything with the dock, based on <code>frameworks/base/services/java/com/android/server/DockObserver.java</code> though I can't test that since I've yet to find a source for a real Nexus 1 dock (one that uses the drop-in contacts and not just a generic fidget-with-the-connector microUSB one) and it also looks like it blocks incoming phone calls and SMSes as well.</p>
<p>In the meantime, I should probably write a little <code>SL4A</code> python app to make that change directly, see <a href="http://code.google.com/p/android-scripting/issues/detail?id=184#c15">http://code.google.com/p/android-scripting/issues/detail?id=184#c15</a> for the first steps in getting the "run python scripts as root" part of the riddle trail. ( <code>packages/apps/Provision/src/com/android/provision/DefaultActivity.java</code> has the bare skeleton of how to do it from java, but doesn't include the root or UI parts at all.)</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/android/readme_1291292100.html</guid><pubDate>Thu, 02 Dec 2010 12:15:00 -0000</pubDate></item><item><title>sheevaplug: Wed Feb 17 01:23:00 2010</title><description><p>In the last year I've gone to running three Sheevaplugs - one for dev, one as an AFS and Zephyr server, and one as my secondary DNS. That leaves one "big" server (Dell Poweredge 830, 4 SATA drives in 2 software-RAID pairs) which is now responsible for most of the noise in the room, but is also the most important, as it holds (among other things) 130G/over a decade/nearly 70 thousand of my pictures.</p>
<p>Conveniently, Marvell/Globalscale just announced the GuruPlug: a SheevaPlug with</p>
<ul>
<li>more RAM</li>
<li>builtin 802.11</li>
<li>builtin bluetooth</li>
<li>2x USB2</li>
<li>2x GigE</li>
<li>eSATA</li>
</ul>
<p>This looks like it will make a fine replacement, given a SATA port multiplier (perhaps something simpler than the SATAport 5-way) and external drive bays - plenty of circulation, no noise, and around 2TB of disk. The main question will be whether I phase it in (OpenAFS volume movement works just fine) or do it as a full in-place upgrade (as I did with the other SheevaPlug AFS server, which replaced [over the course of half a dozen reboots] an old SparcStation...)</p>
<ul>
<li>GuruPlug <a href="http://www.globalscaletechnologies.com/t-guruplugdetails.aspx">http://www.globalscaletechnologies.com/t-guruplugdetails.aspx</a>
</li>
<li>SATAport <a href="http://www.sataport.com/">http://www.sataport.com/</a>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/toys/sheevaplug/readme_1266405780.html</guid><pubDate>Wed, 17 Feb 2010 11:23:00 -0000</pubDate></item><item><title>toys: Sat Jan 30 00:57:00 2010</title><description><p>Tis the season for gadget discounts. Over the last few months I picked up </p>
<ul>
<li>a Milwaukee Digital Inspection Camera (basically a borescope replacement, a handheld monitor with a webcam + LED lights on the end of a snake) for more than half off</li>
<li>a steeply discounted Canon Rebel XS DSLR (and later the 55-250mm lens, to go with the 18-55mm kit lens)</li>
<li>a second-hand Sony Vaio P, japanese edition</li>
<li>a discounted "chumby guts" kit</li>
</ul>
<p>Reviews will follow eventually (the DSLR deserves it's own category, but while it's stunningly good at some things, it's significantly <em>worse</em> than the SX10-IS at others) but I mostly wanted to note some bits about the Vaio:</p>
<ul>
<li>
<a href="http://korpus.juls.savba.sk/~garabik/odds/sony_vaio_p_linux.html">http://korpus.juls.savba.sk/~garabik/odds/sony_vaio_p_linux.html</a> is useful but out of date; the one thing I needed from there was <code>setpci -s 00:02.0 F4.B=XX</code> to set brightness, which helped with the "backlight stays off on return from suspend" problem, though it may turn out that <code>chvt</code> gets the real credit.</li>
<li>it runs Ubuntu Lucid (daily snapshot) quite nicely, at full resolution (slowly, since the Poulsbo drivers are dead, but fast enough for my usage.) <code>unetbootin</code> produces an installer that works fine from a USB stick (though not from the builtin SD slot.)</li>
<li>it really weighs only 2oz more than the Kindle DX</li>
<li>I <em>adore</em> the keyboard.</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/toys/gadget_lust_1264849020.html</guid><pubDate>Sat, 30 Jan 2010 10:57:00 -0000</pubDate></item><item><title>usb: Thu Oct 8 00:42:00 2009</title><description><p>A few years back I picked up a Radio Shack USB Electronic Scale, on clearance, on the theory that it might work someday - or else I'd get at least that much value out of taking it apart...</p>
<p>I found it on a shelf today, plugged it in, did a google search for the USB id, and found user-space code that talked to <code>hiddev0</code> and turned the events into weights. As much for the practice as anything, I converted it to python - handling <code>ioctl</code>s isn't particularly tricky, but it took some poking to determine that the event values were sign-extended bytes, and the multiple reassignments to different variables in the C code actually <em>mattered</em>.</p>
<ul>
<li>forum thread about the scale <a href="http://www.linuxquestions.org/questions/linux-hardware-18/installing-a-usb-scale-503125/page2.html">http://www.linuxquestions.org/questions/linux-hardware-18/installing-a-usb-scale-503125/page2.html</a>
</li>
<li>bkubes C code <a href="http://kubes.org/src/usbscale.c">http://kubes.org/src/usbscale.c</a>
</li>
<li>my python version <a href="usbscale.py">usbscale.py</a>
</li>
</ul>
<p>The python code probably needs to run as <code>root</code> unless you do some <code>udev</code> tweaking; fire it up with the scale empty, when you get the prompt, put something on it, hit enter, and read the weight in grams. Not terribly exciting... but the next step might be to keep reading until the new value stabilizes. Ultimately I'd like to put this in the kitchen, maybe hooked to a chumby, with code that lets you set a target weight, then beeps in one tone when you get close, and another when you hit the actual value (or something more sophisticated.) Basically to let me look at what I'm <em>pouring</em> rather than at the display... could also do multiple targets for mixing, have it even "speak" the next item to add (or for things that are strictly proportional, adjust later measurements based on the initial one, though that seems like it might not be that useful compared to just being accurate.)</p>
<p><em>note added 20140224</em> I wonder if the app attached to the <a href="adaptics.co">Adaptics</a> "Drop" connected-scale will include that, it at least does <a href="http://gigaom.com/2014/02/24/drop-gets-into-the-kitchen-with-a-connected-scale-for-bakers/">sophisticated recipe integration...</a></p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/usb/readme_1254994920.html</guid><pubDate>Thu, 08 Oct 2009 09:42:00 -0000</pubDate></item><item><title>eeepc: Thu Jun 25 23:35:00 2009</title><description><p>Since last writing here,</p>
<ul>
<li>Asus has flooded the market with lots of different models</li>
<li>Supposedly the EEE T91 tablet is out but noone seems to actually have it<ul>
<li><a href="http://www.engadget.com/2009/05/08/asus-eee-pc-t91-confirmed-for-late-may-or-early-june-release-in/">http://www.engadget.com/2009/05/08/asus-eee-pc-t91-confirmed-for-late-may-or-early-june-release-in/</a></li>
</ul>
</li>
<li>The EEE 900 hit woot, and mydigitaldiscount.com has nice 64G SSD upgrades...<ul>
<li><a href="http://www.mydigitaldiscount.com/ProductDetail.jsp?LISTID=8000092B-1231822344">http://www.mydigitaldiscount.com/ProductDetail.jsp?LISTID=8000092B-1231822344</a></li>
</ul>
</li>
</ul>
<p>The 64G SSD is has the nice trick that it includes a USB port (with a mutant connector) so you can just bit-for-bit mirror your internal drive to the new one, then pop it in to the mini-PCIe slot and reboot. (Linux even handles growing a mounted ext3fs, once you've made the partition larger underneath it - not a big deal since you're swapping hardware, and could just do it while it's still external, but if you forget, it's a nice touch.)</p>
<p>(For now I'm still using the 16G SD card [carried in a stick-sized reader] for my captioning efforts; if I had an easy way to put the EEE into mac-style external disk mode, I might use that instead - I could just sshfs into it, I suppose. Alternatively I'd use the phone for the same thing, but it's only got an 8G microSD, fast 16G don't seem to be out yet and wouldn't really be an improvement given that I keep a lot of other stuff on the phone's own card... would allow some direct phone-to-flickr posting, though, especially now that I have ASE to work with...)</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/toys/eeepc/readme_1246005300.html</guid><pubDate>Fri, 26 Jun 2009 08:35:00 -0000</pubDate></item><item><title>marysmenu: Thu May 7 01:59:00 2009</title><description><p>Ready for a "live" test (though I haven't checked it live against a
menu, just against a blurry picture of one, so the prices may be off.)</p>
<ul>
<li><a href="marychungs-lunch.html">marychungs-lunch.html</a></li>
</ul>
<p>The people I eat with often get things from the dinner menu at lunch
time too, so getting that transcribed is next. Other next steps
should include:</p>
<ul>
<li>ajax hooks to post items for popularity counts<ul>
<li>possibly then add a filter on "my usuals"</li>
</ul>
</li>
<li>some CSS to make it look less like, well, one of <em>my</em> interfaces :-)</li>
<li>multiple (named?) diners</li>
<li>"communist" mode - option to total a group and simply divide by the group size</li>
</ul>
<p>At some point I should start soliciting additional menus (local to
Cambridge, MA for now) and do some comparison testing on non-Android
phones.</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/jquery/marysmenu/readme_1241693940.html</guid><pubDate>Thu, 07 May 2009 10:59:00 -0000</pubDate></item><item><title>ztwit: Wed Dec 10 00:15:00 2008</title><description><p>Got one negative comment about the flickr updates, decided to interpret it as "make them more interesting" rather than actually <em>stopping</em> them (after all, playing with the tools is more than half of what this is about - I'm not trying to find strangers here, or anything...)</p>
<p>The flickr updates now include as many tags as they can, sorted by popularity and length, so the latest one says <code>[Concord,Great Meadows National Wildlife Refuge,Massachusetts,ice,sunshine,winter,marsh...]</code> which perhaps gives the reader an idea of what pictures they'll find. (Granted, most of my readers are local, so knowing me and knowing the weather is probably sufficient to guess :-) Not realizing that python's sort is stable in 2.4 and later, I counted tags and used a key of <code>tag_popularity[tag] - 1/float(len(tag))</code> (the value itself is the major key, putting everything into integer buckets, and the tag length reduces that - the shorter the tag, the more it reduces, so the closer to the start of the list of tags that length, but bounded between 1/1 and 1/longest-tag-len, approaching zero, so the values fit. Of course we want high popularity first, so this is a reverse sort, so we're actually favoring longer tags, based on them likely having more inherent detail.) This is what we call "excessively clever" - given a stable sort, we could just sort the list twice:</p>
<div class="codehilite"><pre><span></span><code>tags = sorted(tag_popularity, key=len)
tags = sorted(tags, key=tag_popularity.__getitem__)
</code></pre></div>
<p>and then <code>reverse</code> the whole thing. (Notice that sort-stability is the place where <code>sorted(reverse=True)</code> is different from <code>reversed(sorted())</code> - the former reverses the direction of the current key, but preserves the order of things that were equal; the later reverses everything.)</p>
<p>Future directions could include</p>
<ul>
<li>saving 18 characters by shortening the reference (oh, I can save 11 of those just by using flickr's own shortcuts, <em>done</em>)</li>
<li>keeping track of <em>all</em> tags and using global popularity (to support expressing both "what this set is mostly about" and "what distinct cool things are in here" at the same time, chopping out the middle...) This may have to wait until I re-unify all of my photo data sets into one master gallery, though. (Cheap storage scaling may make that happen sooner than later, even if I do take over 20G/year of pictures <em>now</em>...)</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/ztwit/readme_1228904100.html</guid><pubDate>Wed, 10 Dec 2008 10:15:00 -0000</pubDate></item><item><title>blogthing: Wed Dec 10 00:02:00 2008</title><description><p>I've gone another year without significant change to the blogging
software; I did just add <a href="http://rpc.weblogs.com">http://rpc.weblogs.com</a> pinging to go along
with the year-old google-pinging support (embarassingly, the only
difference between the two is the noise they return on success, and I
just print that anyway; I was just reminded because it showed up on
<a href="http://scripting.com">http://scripting.com</a> recently.)</p>
<p>I have been putting a little time into using Sphinx to build one of my
documentation/ranting sites, though, because Sphinx sites actually
look pretty nice as-is, and maybe it's time to clean up the look
around here a bit (especially code display.) It looks like I'll be
able to use the existing parsers to do at least a rough draft
automatic conversion to RST, which is nice - though I'm seriously
considering WikiCreole as well, it looks like RST still wins on tools.</p>
<p>Footnotes:</p>
<ul>
<li>google api <a href="http://www.google.com/help/blogsearch/pinging_API.html">http://www.google.com/help/blogsearch/pinging_API.html</a>
</li>
<li>verisign/weblogs.com api <a href="http://www.weblogs.com/api.html">http://www.weblogs.com/api.html</a>
</li>
<li>sphinx <a href="http://sphinx.pocoo.org/">http://sphinx.pocoo.org/</a>
</li>
<li>RST - reStructured Text - <a href="http://docutils.sourceforge.net/rst.html">http://docutils.sourceforge.net/rst.html</a>
</li>
<li>WikiCreole <a href="http://www.wikicreole.org/wiki/Creole1.0">http://www.wikicreole.org/wiki/Creole1.0</a>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/blogthing/readme_1228903320.html</guid><pubDate>Wed, 10 Dec 2008 10:02:00 -0000</pubDate></item><item><title>modbook: Sat Dec 6 15:42:00 2008</title><description><p>I haven't had much drawing time lately, but the Autodesk Sketchbook 2009 deal fell in my lap (apparently they're bundling it with new units - you can download it for old ones given a serial number.) Pretty nice implementation of "pencil", and good use of pie-menus for selecting obvious things. Very much a "teaser" version, though:</p>
<ul>
<li>only 3 layers</li>
<li>only saves in bitmap formats with flattened layers (and no transparency, at least in TIFF)</li>
<li>only 30 levels of undo</li>
<li>crashed once (though it a "save your work" dialog first, which is a nice touch on a bad situation... especially since you can't save layers)</li>
</ul>
<p>That said, it did get me back into drawing (though I'll probably get back to using Scribbles, at my skill level Sketchbook Pro isn't really tempting, and the limitations of the downloaded version have already wasted my time after only two drawings.) I'm starting to consider picking up an old HP TC1100 (under-$400 "obsolete" tablet) to have something I'll carry around, though...</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/toys/modbook/readme_1228614120.html</guid><pubDate>Sun, 07 Dec 2008 01:42:00 -0000</pubDate></item><item><title>local_tasks: Wed Dec 3 02:03:00 2008</title><description><p>Need a local task manager, to handle work-paranoia about external data leaks. It should still have cheap external <em>inputs</em>, as long as reading it requires "internal" access.</p>
<p>Hiveminder of course provides a lot of inspiration; key differences are</p>
<ul>
<li>should tie directly in to existing intranet systems (RT, viewsvn, moinmoin, news) via links</li>
<li>should be faster in the face of large numbers of items</li>
</ul>
<p>Strictly speaking it doesn't need a web interface, though that'll make it easier to spread it to other people.</p>
<p>I considered just making it a roundup instance, but I'm not sure that actually buys us anything - <code>local_task</code> doesn't even need to be multi-user, so much of the infrastructure goes away; it probably doesn't need more than basic locking...</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/local_tasks/readme_1228305780.html</guid><pubDate>Wed, 03 Dec 2008 12:03:00 -0000</pubDate></item><item><title>thokalbum: Sun Sep 14 23:46:00 2008</title><description><p>Realized when half-awake this morning that the album-search cache was wrong at an entirely different level - reloading the album needs to invalidate all prior searches, where instead the code was just reloading the one that was in progress when we noticed the base album was stale. This is also the first hint that, at 900 lines of code, I already need bugtracking; given my offline working mode, I should probably look at SD - having a bug list that can be checked in with the code makes a lot of sense, especially if it still supports real management tools and isn't just a free form list.</p>
<p>Pushed the change out as 0.2a after testing. (Still needs to be made "pure functional with caching" to eliminate some other rarely-seen problems. Also need to think about adding this album to nagaina monitoring...)</p>
<p>Footnotes: </p>
<ul>
<li>sd syncable bug tracking <a href="http://syncwith.us/sd/using">http://syncwith.us/sd/using</a>
</li>
<li>nagaina <a href="http://www.thok.org/intranet/python/nagaina/index.html">http://www.thok.org/intranet/python/nagaina/index.html</a>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/thokalbum/readme_1221468360.html</guid><pubDate>Mon, 15 Sep 2008 08:46:00 -0000</pubDate></item><item><title>chumby: Sat Aug 9 12:48:00 2008</title><description><p>Ran into an interesting flaw in the chumby-as-alarm-clock - if DNS
goes out, and it can't get to chumby.com, it doesn't do anything else.
Just an unexpected dependency to be aware of (and more reason to drop
in my own software instead :-)</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/toys/chumby/readme_1218318480.html</guid><pubDate>Sat, 09 Aug 2008 21:48:00 -0000</pubDate></item><item><title>in-a-box: Sun Apr 13 21:51:00 2008</title><description><p>Google AppEngine just introduced an interesting twist to this story.
It's been widely pointed out that if a "win condition" for your
Web-based Idea getting popular is "get bought by Google", then there's
an advantage to already being on AppEngine - you already fit their
deployment and scaling model, and the mechanics of the move have much
lower friction. (Expect the AppEngine library to sprout many more
"mid level" components, like user messaging, so you can just "turn on"
features instead of reinventing them - think in terms of what the Mac
APIs did for Mac apps - and see how that makes it easier for something
to be "part of the family" than to be pointlessly different.)</p>
<p>Given that, what does the feature set look like?</p>
<ul>
<li>Single-signon: apparently there's a way to do openid with Google Apps</li>
<li>DNS: pointing to Google Apps works, and they are a registrar but I don't see a service yet</li>
<li>Shared storage: <ul>
<li>google shared documents</li>
<li>bigtable</li>
<li>picasa (marginal, but a photo gallery of whiteboards is useful)</li>
</ul>
</li>
<li>Code repository<ul>
<li>code.google or sourceforge (for your opensource parts)</li>
<li>for proprietary code... there's a gap here.</li>
</ul>
</li>
<li>email: gmail</li>
<li>calendaring: google calendar</li>
<li>scheduling: while a gtd app on GAE would be easy, it isn't a google-based thing yet</li>
<li>public discussion/forums: google groups</li>
</ul>
<p>This also slam-dunks the scaling question :-) It doesn't cover any of
the more real-world parts of the service - business/management advice,
payroll... thinking <em>very</em> far ahead, could google do a SalesForce.com
or AdminiStaff kind of play? Even in the narrow startup space, there's
plenty of duplication possible (that's one reason that experience in
"startups" is useful in its own right.)</p>
<p>Clearly there's a lot of Instant Startup 2.0 already available in a
google-shaped box - but the gaps are significant too...</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/in-a-box/readme_1208155860.html</guid><pubDate>Mon, 14 Apr 2008 06:51:00 -0000</pubDate></item><item><title>vernier: Sat Mar 29 00:31:00 2008</title><description><p>Thanks to Federico Grau (for going back and forth with Vernier) for
finding a calibration mechanism, but also for noting that Greg Kroah
Hartman's tutorial and example code (in particular, the user-space
<code>get_temp</code> wrapper) actually multiplies by the cryptic-looking
value 0.0078125 to get Celsius values.</p>
<p>Thanks also to <code>johnl</code> for pointing out that his device was
calibrated in units of 128ths of a degree, instead of 100ths; when he
pointed that out, I went back and looked at the cryptic-looking
number, and realized that my "computational numerology" skills had
failed me - 0.0078125 <em>is</em> 1/128 (my original 1/100 was an entirely
unjustified guess.)</p>
<p>(Also, thanks to Dave Vernier for his feedback, which hasn't yet been
incorporated into the code - that's right, Vernier isn't just a clever
name for a measurement company, it's an actual person :-)</p>
<p>Footnotes:</p>
<ul>
<li>"Stainless Steel Temperature Probe (Order Code TMP-BTA)" <a href="http://www2.vernier.com/booklets/tmp-bta.pdf">http://www2.vernier.com/booklets/tmp-bta.pdf</a>
</li>
<li>Greg Kroah-Hartman's driver tutorial <a href="http://tree.celinuxforum.org/CelfPubWiki/ELC2006Presentations?action=AttachFile&amp;do=get&amp;target=celf_2006_tutorial.pdf">http://tree.celinuxforum.org/CelfPubWiki/ELC2006Presentations?action=AttachFile&amp;do=get&amp;target=celf_2006_tutorial.pdf</a>
</li>
<li>ldusb reader with the (now-obvious) correction <a href="gotemp-ldusb.py">gotemp-ldusb.py</a>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/vernier/readme_1206783060.html</guid><pubDate>Sat, 29 Mar 2008 09:31:00 -0000</pubDate></item><item><title>pyfox: Wed Mar 26 22:46:00 2008</title><description><p>Footnotes:</p>
<ul>
<li>
<a href="http://developer.mozilla.org/en/docs/Creating_a_Python_XPCOM_component">http://developer.mozilla.org/en/docs/Creating_a_Python_XPCOM_component</a><ul>
<li>assumes you've read <a href="http://books.mozdev.org/html/mozilla-chp-8-sect-2.html">http://books.mozdev.org/html/mozilla-chp-8-sect-2.html</a>
</li>
</ul>
</li>
<li>all of the book reviews point to <a href="http://www.xulplanet.com/">http://www.xulplanet.com/</a>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/pyfox/readme_1206603960.html</guid><pubDate>Thu, 27 Mar 2008 07:46:00 -0000</pubDate></item><item><title>usgs: Thu Mar 20 00:33:00 2008</title><description><p>As part of the <code>libremap</code> project, the entire 24k scale USGS quads were
acquired and made available on <code>archive.org</code> (by gathering donations for
a complete set of media.)</p>
<p>The top level "collection page" (<code>maps_usgs</code>) has links to individual
states (like <code>usgs_ma</code>.) These then have "this just in" links (like
<code>usgs_drg_ma_41070_e8</code>) which are detail pages, with text metadata, xml
metadata, <code>tfw</code> files (georeferences) and the actual tif files.</p>
<ul>
<li>the project <a href="http://libremap.org/">http://libremap.org/</a>
</li>
<li>the published collection page <a href="http://www.archive.org/details/maps_usgs">http://www.archive.org/details/maps_usgs</a>
</li>
<li>MA <a href="http://www.archive.org/details/usgs_ma">http://www.archive.org/details/usgs_ma</a>
</li>
<li>selected MA map <a href="http://www.archive.org/details/usgs_drg_ma_41070_e8">http://www.archive.org/details/usgs_drg_ma_41070_e8</a>
</li>
</ul>
<p>It may be more useful to use a collection search, and walk the "next"
links, once we have the list of collection names.</p>
<ul>
<li><a href="http://www.archive.org/search.php?query=collection%3A%22usgs_ma%22">http://www.archive.org/search.php?query=collection%3A%22usgs_ma%22</a></li>
<li><a href="http://www.archive.org/search.php?query=collection%3A%22maps_usgs%22">http://www.archive.org/search.php?query=collection%3A%22maps_usgs%22</a></li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/usgs/readme_1206005580.html</guid><pubDate>Thu, 20 Mar 2008 09:33:00 -0000</pubDate></item><item><title>toys: Tue Feb 26 01:20:00 2008</title><description><p><a href="t9.py">t9.py</a> is an exploration of words with ambiguous T9 (phone
text interface) encodings. The interesting bit is the scaling
issue... or lack of one: it handled a 230K wordlist, producing 10k
result sets, in about 30 seconds... on an EEEpc. Completely naive
implementation, no optimization (and thus no <em>wasted</em> optimization :-)
I did use <code>string.maketrans</code> and <code>string.translate</code> but that
was more because I'd used them before and they're actually a pretty
natural fit for this task. (I did switch from lists to sets, but that
wasn't performance-related either - the wordlist I was working from
had a variety of entries that weren't unique when downcased, and it
didn't occur to me to just use <code>sort -fu</code> on it.)</p>
<p>Footnotes:</p>
<ul>
<li>T9 appears to be a trademark of Nuance Communications, Inc. <a href="http://www.t9.com">http://www.t9.com</a>
</li>
<li>The specific EEEpc tested is a 900mhz celeron M with 1G of useful RAM.</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/toys/readme_1204024800.html</guid><pubDate>Tue, 26 Feb 2008 11:20:00 -0000</pubDate></item><item><title>hm: Sun Feb 24 20:46:00 2008</title><description><p>Minor fixes to <a href="todo.py">todo.py</a> today;</p>
<ul>
<li>broken return-value handling in <code>but_first</code>
</li>
<li>
<code>list</code> didn't report errors (<code>todo.pl</code> has the same bug, patch sent upstream)</li>
<li>improved <code>sid</code>-cookie handling</li>
</ul>
<p>(I'm using defer-until-task enough that I should make it an actual subcommand :-)</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/hm/readme_1203921960.html</guid><pubDate>Mon, 25 Feb 2008 06:46:00 -0000</pubDate></item><item><title>calendar: Tue Jan 29 02:36:00 2008</title><description><p><code>gcalcli.py</code> might be a better answer to all of this. See also <code>stfl</code>.</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/calendar/readme_1201610160.html</guid><pubDate>Tue, 29 Jan 2008 12:36:00 -0000</pubDate></item><item><title>xscreensaver: Mon Jan 21 00:40:00 2008</title><description><p>New project space for xscreensaver modules in python. The most recent
experiments have been in the area of vector text;
<a href="xss_vector_text.py">xss_vector_text.py</a> isn't much to look at, and fairly retro,
but it has a compact notation for pseudo-multi-segment characters and
can draw a randomly selected word across the top of the screen. Not
exciting, just another piece (and I may replace it with real text with
fonts later.)</p>
<p>One interesting note: the version of python-xlib I have has a typo, a
call to <code>PolSegment</code> instead of <code>PolySegment</code>. Fixed on
sourceforge... back in 2003 :-) but the one in Debian didn't get
updated until April 2007 (post-etch.) If you have 0.12-5.1, read the
comments in <a href="xss_vector_text.py">xss_vector_text.py</a> for details, or just make the
obvious change.</p>
<p>Footnotes:</p>
<ul>
<li>debian update to <code>python-xlib</code> <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=421594">http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=421594</a>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/xscreensaver/readme_1200912000.html</guid><pubDate>Mon, 21 Jan 2008 10:40:00 -0000</pubDate></item><item><title>Mon Jan 14 22:47:00 2008</title><description><p />
<p>The README-blog has enough content that it is starting to pick up
traffic about random topics, even with only email and zephyr
backchannels. femtocomment got sidetracked into being an OpenID
playground, which made sense a year ago, but looking at
<a href="http://openid.net/">http://openid.net/</a> today, it's a lot more real, and I should start
focusing on the <i>comment</i> side of the story again.</p>
<p>(I'll probably start with something that works off of a simple
hand-set cookie just to get it off the ground, but that's not
inconsistent with having an OpenID interface, it's just a shortcut
path.)</p>
<h3>Inputs:</h3>
<ul><li> the comment itself</li><li> the authentication metadata</li><li> the context of the comment</li><ul><li> replying to what posting</li><li> (later) replying to what comment</li><li> when</li></ul></ul>
<p />
<h3>Outputs:</h3>
<ul><li> rendering of comments (threads) on each topic page</li><li> global comment-review page</li><ul><li> site-wide, for the administrator (me)</li><li> comment deletion</li><li> cookie revocation / (later) id blocking</li></ul><li> (later) RSS feeds for comment threads you're in</li><li> (later) email for comments</li></ul>
<p />
<h3>Constraints:</h3>
<ul><li> Can't be generated offline the way the blog is</li><ul><li> README-blog can insert a "talk to the service" bit, though</li><li> maybe README-blog can pull static copies of threads, so the service bit is only the freshest stuff?</li></ul></ul>
<p />
<p>This is probably enough to start slinging bits around and see what it
looks like :-)</p>
<h3>Footnotes:</h3>
<ul><li> OpenID DevCamp <a href="http://barcamp.org/OpenIDDevCamp">http://barcamp.org/OpenIDDevCamp</a></li><li> OpenID standards <a href="http://openid.net">http://openid.net</a></li></ul></description><guid isPermaLink="true">http://www.thok.org/intranet/python/blogthing/femtocomment/README.html#Mon_Jan_14_22:47:00_2008</guid><pubDate>Tue, 15 Jan 2008 03:47:00 GMT</pubDate></item><item><title>meterstone: Mon Dec 3 03:16:00 2007</title><description><p>Codemonth is over, and while I didn't get as much done as I'd hoped, I
did make some real progress... and while stuffing more software into
the EEEpc and configuring it has been a major distraction, it just now
gave something back - turns out that there <em>is</em> a useful outline
editor in debian after all, called <code>treeline</code> (found during a
mis-aimed <code>apt-cache search</code> for "python doc".) It's an outline
editor that can make a fair guess at arbitrary XML files; it loaded
meterstone's one sample file immediately - and was able to "export" it
back (as "Generic" XML) to a file that meterstone could read
(treeline's save format is somewhat different, though.)</p>
<p>A related search also turned up <code>tcm</code>, the "Toolkit for Conceptual
Modeling", which looks like it's trying to cover what would be the
overall task breakdown part problem in more detail, without actually
looking at estimation at all. It's also a <em>very</em> retro-looking
<code>lesstif</code> app, which apparently hasn't been touched since 2003, so
I'm not sure it will actually help, but it seemed worth noting.</p>
<p>Footnotes:</p>
<ul>
<li>codemonth <a href="http://www.codemonth.org/">http://www.codemonth.org/</a>
</li>
<li>treeline <a href="http://www.bellz.org/treeline/">http://www.bellz.org/treeline/</a>
</li>
<li>tcm <a href="http://wwwhome.cs.utwente.nl/~tcm/">http://wwwhome.cs.utwente.nl/~tcm/</a>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/meterstone/readme_1196687760.html</guid><pubDate>Mon, 03 Dec 2007 13:16:00 -0000</pubDate></item><item><title>krbvert: Sat Nov 3 23:55:00 2007</title><description><p>I gave in and built my own <code>SLAB</code> kernel and modules; I'm not too
happy with the result (suspend works but I've had some lockups that
I'm blaming the video driver for for now) but I'm going to move
forward with it anyway.</p>
<p>Had a near miss with noticing that Gutsy's <code>ssh</code> supports setting
<code>GSSAPITrustDns=no</code> but the documentation points out that this
just means passing the value <em>to</em> GSSAPI... which then goes back out
to DNS to (mis)canonicalize it anyway, which misses the point, and
lets me get back to work on this project :-)</p>
<p>A bunch of grinding, and discovering the need to copy the <code>struct
addrinfo</code> <em>and</em> the contained <code>ai_addr</code> in the cache, and I've got a
successful, if crude, tool...</p>
<p>Given <code>strdup</code> I'm sort of surprised not to find a corresponding
<code>memdup</code>, so I put one in. (The code would be more readable with
a gnu-style <code>xstrdup</code> and <code>xmemdup</code> so maybe I'll add those
later; for now the debugging code still gets in the way...)</p>
<p>Current state: grabs the IPv4 address that the first <code>getaddrinfo</code>
call returns, as it goes by, and saves it; when <code>getnameinfo</code> is
called with that address, stuff the originally-supplied name in the
result, over the result that actually came back.</p>
<p>Future enhancements:</p>
<ul>
<li>build a map from <em>all</em> <code>getaddrinfo</code> calls</li>
<li>handle IPv4 and IPv6 addresses</li>
<li>for that matter, handle all addresses that come back</li>
<li>package it for Debian</li>
<li>package it for FreeBSD (whatever that means)</li>
<li>investigate <code>getnameinfo</code> flags more carefully</li>
<li>don't assume that <code>getnameinfo</code> gets <em>any</em> valid answer - if we get a match, return it directly without even calling the upstream function</li>
</ul>
<p>However, those can wait until I get some feedback - it now
accomplishes the primary goal, which was to let me drop my
hack-and-slash patches to ssh and just maintain a separate module.
Think of it as "Aspect Oriented Programming... in C" :-)</p>
<ul>
<li>Aspect Oriented Programming <a href="http://aosd.net/">http://aosd.net/</a>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/krbvert/readme_1194166500.html</guid><pubDate>Sun, 04 Nov 2007 08:55:00 -0000</pubDate></item><item><title>turbogears: Thu Sep 6 02:55:00 2007</title><description><p>Another quick note - turns out we should be able to avoid the whole
<code>IntCol</code> problem with <code>sqlmeta.idName = "user_id"</code> (and
tweaking <code>welcome.kid</code> to <em>display</em> the username so we can get
some evidence...) but that doesn't seem to change the <em>object</em>, just
the schema <code>user_id INTEGER PRIMARY KEY</code> so it's easier to change
<code>tgopenidlogin</code> to reference user.id instead, and that seems to
work fine... I can add login identifiers to pages, I can logout and
login again... that's <em>really</em> enough to get started :-)</p>
<ul>
<li><a href="http://oturbogears.org/documentacao/tutorial/tutorial-sqlobject/manipulando-a-estrutura-do-banco">http://oturbogears.org/documentacao/tutorial/tutorial-sqlobject/manipulando-a-estrutura-do-banco</a></li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/turbogears/readme_1189079700.html</guid><pubDate>Thu, 06 Sep 2007 11:55:00 -0000</pubDate></item><item><title>notdoneyet: Sun Aug 26 03:20:00 2007</title><description><p>I worked through the tutorial, read a bit more and argued some things
out with friends... and concluded that</p>
<ul>
<li>the "free" admin interface is basically useless at exactly the point where your app acquires any workflow (and since I think of apps from a workflow perspective, not the database perspective, this means a huge impedance mismatch :-)</li>
<li>django has a content-management-system bias - not a surprising one, but one that makes it a poor match for my development style</li>
<li>django has a related "databases matter" bias - likewise.</li>
</ul>
<p>I dug around a bit and discovered that TurboGears is more aligned to
my perspective, and I already had a copy of the book... watched the
"20 Minute Wiki screencast", and realized that it <em>did</em> match my
biases much better, so I'm going to stop beating my head against
django for a while and pick up TurboGears again.</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/django/notdoneyet/readme_1188130800.html</guid><pubDate>Sun, 26 Aug 2007 12:20:00 -0000</pubDate></item><item><title>django: Mon Aug 13 00:11:00 2007</title><description><p>Random thought while working on this: does the model-view-controller
encourage a split that, while making it practical to change parts of
the system independently, makes it harder to focus on the overall user
experience? Or do you simply do them "all at once" early on and try
to get the big picture right, and then <em>refine</em> the 3 components on
their own?</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/django/readme_1186996260.html</guid><pubDate>Mon, 13 Aug 2007 09:11:00 -0000</pubDate></item><item><title>firefox: Tue Jul 24 01:50:00 2007</title><description><p>I did try the search-through-HTML approach to strip the Conkeror
link-numbers (since I have the cut&amp;paste selection with contamination,
and the raw HTML of the page, I can search for one to find the other.)
My results were fuzzier than I liked, and refining the effort didn't
really hold my attention.</p>
<p>I found something simpler:</p>
<div class="codehilite"><pre><span></span><code><span class="k">function</span><span class="w"> </span><span class="nf">strip_numbers_hard</span><span class="p">()</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">removeExisting</span><span class="p">(</span><span class="n">document</span><span class="p">.</span><span class="n">commandDispatcher</span><span class="p">.</span><span class="n">focusedWindow</span><span class="p">.</span><span class="n">document</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div>
<p>If I run that before the cut&amp;paste, I lose the numbered-links
entirely, and the existing code should just work...</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/firefox/readme_1185274200.html</guid><pubDate>Tue, 24 Jul 2007 10:50:00 -0000</pubDate></item><item><title>pma430: Mon Jul 9 00:35:00 2007</title><description><p>The PMA430 survived a european trip, as an image tank (at 700 pictures
in one particular day, that was a good thing, though that means I
<em>could</em> have made do with a handful of cards, having the pictures in
two places was comforting.)</p>
<p>As a web browser, it didn't do so well - mostly because, it turns out,
that there's a lot of manufacturing variation in the quality of the
connection of the antenna to the motherboard - so it makes sense to
open it up and just solder it in place. In the meantime, I only
really had coverage in hotel lobbies, not in rooms... so I mostly used
it to check on the outside world. I didn't really have time to code
a captioning tool, or even upload individual pictures to flickr with
the browser, and ended up doing a lot of captioning back on the laptop
with the copy I made before the plane ride home.</p>
<p>(Note that checking the outside world wasn't really a win, either; CNN
was in the midst of a Paris Hilton droolfest, I think I'm just going
to take them out of my bookmarks altogether and start reading IHT
intead :-)</p>
<p>Also, now that I'm back, one of the OpenPMA developers has dug up the
flash image builder tool source code - as I thought, they're simple
enough to just rewrite as python scripts (using the <code>struct</code>
module) and that will help make the buildsystem more portable, as will
using <code>genext2fs</code> (looks like we might not even need fakeroot,
given <code>genext2fs -P -U</code> and all.)</p>
<p>Footnotes:</p>
<ul>
<li>IHT (International Herald Tribune) <a href="http://www.iht.com">http://www.iht.com</a>
</li>
<li>Probable CNN headline article that pushed me over the edge <a href="http://www.cnn.com/2007/SHOWBIZ/TV/06/26/hilton.release/">http://www.cnn.com/2007/SHOWBIZ/TV/06/26/hilton.release/</a>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/toys/pma430/readme_1183973700.html</guid><pubDate>Mon, 09 Jul 2007 09:35:00 -0000</pubDate></item><item><title>globe: Sun Jul 1 16:06:00 2007</title><description><p>More experimentation in the past week leads me to believe that
<code>GL_POLYGON</code> and <code>GL_QUAD_STRIP</code> and the like do triangular
decomposition... and get it wrong, somehow, because only <em>some</em> parts
of various polygons go away with <code>GL_CULL_FACE</code> but some obvious
triangles remain that clearly shouldn't. This seems to be consistent
with accelerated and non-accelerated OpenGL in the server (discovered
the latter when rolling back from a 2.6.22 kernel to 2.6.20, and
forgetting to roll back the <code>xorg-driver-fglrx</code> package.) I'll
have to try newer libraries.</p>
<p>The approach I'm taking for the moment is to simply draw a unit radius
blue sphere, and then draw the continents over it; using
<code>GL_CULL_FACE</code> to cull polygons with backwards winding was
supposed to make this do the right thing.</p>
<p>An alternate approach is suggested by some of the "NeHe" tutorial/demo
programs - create a texture out of the polygons, and then map it on to
the sphere. This should make the rotation and other navigation
stunningly fast, but departs rather a lot from the original program's
concept...</p>
<p>Footnotes:</p>
<ul>
<li>NeHe tutorials <a href="http://nehe.gamedev.net">http://nehe.gamedev.net</a>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/globe/readme_1183316760.html</guid><pubDate>Sun, 01 Jul 2007 19:06:00 -0000</pubDate></item><item><title>contacts: Thu Jun 21 22:04:00 2007</title><description><p>Found a better vcard parser, in <code>pycocumalib/vcard.py</code> - PyCoCuMa
(Pythonic Contact and Customer Management) is a somewhat dated-looking
(Tk and XML-RPC based) pure-vcf contact manager. Produced a simple
<code>vcard_to_pma.py</code> script that does a "good" match... fills in a
<code>&lt;Contact&gt;</code> with the obvious mapping from vcard fields. Not
attempting to sync, this is a one-way translation, and doesn't yet
flag data that gets lost; AddressBook has a fair number of fields that
aren't reflected in RFC 2426, like <code>Profession</code>, <code>Spouse</code>, and
<code>Pronunciation</code> fields; likewise vcard has <code>TZ</code>, <code>GEO</code>, <code>LOGO</code>, and <code>X-*</code>
extension fields that aren't mapped. The next version of this should
probably report any "leftover" data that doesn't get sent over, but I
think this is a good start.</p>
<p>Footnotes:</p>
<ul>
<li>PyCoCuMa upstream <a href="http://www.srcco.de/pycocuma/index.html">http://www.srcco.de/pycocuma/index.html</a> 0.4.5-6 (2005-09-13 23:25 CET) is the latest upstream</li>
<li>
<a href="vcard_to_pma.py">vcard_to_pma.py</a> </li>
<li>RFC 2426 <a href="http://www.ietf.org/rfc/rfc2426.txt">http://www.ietf.org/rfc/rfc2426.txt</a>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/contacts/readme_1182474240.html</guid><pubDate>Fri, 22 Jun 2007 01:04:00 -0000</pubDate></item><item><title>distributed-photography: Thu Apr 26 21:11:00 2007</title><description><p>So many people have digital cameras, pretty much everywhere... but
there's no infrastructure to <em>harness</em> that. Flickr Maps
<a href="http://www.flickr.com/map/">http://www.flickr.com/map/</a> can be used to find <em>pictures</em> in many
places, but only those that have already been taken <em>and</em> geolocated
(often manually.) (Flickr claims 15 million geolocated pictures, out
of around 450 million.)</p>
<p>That gives us a standard set of Web 2.0 ingredients:</p>
<ul>
<li>geography/locality</li>
<li>social/community</li>
<li>photos</li>
<li>realtime</li>
<li>subvert mainstream media</li>
<li>user developed content</li>
<li>mashup</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/distributed-photography/readme_1177654260.html</guid><pubDate>Fri, 27 Apr 2007 06:11:00 -0000</pubDate></item><item><title>distractme: Sun Apr 15 13:01:00 2007</title><description><p>I did a little more hacking here - a simple python script to figure
out what's the top window and log it, using <code>subprocess.Popen</code> to
call <code>xwininfo</code> and <code>xprop</code>.</p>
<p>This turned up some interesting tidbits:</p>
<ul>
<li>
<code>xterm</code> already has <code>WM_NAME</code> set via an old <code>$PS1</code> setting</li>
<li>
<code>emacs</code> only puts the buffer in the title for multiple frames; <code>(setq frame-title-format "%b")</code> fixes this.</li>
<li>
<code>firefox</code> (using the <code>conkeror</code> extension) puts the "buffer" (page/tab) name in the title; it turned out to be easy to change this to the URL with a scattering of <code>document.title = document.commandDispatcher.focusedWindow.location.href;</code> statements.</li>
</ul>
<p>Since I was having some reliability issues with figuring out the "top
window", I tried using <code>ratpoison -c 'windows %s%i'</code> but something
about running that 3 times/second (or possibly about using c-c to
interrupt it) crashed ratpoison (1.4.0-beta4 ubuntu) which I'll try
and diagnose later.</p>
<p>In the meantime, a discussion about some of my old perl code (the fact
that I still set my X desktop with code that uses my pure-perl Xlib
implementation,
<a href="http://www.foo.be/docs/tpj/issues/vol2_1/tpj0201-0010.html">http://www.foo.be/docs/tpj/issues/vol2_1/tpj0201-0010.html</a> was pointed
out as one of the last chunks of perl in my life, since my
"conversion" to python) inspired me to look at <code>python-xlib</code> again.
Turns out that <code>python-xlib</code> has a nicely rich interface (windows
as objects with methods, rather than a thin mapping to the C bindings,
while still being appropriately close to the wire.) <code>python-xlib</code>
gave me a number of advantages:</p>
<ul>
<li>X errors (due to the transient nature of these particular windows) turn into <code>Xlib.error.BadWindow</code> exceptions, which I can handle cleanly</li>
<li>it takes less code to ask for the particular property via <code>topwin.get_wm_name()</code> than to parse them out of <code>xprop</code> output</li>
<li>once I lost the extra baggage of parsing code, it was easier to see simpler ways to look at the overall structure</li>
<li>using the interactive python interpreter to poke at window state directly made it much easier to decide that <code>child.get_attributes().override_redirect</code> was worth checking (turns out that were override-redirect windows which were higher on the list, but still not the "real" top window.)</li>
</ul>
<p>The current version <a href="on_top.py">on_top.py</a> still has a little debugging
info, and only covers the <em>logging</em> and data-gathering parts of the
effort. It doesn't cover actually mapping this information to what
project I'm actually working on; I want to start out by collecting
evidence, and after a few days of that will come back and figure out
how to analyze it.</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/distractme/readme_1176674460.html</guid><pubDate>Sun, 15 Apr 2007 22:01:00 -0000</pubDate></item><item><title>effort: Sun Feb 25 20:50:00 2007</title><description><p>A year or so back I picked up a Fujitsu Scansnap to use with my old Mac laptop, to help get rid of tax-time paperwork. The workflow never really got going, mostly because I didn't have decent tools for scripting a routing workflow, or even scripting the OCR part of things... what I really wanted was something to let me "tag" a given doc with a few keywords ("bill" and "phone", or "postcard" and "italy") but also to keep a queue of scanned but not yet filed things, so I could just dump stuff in to the scanner without actually interacting with it. (The ScanSnap scans both sides of the page simultaneously as it feeds it through, and can handle 10+ pages in the hopper at a time...)</p>
<p>Anyway, linux (well, unix) scanner support (using SANE) has been pretty good in general - doesn't typically handle the <em>cheapest</em> scanners, but is ok with ones a little further up the food chain. It lists support for a few fujitsu scanners, but not the ScanSnap itself.</p>
<p>I finally did a little more digging... actually plugged it in to an Ubuntu Edgy box, got the vendor and product ids (<code>vendor:0x4c5 product:0x10f2</code>), and found references to <em>related</em> models, but not this one.</p>
<p>To make a long story short:</p>
<ul>
<li>the Mac model of the ScanSnap is different from the Windows one in three ways:<ul>
<li>it is white</li>
<li>it is called the FI-5110EOX<em>M</em> and not the FI-5110EOX</li>
<li>it has a distinct USB product id.</li>
</ul>
</li>
<li>it isn't different in any <em>other</em> way...</li>
<li>adding <code>usb 0x04c5 0x10f2</code> to the end of <code>/etc/sane.d/usb/fujitsu.conf</code> got sane to recognize it</li>
<li>using <code>scanadf --device fujitsu:libusb:001:004 --source "ADF Duplex" --mode Color -v</code> scanned both sides of the page I put into the scanner.</li>
</ul>
<p>I still need a good linux OCR solution... or really, even a half-bad one... but this is certainly a practical starting point for grabbing pages in bulk, and possibly for a "photocopier" kiosk (it's hooked to the same machine as the Lexmark E210 printer, though it lacks duplexing.)</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/effort/readme_1172472600.html</guid><pubDate>Mon, 26 Feb 2007 06:50:00 -0000</pubDate></item><item><title>Thu Feb 22 21:28:00 2007</title><description><p />
<p>Another random item.</p>
<p><tt>*</tt> should be just a star...</p></description><guid isPermaLink="true">http://www.thok.org/intranet/python/blogthing/testing/_TEST_INPUT.html#Thu_Feb_22_21:28:00_2007</guid><pubDate>Fri, 23 Feb 2007 02:28:00 GMT</pubDate></item><item><title>nagaina: Fri Feb 9 02:19:00 2007</title><description><p>Still running multihomed, clearly need to do at least some tests in a
channel-specific manner. The easy thing to start with is <code>probe_ping</code>,
since it has a <code>-S</code> option for source address, which should do the right
thing when combined with our iprules. However, since this is testing
the interface, not the remote resource, it isn't an option to
<code>probe_ping</code>, but a new <code>probe_interface</code> or something like that.</p>
<p>Later versions should probably do similar tests with TCP.</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/nagaina/notes_1171023540.html</guid><pubDate>Fri, 09 Feb 2007 12:19:00 -0000</pubDate></item><item><title>irobot-create: Wed Jan 24 21:41:00 2007</title><description><p>Turns out that all of the tools one uses to talk to the iRobot Create
are already in ubuntu... <code>avrdude</code>, <code>gcc-avr</code>, etc.</p>
<p>Planned projects:</p>
<ul>
<li>floor mapper</li>
<li>802.11 signal strength mapper</li>
<li>oqo chariot :-)</li>
</ul>
<p>First steps, though:</p>
<ul>
<li>unpack CMexamples.zip, cd drive</li>
<li>add <code>#include &lt;avr/signal.h&gt;</code> to <code>drive.c</code>
</li>
<li>use <code>"make DEBUG=stabs"</code> becaues the ubuntu <code>avr-gcc</code> doesn't support dwarf-2</li>
<li>plug in the cable</li>
<li>slide the controller switch to "on"<ul>
<li><code>"drivers/usb/serial/ftdi_sio.c: v1.4.3:USB FTDI Serial Converters Driver"</code></li>
</ul>
</li>
<li>
<code>avrdude -p ATMega168 -P /dev/ttyUSB3 -c stk500 -U flash:w:drive.hex</code><ul>
<li><code>avrdude: AVR Part "ATMega168" not found.</code></li>
<li>ubuntu has 5.0, upstream is 5.3</li>
<li>
<a href="http://cvs.savannah.nongnu.org/viewcvs/avrdude/avrdude.conf.in?rev=1.118&amp;root=avrdude&amp;view=log">http://cvs.savannah.nongnu.org/viewcvs/avrdude/avrdude.conf.in?rev=1.118&amp;root=avrdude&amp;view=log</a> shows that it was added in patch <code>#5100</code>
</li>
<li>added part stanza and partno define, comment out "signature" line, other new lines</li>
</ul>
</li>
</ul>
<p>Actual download:</p>
<div class="codehilite"><pre><span></span><code><span class="n">kurohyou</span><span class="o">$</span><span class="w"> </span><span class="n">avrdude</span><span class="w"> </span><span class="o">-</span><span class="n">p</span><span class="w"> </span><span class="n">ATMega168</span><span class="w"> </span><span class="o">-</span><span class="n">P</span><span class="w"> </span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">ttyUSB3</span><span class="w"> </span><span class="o">-</span><span class="n">c</span><span class="w"> </span><span class="n">stk500</span><span class="w"> </span><span class="o">-</span><span class="n">U</span><span class="w"> </span><span class="n">flash</span><span class="p">:</span><span class="n">w</span><span class="p">:</span><span class="n">drive</span><span class="o">.</span><span class="n">hex</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="n">AVR</span><span class="w"> </span><span class="n">device</span><span class="w"> </span><span class="n">initialized</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">ready</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">accept</span><span class="w"> </span><span class="n">instructions</span>
<span class="n">Reading</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="c1">################################################## | 100% 0.05s</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="n">Device</span><span class="w"> </span><span class="n">signature</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mh">0x1e9406</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="n">NOTE</span><span class="p">:</span><span class="w"> </span><span class="n">FLASH</span><span class="w"> </span><span class="n">memory</span><span class="w"> </span><span class="n">has</span><span class="w"> </span><span class="n">been</span><span class="w"> </span><span class="n">specified</span><span class="p">,</span><span class="w"> </span><span class="n">an</span><span class="w"> </span><span class="n">erase</span><span class="w"> </span><span class="n">cycle</span><span class="w"> </span><span class="n">will</span><span class="w"> </span><span class="n">be</span><span class="w"> </span><span class="n">performed</span>
<span class="w"> </span><span class="n">To</span><span class="w"> </span><span class="n">disable</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="n">feature</span><span class="p">,</span><span class="w"> </span><span class="n">specify</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="o">-</span><span class="n">D</span><span class="w"> </span><span class="n">option</span><span class="o">.</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="n">erasing</span><span class="w"> </span><span class="n">chip</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="n">reading</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="s2">"drive.hex"</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="n">drive</span><span class="o">.</span><span class="n">hex</span><span class="w"> </span><span class="n">auto</span><span class="w"> </span><span class="n">detected</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">Intel</span><span class="w"> </span><span class="n">Hex</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="n">writing</span><span class="w"> </span><span class="n">flash</span><span class="w"> </span><span class="p">(</span><span class="mi">2382</span><span class="w"> </span><span class="n">bytes</span><span class="p">):</span>
<span class="n">Writing</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="c1">################################################## | 100% 0.91s</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="mi">2382</span><span class="w"> </span><span class="n">bytes</span><span class="w"> </span><span class="n">of</span><span class="w"> </span><span class="n">flash</span><span class="w"> </span><span class="n">written</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="n">verifying</span><span class="w"> </span><span class="n">flash</span><span class="w"> </span><span class="n">memory</span><span class="w"> </span><span class="n">against</span><span class="w"> </span><span class="n">drive</span><span class="o">.</span><span class="n">hex</span><span class="p">:</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="nb">load</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="n">flash</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="n">drive</span><span class="o">.</span><span class="n">hex</span><span class="p">:</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="n">drive</span><span class="o">.</span><span class="n">hex</span><span class="w"> </span><span class="n">auto</span><span class="w"> </span><span class="n">detected</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">Intel</span><span class="w"> </span><span class="n">Hex</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="n">drive</span><span class="o">.</span><span class="n">hex</span><span class="w"> </span><span class="n">contains</span><span class="w"> </span><span class="mi">2382</span><span class="w"> </span><span class="n">bytes</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="n">reading</span><span class="w"> </span><span class="n">on</span><span class="o">-</span><span class="n">chip</span><span class="w"> </span><span class="n">flash</span><span class="w"> </span><span class="n">data</span><span class="p">:</span>
<span class="n">Reading</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="c1">################################################## | 100% 0.81s</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="n">verifying</span><span class="w"> </span><span class="o">...</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="mi">2382</span><span class="w"> </span><span class="n">bytes</span><span class="w"> </span><span class="n">of</span><span class="w"> </span><span class="n">flash</span><span class="w"> </span><span class="n">verified</span>
<span class="n">avrdude</span><span class="p">:</span><span class="w"> </span><span class="n">safemode</span><span class="p">:</span><span class="w"> </span><span class="n">Fuses</span><span class="w"> </span><span class="n">OK</span>
<span class="n">avrdude</span><span class="w"> </span><span class="n">done</span><span class="o">.</span><span class="w"> </span><span class="n">Thank</span><span class="w"> </span><span class="n">you</span><span class="o">.</span>
</code></pre></div>
<p>After running the stock program, I made simple changes to "wander drunkenly":</p>
<div class="codehilite"><pre><span></span><code>int8_t weaving = 1;
uint8_t weave_ticks = 0;
</code></pre></div>
<p>and</p>
<div class="codehilite"><pre><span></span><code><span class="c1">// wander drunkenly</span>
<span class="n">drive</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="n">weaving</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">250</span><span class="p">);</span>
<span class="c1">// how do we count time?</span>
<span class="n">weave_ticks</span><span class="w"> </span><span class="o">+</span><span class="p">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">weave_ticks</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">30</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">weaving</span><span class="w"> </span><span class="o">*</span><span class="p">=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="o">/*</span><span class="w"> </span><span class="n">flip</span><span class="w"> </span><span class="n">direction</span><span class="w"> </span><span class="o">*/</span>
<span class="w"> </span><span class="n">weave_ticks</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Not sure the time counting is "right" but it changes heading about once a second, sort of looks like it's "marching". As a sign that I've been away from C a little long for this, it took me <em>minutes</em> to notice that the first version of this I ran, the robot was drifting to one side... because I'd made <em>weaving</em> a <code>uint8_t</code>, ie. left it unsigned, so the flip didn't do what was expected.</p>
<p>That's a reasonable "hello world" for this hardware :-)</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/robots/irobot-create/readme_1169710860.html</guid><pubDate>Thu, 25 Jan 2007 07:41:00 -0000</pubDate></item><item><title>mmmpy: Sat Dec 30 22:39:00 2006</title><description><p>One followup: A mostly unsuccessful search on (palmos "c++" stl)
turned up some old articles comparing Symbian and PalmOS, and a new
article on USTL - <a href="http://ustl.sourceforge.net/">http://ustl.sourceforge.net/</a> - a much less memory
intensive STL (subset) replacement. So if I do have to go down the
porting path, that's something that might help.</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/pilot/mmmpy/readme_1167554340.html</guid><pubDate>Sun, 31 Dec 2006 08:39:00 -0000</pubDate></item><item><title>robot-factory: Wed Dec 27 00:38:00 2006</title><description><p>Today's thought is that "power" is a problem underlying all of these.
I don't think of it as a distinct class of problem - it's also one
that other people are taking care of :-) Existing drivers for energy
storage technology include</p>
<ul>
<li>cell phones</li>
<li>cordless power tools<ul>
<li>this includes A123 batteries, but also butane "fuel cells"</li>
</ul>
</li>
<li>laptops</li>
</ul>
<p>(Electric cars seem to be <em>following</em> the battery curve as driven by
laptops, not influencing it directly.)</p>
<p>In a practical sense, power is dear up to the point where you have
"enough", at which point <em>more</em> power has limited value. Devices that
can charge themselves (or be charged by other things) only need to do
short-term power management, if any.</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/robot-factory/readme_1167215880.html</guid><pubDate>Wed, 27 Dec 2006 10:38:00 -0000</pubDate></item><item><title>bluetooth: Sun Dec 17 19:23:00 2006</title><description><p>Inspired by <a href="http://www.librarything.com/">http://www.librarything.com/</a> I dug out the Flic Cordless
bluetooth scanner again. I have notes from a coworker who borrowed it
and figured out how to talk to it; there's a registration-required SDK
that I will probably grab if I have any trouble (I thought I had a
copy already, but I haven't found it.)</p>
<div class="codehilite"><pre><span></span><code><span class="nv">sudo</span><span class="w"> </span><span class="nv">rfcomm</span><span class="w"> </span><span class="k">connect</span><span class="w"> </span><span class="nv">hci0</span><span class="w"> </span><span class="s2">"00:A0:96:04:D2:B2"</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">&amp;</span>
<span class="nv">screen</span><span class="w"> </span><span class="o">/</span><span class="nv">dev</span><span class="o">/</span><span class="nv">rfcomm0</span>
<span class="nv">it</span><span class="w"> </span><span class="nv">sends</span>:
<span class="mi">79013400800202</span><span class="nv">FD</span>
<span class="nv">sent</span><span class="w"> </span><span class="mi">02</span><span class="nv">fd</span><span class="o">^</span><span class="nv">f</span>
<span class="mi">09736154967502</span><span class="nv">FE</span>
<span class="k">send</span><span class="w"> </span><span class="mi">02</span><span class="nv">fe</span><span class="o">^</span><span class="nv">f</span>
<span class="nv">got</span><span class="w"> </span><span class="mi">3</span><span class="o">-</span><span class="nv">tone</span><span class="w"> </span><span class="nv">downwards</span><span class="w"> </span><span class="nv">sequence</span><span class="w"> </span><span class="ss">(</span><span class="k">for</span><span class="w"> </span><span class="s2">"done"</span>...<span class="ss">)</span>
<span class="nv">W</span><span class="o">&lt;</span><span class="nv">RET</span><span class="o">&gt;</span>
<span class="nv">Microvision</span>®<span class="w"> </span><span class="nv">Flic</span>®<span class="w"> </span><span class="nv">Barcode</span><span class="w"> </span><span class="nv">Scanner</span>,<span class="w"> </span><span class="nv">ID</span>:<span class="w"> </span><span class="mi">4117271</span><span class="nv">B</span>,<span class="w"> </span><span class="nv">FW</span>:<span class="w"> </span><span class="mi">2</span>.<span class="mi">8</span>.<span class="mi">0</span>,<span class="w"> </span><span class="nv">BT</span>:<span class="w"> </span><span class="mi">1</span>.<span class="mi">20</span><span class="nv">M</span>
<span class="nv">W0000000000000000590000004117271BFFFF020800</span>
<span class="nv">T1</span><span class="o">&lt;</span><span class="nv">RET</span><span class="o">&gt;</span><span class="w"> </span><span class="nv">just</span><span class="w"> </span><span class="nv">beeps</span>
<span class="nv">T9</span><span class="o">&lt;</span><span class="nv">RET</span><span class="o">&gt;</span><span class="w"> </span><span class="nv">low</span><span class="o">-</span><span class="nv">beeps</span>
</code></pre></div>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/bluetooth/readme_1166419380.html</guid><pubDate>Mon, 18 Dec 2006 05:23:00 -0000</pubDate></item><item><title>bookstuff: Thu Dec 14 01:06:00 2006</title><description><p>Tried uploading Delicious Library's xml file directly to library
thing. Seems like it was a little too aggressive in that I got 900+
books, many of which I clearly don't own; I think it doesn't know
about the recommendations field. But that's what <code>cElementTree</code> is for...</p>
<p>Ah, much better: "LibraryThing found 161 unique ISBNs. 138 of them are
new (not already in your library)." (I entered a small pile of books
by looking around the room, and then clicking through suggestions and
authors and going "oh, I have that one" :-)</p>
<p><a href="delicious_asin.py">delicious_asin.py</a> is the (entirely trivial) extractor.</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/bookstuff/readme_1166094360.html</guid><pubDate>Thu, 14 Dec 2006 11:06:00 -0000</pubDate></item><item><title>todont: Wed Nov 22 01:41:00 2006</title><description><p>Requirements, probably conflicting:</p>
<ul>
<li>fast UI<ul>
<li>ie. faster than the hiveminder web ui; probably faster than <em>any</em> web UI, start with curses and emacs</li>
</ul>
</li>
<li>widely accessible UI<ul>
<li>for me that means it needs a palm app</li>
<li>and probably a web app even if it is slow</li>
</ul>
</li>
<li>rich UI<ul>
<li>while "review" and "only current doable" are useful pages, I clearly also need</li>
<li>show everything</li>
<li>show tree of dependencies (somehow, but especially in the form "what can I do to unsnarl the most")</li>
<li>What should I do next is quite reasonably based more on what it unlocks, not just what I can see</li>
<li>effort vs. payoff</li>
</ul>
</li>
<li>dependencies<ul>
<li>and-then/but-first are a good simplification</li>
<li>at the same time, it needs to be easy to <em>find</em> existing tasks to attach</li>
<li>"any of" or "choose among" is another path</li>
</ul>
</li>
<li>time/size recognition<ul>
<li>sometimes I really am looking for "what's a 1/2 hour task I can do now"</li>
<li>making estimates <em>and recording the results later</em> is good training</li>
<li>picking highest payoff tasks is sometimes the right strategy</li>
</ul>
</li>
</ul>
<p>That's certainly enough; it may be too much to do up front, but it's a
description of the show-off point at least.</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/todont/readme_1164195660.html</guid><pubDate>Wed, 22 Nov 2006 11:41:00 -0000</pubDate></item><item><title>zephyr: Thu Nov 16 03:07:00 2006</title><description><p>After ignoring the zephyr code for a while (the logger has Just Worked
for rather a while, barring network outages, and it restarts well
enough after those) I took another look at <code>ctypes</code>. One key difference
is that pyrex imports the <em>abstract</em> (as much as C ever is) structure
definitions... so you can define fields by name based on what's
visible and part of the API... because under the covers it is
compiling against the header files; with <code>ctypes</code>, you have to duplicate
the <em>physical</em> C structure, because it isn't compiling at all, just
building up the same thing in memory.</p>
<p>Given that, it still only took 95 lines of code to cook up the notice
type, initialize one, and send it (unauthenticated). I still need to
wrap it up in a more <em>useful</em> interface, but this convinces me that it
works for a library like this... next step is authentication, and then
maybe gssapi...</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/zephyr/readme_1163682420.html</guid><pubDate>Thu, 16 Nov 2006 13:07:00 -0000</pubDate></item><item><title>openafs: Wed Nov 1 01:53:00 2006</title><description><p>Wrapup:</p>
<p>These were an interesting exercise - but it turned out that my
appetite for disk space was, after all, satiable; all of the volumes
have been moved to a single Dell PE830 with mirrored 500G SATA drives.
At this time the database servers still need moving, but the clever
volume management issue no longer matters at this scale.</p>
<p>(The desktop minitowers are trailing-edge enough that it may be
harmful to donate them; the martian box is now a wireless print server
running Ubuntu Edgy Eft, and the HushPC is now a dvd-only MythTV
box... so both still have life due to their specialized nature, namely
"quiet enough (and small enough) to share space with humans in a
civilized manner".)</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/openafs/readme_1162381980.html</guid><pubDate>Wed, 01 Nov 2006 11:53:00 -0000</pubDate></item><item><title>backup: Tue Oct 17 16:27:00 2006</title><description><p>Hmm. The commandline (exclusion) args should probably get stashed in
<code>.backup_metadata</code>. For now put them here:</p>
<div class="codehilite"><pre><span></span><code><span class="kt">time</span><span class="w"> </span><span class="p">.</span><span class="o">/</span><span class="n">splitbackups</span><span class="p">.</span><span class="n">py</span><span class="w"> </span><span class="o">--</span><span class="n">path</span><span class="w"> </span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">eichin</span><span class="w"> </span><span class="o">--</span><span class="n">prep</span><span class="w"> </span><span class="o">--</span><span class="n">exclude</span><span class="w"> </span><span class="n">tmp</span><span class="w"> </span><span class="o">--</span><span class="n">exclude</span><span class="w"> </span><span class="n">metacarta</span><span class="w"> </span><span class="o">--</span><span class="n">exclude</span><span class="w"> </span><span class="n">acid</span><span class="w"> </span><span class="o">--</span><span class="n">exclude</span><span class="w"> </span><span class="n">bigdig</span><span class="w"> </span><span class="o">--</span><span class="n">exclude</span><span class="w"> </span><span class="p">.</span><span class="n">svk</span><span class="w"> </span><span class="o">--</span><span class="n">exclude</span><span class="w"> </span><span class="n">PIX</span><span class="w"> </span><span class="o">--</span><span class="n">exclude</span><span class="w"> </span><span class="p">.</span><span class="n">kde</span><span class="o">/</span><span class="n">share</span><span class="o">/</span><span class="n">apps</span><span class="o">/</span><span class="n">akregator</span><span class="o">/</span><span class="n">Archive</span><span class="w"> </span><span class="o">--</span><span class="n">exclude</span><span class="w"> </span><span class="p">.</span><span class="n">mozilla</span><span class="o">/</span><span class="n">firefox</span><span class="o">/</span><span class="n">x2mkyrlv</span><span class="p">.</span><span class="k">default</span><span class="o">/</span><span class="n">Cache</span><span class="w"> </span><span class="o">--</span><span class="n">exclude</span><span class="w"> </span><span class="p">.</span><span class="n">snownews</span><span class="o">/</span><span class="n">cache</span>
</code></pre></div>
<p><code>akgregator</code> and <code>snownews</code> are excluded because of Joliet issues.
<code>firefox</code> is excluded because it's running and expiring live.</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/backup/readme_1161134820.html</guid><pubDate>Wed, 18 Oct 2006 01:27:00 -0000</pubDate></item><item><title>vnc: Thu Oct 12 04:39:00 2006</title><description><p>While looking for a Mac OS X VNC Server (to remote-sysadmin a Eudora
problem that seemed impervious to ssh) I stumbled across "eggplant
purple", a visually oriented, rather polished, GUI test harness based
on VNC (so, while a Mac product, it can test pretty much anything.)
The primary takeaway from the video demo was that GUI testing could be
broken down into two simple abstractions:</p>
<ul>
<li>find things to push</li>
<li>script how to push them</li>
</ul>
<p>They had a nice script-building GUI for this; basically a pass-through
overlay on a VNC client where you could simply run the app under test
(or even start with a blank desktop and <em>find</em> it), making you break
down "just click on that icon" into "trace the icon, optionally adjust
the hotspot, click" which then became a saved TIFF off the icon, and a
line of script "click name-of-tiff".</p>
<p>This made simple things look simple, and you could also see how to do
more complex stuff from there. An interesting bit that took a while
to sink in was that failures automatically saved a screen shot of the
last thing attempted - so it could be used to set up scripted
screenshot generation simply as a side effect of tests with impossible
end conditions. </p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/vnc/readme_1160660340.html</guid><pubDate>Thu, 12 Oct 2006 13:39:00 -0000</pubDate></item><item><title>boston-massacre: Mon Jan 9 17:37:00 2006</title><description><p>A friend suggested a scheme that he uses to more effectively identify
and contain spam sourced mail; some searching/riffing on his name lead
me to
<a href="http://www.law.umkc.edu/faculty/projects/ftrials/bostonmassacre/keyfigures.html">http://www.law.umkc.edu/faculty/projects/ftrials/bostonmassacre/keyfigures.html</a>
and thus the name of this project.</p>
<p>Basic concept: mechanically generate reply addresses. When spam
starts arriving by one, drop it.</p>
<p>Uses:</p>
<ul>
<li>
<p>personal mail: people mostly reply anyway, so that works; or they can
add one particular one to their address book, and as long as they
don't end up getting leaked, they keep working.</p>
</li>
<li>
<p>list mail: doesn't work for mailman, membership-post-only addresses,
without some further kludging. Perhaps always post from a bucket
address or a list-specific address in those cases.</p>
</li>
<li>
<p>strangers: they come in via a generic address, and maybe don't get
in.</p>
</li>
<li>
<p>existing correspondants: hunt them down and get them to update.</p>
</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/boston-massacre/readme_1136864220.html</guid><pubDate>Tue, 10 Jan 2006 03:37:00 -0000</pubDate></item><item><title>sheetwork: Thu Dec 29 00:29:00 2005</title><description><dl>
<dt>sheetwork</dt>
<dd>A term used in edition binding for the binding operations
of folding, tipping, gathering, endsheeting, sewing, and smashing.
-- <a href="http://palimpsest.stanford.edu/don/dt/dt3078.html">http://palimpsest.stanford.edu/don/dt/dt3078.html</a>
</dd>
</dl>
<p>sheetwork is a tool for producing web pages. Not an entire blog, but
a single page article, possibly for inclusion in an outer framework
which is a blog or album structure. A page, an article, a journal
day.... Not, perhaps, a good match for the term.</p>
<ul>
<li>needs to work well with emacs</li>
<li>
<code>bzero</code> provides some possible inspirations...</li>
<li>an external tool for adding notation for objects, like images</li>
<li>commandline cooking tools (like tex, too)</li>
<li>scribe's <code>@documentstyle</code> was a good idea</li>
<li>nroff's command notation isn't bad for commands, but is bad for flow
in text</li>
<li>we've already got lots of wiki stuff, why not use it?</li>
<li>"kid" is cool, if we end up with anything template-like</li>
<li>rfc822 isn't bad as a low-end representation, at least for leading
metadata, but doesn't handle body stuff</li>
<li>must end up with an emacs mode, but not be doomed without it</li>
</ul>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/sheetwork/readme_1135852140.html</guid><pubDate>Thu, 29 Dec 2005 10:29:00 -0000</pubDate></item><item><title>deli: Mon Dec 12 00:41:00 2005</title><description><p><a href="http://delicious-py.berlios.de/">http://delicious-py.berlios.de/</a>
needs a new maintainer... but might be a better thing to leverage</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/deli/readme_1134384060.html</guid><pubDate>Mon, 12 Dec 2005 10:41:00 -0000</pubDate></item><item><title>rss: Sun Nov 27 01:02:00 2005</title><description><p>I need a better reader than snownews, more text-oriented (and
linux-friendly) than nnw. (Though images in messages were nice; it
might suffice to use w3m as a renderer and hack w3m img...)</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/rss/readme_1133089320.html</guid><pubDate>Sun, 27 Nov 2005 11:02:00 -0000</pubDate></item><item><title>comics: Sun Nov 27 00:16:00 2005</title><description><p>Most recently, switched to conkeror+firefox, and now hit c-c c-n in
the web browser to get the next comic. The same queue is fed by a
one-liner in <code>~/.snownews/browser</code>:</p>
<div class="codehilite"><pre><span></span><code>curl -Hurl:\ %s -d "" &lt;http://localhost:3383/push_url&gt;
</code></pre></div>
<p>so urls from that are queued up the same way (see ../firefox.)</p>
<p>Still should do some kind of auto-training; the simplest algorithm is
to fetch the whole page, then fetch it small-T (an hour? 5m?) later,
and see what changed, and ignore it. Keep a record (vector?) of the
whittling, and use that instead of <code>check_maybe</code>. Possibly pick a
threshold of change and display it to me - and let me vote on same
vs. different...</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/comics/readme_1133086560.html</guid><pubDate>Sun, 27 Nov 2005 10:16:00 -0000</pubDate></item><item><title>todo-prodder: Wed Nov 3 03:08:00 2004</title><description><p>higher level stuff</p>
<div class="codehilite"><pre><span></span><code><span class="o">-</span><span class="w"> </span><span class="n">produce</span><span class="w"> </span><span class="n">list</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">whole</span><span class="o">-</span><span class="n">items</span><span class="p">,</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="nc">date</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">subitems</span>
<span class="o">-</span><span class="w"> </span><span class="k">filter</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="o">[</span><span class="n">done</span><span class="o">]</span><span class="n">s</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="k">at</span><span class="w"> </span><span class="n">least</span><span class="w"> </span><span class="n">identify</span><span class="w"> </span><span class="n">them</span>
</code></pre></div>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/todo-prodder/readme_1099487280.html</guid><pubDate>Wed, 03 Nov 2004 13:08:00 -0000</pubDate></item><item><title>topicmaster: Sat Sep 11 03:03:00 2004</title><description><p>Another one - "virtual topic" of "all stufflogs mentioning chocolate
or cocoa in the clip itself"</p>
<p>Then a metaproject of "chocolate printing"</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/topicmaster/readme_1094904180.html</guid><pubDate>Sat, 11 Sep 2004 12:03:00 -0000</pubDate></item><item><title>filthy-assistant: Wed Jun 30 00:00:00 2004</title><description><p>I need to get back to the collection-of-interest-topics model, so that
short lived things like "getting passport" get pulled in, bigger
things like "accepted advertiser mail" do too...</p>
</description><guid isPermaLink="true">http://www.thok.org/intranet/python/filthy-assistant/readme_1088589600.html</guid><pubDate>Wed, 30 Jun 2004 10:00:00 -0000</pubDate></item></channel></rss>
If you would like to create a banner that links to this page (i.e. this validation result), do the following:
Download the "valid RSS" banner.
Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)
Add this HTML to your page (change the image src
attribute if necessary):
If you would like to create a text link instead, here is the URL you can use:
http://www.feedvalidator.org/check.cgi?url=http%3A//www.thok.org/intranet/everything.rss