Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://www.thok.org/intranet/everything.rss

  1. <rss version="2.0"><channel><title>Everything Classic THOK</title><description>&lt;p&gt;All postings and categories under &lt;a href="http://www.thok.org/intranet"&gt;http://www.thok.org/intranet&lt;/a&gt; unified into a
  2. single common feed.  "Classic" THOK because it doesn't include the
  3. rehosted blogs at the top level, just things that were here from the start.&lt;/p&gt;</description><link>http://www.thok.org/intranet/everything.rss</link><item><title>rants: Tue Dec  2 22:49:00 2014</title><description>&lt;p&gt;&lt;strong&gt;C privilege&lt;/strong&gt;&lt;/p&gt;
  4. &lt;p&gt;&lt;a href="readme_1415503800.html"&gt;Previously&lt;/a&gt; I went on at length about the
  5. flaws in the language-based package manager model; coincidentally I
  6. got to see some of the background/sausage-making&lt;sup id="fnref:Sausage"&gt;&lt;a href="#fn:Sausage" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; of a Debian
  7. attempt to reconcile certain
  8. &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=771794"&gt;pip vs. dpkg issues.&lt;/a&gt;
  9. While I have a lot of respect for the people involved and the effort
  10. they're putting in to the problem, I stood (quietly) by my belief that
  11. the whole space is wrong... and then a digression about C led someone&lt;sup id="fnref:Someone"&gt;&lt;a href="#fn:Someone" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt;
  12. to state that&lt;/p&gt;
  13. &lt;blockquote&gt;
  14. &lt;p&gt;&lt;em&gt;it could be argued that distros packaging &lt;strong&gt;is&lt;/strong&gt; the C package manager&lt;/em&gt;&lt;/p&gt;
  15. &lt;/blockquote&gt;
  16. &lt;p&gt;which collided with a few other ideas floating around in my head:&lt;/p&gt;
  17. &lt;ul&gt;
  18. &lt;li&gt;The extent to which a programming language is "real" rather than
  19.    "scripting" matches closely with how easy it is to get at C from
  20.    it - Go breaks the model, but (to be a little mean) Java doesn't&lt;/li&gt;
  21. &lt;li&gt;C was there first, everything else has to play by C's rules even
  22.    when they're stupid (see &lt;a href="readme_1289812140.html"&gt;&lt;code&gt;career_limiting_memcpy&lt;/code&gt;&lt;/a&gt;)&lt;/li&gt;
  23. &lt;li&gt;People who "have" C tend to defend its difficulty (discussions of
  24.    programmer interviewing techniques come to mind though I don't
  25.    have good references handy, the internet mostly has bad ones)&lt;/li&gt;
  26. &lt;li&gt;Concrete examples of
  27.    &lt;a href="http://blog.valerieaurora.org/2014/10/03/operating-systems-war-story-how-feminism-helped-me-solve-one-of-file-systems-oldest-conundrums/"&gt;human-oriented approaches to hard-core engineering problems&lt;/a&gt;
  28.    (the &lt;code&gt;relatime&lt;/code&gt; story specifically, as an instance of a solution
  29.    that implies a class of approaches.)&lt;/li&gt;
  30. &lt;/ul&gt;
  31. &lt;p&gt;All of this clicked into shape as a pattern of &lt;em&gt;privilege&lt;/em&gt; - not to
  32. coopt the language of the very real problems the industry faces, but
  33. just to look at the "anti-pattern" of the conflict between distro and
  34. language package management from a perspective that makes some sense
  35. of why language package managers refuse to die off - it's not &lt;em&gt;just&lt;/em&gt;
  36. that the people who work on them are persistent and/or stubborn.
  37. Certainly it turns the question around: given all the other
  38. language-specific package managers, &lt;em&gt;where is&lt;/em&gt; the C one? And, as with
  39. social privilege, once you start looking for it, you realize that
  40. maybe "you're soaking in it" - and that Unix has been, since the
  41. 1970's, an extended support system for the C language, so of &lt;em&gt;course&lt;/em&gt;
  42. any "distro packaging system" is going to be heavily C-program biased.&lt;/p&gt;
  43. &lt;p&gt;Now is that a &lt;em&gt;helpful&lt;/em&gt; epiphany? It has the initial smell of "reduced
  44. to a previously unsolved problem", but it does suggest that attempting
  45. to credit C with it's proper share of the packaging burden might be
  46. productive; that leads to the idea that instead of "why would a
  47. language have anything intelligent to say about where files get
  48. installed" that in fact, the language may have one set of things to
  49. say, and the distro has a &lt;em&gt;different&lt;/em&gt; set of things to say, and while
  50. we need them to mesh, they are more likely (today) to grind. It also
  51. suggests the fun mental exercise of considering a world, perhaps not
  52. &lt;em&gt;without&lt;/em&gt; C but one where you assume your language of choice (yes,
  53. Python) as a starting point - maybe not as deeply special as the Lisp
  54. Machine, but it could still lead to some implementable insight.&lt;/p&gt;
  55. &lt;div class="footnote"&gt;
  56. &lt;hr&gt;
  57. &lt;ol&gt;
  58. &lt;li id="fn:Sausage"&gt;
  59. &lt;p&gt;"If you like law, or sausage, best not watch them being made" - not
  60.   actually said by Otto von Bismarck, according to &lt;a href="http://en.wikiquote.org/wiki/Otto_von_Bismarck"&gt;wikiquote&lt;/a&gt;.&amp;#160;&lt;a href="#fnref:Sausage" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
  61. &lt;/li&gt;
  62. &lt;li id="fn:Someone"&gt;
  63. &lt;p&gt;Pretty sure it was &lt;a href="https://twitter.com/schmichael"&gt;@schmichael&lt;/a&gt;
  64.   but I could be mistaken.&amp;#160;&lt;a href="#fnref:Someone" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
  65. &lt;/li&gt;
  66. &lt;/ol&gt;
  67. &lt;/div&gt;
  68.  
  69. </description><guid isPermaLink="true">http://www.thok.org/intranet/rants/readme_1417596540.html</guid><pubDate>Wed, 03 Dec 2014 08:49:00 GMT</pubDate></item><item><title>exif: Tue Dec  2 22:22:00 2014</title><description>&lt;p&gt;Just noticed an actual "stuttering" repeat upload caused by the &lt;code&gt;flickr&lt;/code&gt;/&lt;code&gt;flickd&lt;/code&gt; processing mishandling duplicated file (one md5sum, 3 "file" names and it would re-upload the last one but tag the first one as &lt;code&gt;flickd&lt;/code&gt;...) After fixing the immediate problem by hand (deleting the duplicates on Flickr itself, then moving the &lt;code&gt;flickd&lt;/code&gt; tags around with emacs) I tried to measure the scope of the problem:&lt;/p&gt;
  70. &lt;pre class="codehilite"&gt;&lt;code&gt;import kimdaba_album
  71. album = kimdaba_album.parse(kimdaba_album.kimdaba_default_album())
  72. km = {}
  73. for img in album.findall("images/image"):
  74.  mm = img.get("md5sum")
  75.  ff = img.get("file")
  76.  km[mm] = km.get(mm, []) + [ff]
  77. print len([k for k,v in km.items() if len(v) &amp;gt; 1])&lt;/code&gt;&lt;/pre&gt;
  78.  
  79.  
  80. &lt;p&gt;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 &lt;em&gt;much&lt;/em&gt; of a mess given that there are 131446 entries total, but it still caused a visible problem and needs fixing.&lt;/p&gt;
  81.  
  82. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/exif/readme_1417594920.html</guid><pubDate>Wed, 03 Dec 2014 08:22:00 GMT</pubDate></item><item><title>Yay, youtube takes care of this now</title><description>&lt;p&gt;In 2012, Google
  83. &lt;a href="http://googleresearch.blogspot.com/2012/05/video-stabilization-on-youtube.html"&gt;added video stabilization to youtube&lt;/a&gt;
  84. under &lt;code&gt;Edit -&amp;gt; Enhancements&lt;/code&gt; so I fed it the hawk video and applied it;
  85. &lt;a href="http://www.youtube.com/watch?v=0B-A_EA93yc"&gt;http://www.youtube.com/watch?v=0B-A_EA93yc&lt;/a&gt; shows that it works quite
  86. nicely, and saves me the effort of doing any packaging work on this
  87. code.  (They've also included much more advanced techniques like
  88. &lt;a href="http://research.google.com/pubs/pub37744.html"&gt;Rolling Shutter removal&lt;/a&gt;
  89. which I hadn't even considered as a solvable problem.)&lt;/p&gt;
  90.  
  91. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/hawk/readme_1392650820.html</guid><pubDate>Mon, 17 Feb 2014 15:27:00 GMT</pubDate></item><item><title>newthing: Mon Aug  5 12:34:00 2013</title><description>&lt;p&gt;A year later and &lt;em&gt;that&lt;/em&gt; clearly worked well.  Let's try again, maybe with something simple like&lt;/p&gt;
  92. &lt;ul&gt;
  93. &lt;li&gt;
  94. &lt;code&gt;Makefile&lt;/code&gt;s (gnu is fine, esp. with guile support :-)&lt;/li&gt;
  95. &lt;li&gt;split &lt;code&gt;README.md&lt;/code&gt; into snippets&lt;/li&gt;
  96. &lt;li&gt;basic styling, even if not bootstrap...&lt;/li&gt;
  97. &lt;/ul&gt;
  98. &lt;p&gt;(In practice, it turns out that getting the &lt;em&gt;existing&lt;/em&gt; 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 :-)&lt;/p&gt;
  99.  
  100. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/newthing/readme_1375738440.html</guid><pubDate>Mon, 05 Aug 2013 21:34:00 GMT</pubDate></item><item><title>zephyr_page: Sat Oct 15 01:47:00 2011</title><description>&lt;p&gt;&lt;code&gt;zgather.py&lt;/code&gt; has been vaguely useful, but the web interface didn't really go anywhere, and I mostly use &lt;code&gt;barnowl&lt;/code&gt; as a backlog reader (along with my traditional logger.) Recent thoughts inspired a new architecture:&lt;/p&gt;
  101. &lt;ul&gt;
  102. &lt;li&gt;
  103. &lt;code&gt;couchdb&lt;/code&gt; holding zephyrgrams&lt;ul&gt;
  104. &lt;li&gt;so split out the subscribing part of &lt;code&gt;zgather.py&lt;/code&gt; into a "&lt;code&gt;tzc&lt;/code&gt; with JSON instead of S-expressions"&lt;/li&gt;
  105. &lt;li&gt;then we can run multiple subscribers, letting couchdb eliminate duplicates&lt;/li&gt;
  106. &lt;li&gt;then a &lt;code&gt;barnowl&lt;/code&gt; backend can be a couchdb client&lt;/li&gt;
  107. &lt;li&gt;continuity over upgrades is handled by extra &lt;code&gt;couchdb&lt;/code&gt; instances, &lt;em&gt;and&lt;/em&gt; extra subscribers&lt;/li&gt;
  108. &lt;li&gt;same db can hold "read this" and "liked/saved this" info&lt;/li&gt;
  109. &lt;li&gt;an IMAP interface can work with all that, allowing K-9 to be a mobile client...&lt;/li&gt;
  110. &lt;li&gt;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&lt;/li&gt;
  111. &lt;/ul&gt;
  112. &lt;/li&gt;
  113. &lt;/ul&gt;
  114.  
  115. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/zephyr_page/readme_1318675620.html</guid><pubDate>Sat, 15 Oct 2011 10:47:00 GMT</pubDate></item><item><title>mark-eichin-blogspot-com: Thu Mar  3 19:20:00 2011</title><description>&lt;p&gt;&lt;strong&gt;Tool Building&lt;/strong&gt;&lt;/p&gt;
  116. &lt;p&gt;I've put what is probably an unreasonable amount of time into building my own software tools - not particularly &lt;em&gt;novel&lt;/em&gt; tools, necessarily, just glue to create support my own idiosyncratic ways of working.  For example, back in 2003 I had a Sony Cli&amp;#233;; 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&amp;#233;, 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.&lt;/p&gt;
  117. &lt;p&gt;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 &lt;em&gt;everything&lt;/em&gt; from scratch, satisfying though that is.  For example, &lt;a href="http://daringfireball.net/projects/markdown/"&gt;MarkDown&lt;/a&gt; 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 &lt;em&gt;why&lt;/em&gt; 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.&lt;/p&gt;
  118. &lt;p&gt;This isn't the only bit of consolidation I've been doing - I finally have &lt;em&gt;all&lt;/em&gt; 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 &lt;em&gt;bins&lt;/em&gt;, 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.&lt;/p&gt;
  119. &lt;p&gt;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 &lt;em&gt;really&lt;/em&gt; increase my development velocity that much - I want to &lt;em&gt;make things happen&lt;/em&gt;.  We'll see if I actually pull that off :-)&lt;/p&gt;
  120.  
  121. </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 GMT</pubDate></item><item><title>toodledo: Sat Jan 29 02:22:00 2011</title><description>&lt;p&gt;While I still have hundreds of personal todo items filed in &lt;code&gt;hiveminder&lt;/code&gt;, 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 &lt;code&gt;RememberTheMilk&lt;/code&gt; (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.&lt;/p&gt;
  122. &lt;p&gt;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 &lt;code&gt;curl&lt;/code&gt; and &lt;code&gt;xmlstarlet&lt;/code&gt; - I don't recommend it, but &lt;/p&gt;
  123. &lt;pre class="codehilite"&gt;&lt;code&gt;curl -s "&amp;lt;http://api.toodledo.com/api.php?method=getContexts;key=$short_term_key"&amp;gt; | xmlstarlet sel -T -t -m contexts/context -s T:-:- '*' -v 'text()' -n&lt;/code&gt;&lt;/pre&gt;
  124.  
  125.  
  126. &lt;p&gt;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 &lt;code&gt;poodledo&lt;/code&gt;, 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.&lt;/p&gt;
  127. &lt;p&gt;This turns out to work just fine, at least for various filtered versions of &lt;code&gt;getTasks&lt;/code&gt;. A simple task-adder is next, probably similar to my hiveminder &lt;code&gt;todo.py&lt;/code&gt; 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 &lt;em&gt;some&lt;/em&gt; 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 &lt;code&gt;python-keyring&lt;/code&gt; 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.&lt;/p&gt;
  128. &lt;p&gt;(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.)&lt;/p&gt;
  129. &lt;ul&gt;
  130. &lt;li&gt;hiveminder &lt;a href="http://task.hm"&gt;http://task.hm&lt;/a&gt;
  131. &lt;/li&gt;
  132. &lt;li&gt;iMinder &lt;a href="http://iminder.worldairmaillinks.com/"&gt;http://iminder.worldairmaillinks.com/&lt;/a&gt; (but note that with 700+ tasks, it falls over pretty quickly on the iPad)&lt;/li&gt;
  133. &lt;li&gt;RememberTheMilk &lt;a href="http://www.rememberthemilk.com/"&gt;http://www.rememberthemilk.com/&lt;/a&gt;
  134. &lt;/li&gt;
  135. &lt;li&gt;ToodleDo &lt;a href="http://www.toodledo.com/"&gt;http://www.toodledo.com/&lt;/a&gt;
  136. &lt;/li&gt;
  137. &lt;li&gt;ToodleDo API &lt;a href="http://api.toodledo.com/2/index.php"&gt;http://api.toodledo.com/2/index.php&lt;/a&gt;
  138. &lt;/li&gt;
  139. &lt;li&gt;poodledo python wrapper &lt;a href="http://code.google.com/p/poodledo/"&gt;http://code.google.com/p/poodledo/&lt;/a&gt;
  140. &lt;/li&gt;
  141. &lt;/ul&gt;
  142.  
  143. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/toodledo/readme_1296303720.html</guid><pubDate>Sat, 29 Jan 2011 12:22:00 GMT</pubDate></item><item><title>android: Thu Dec  2 02:15:00 2010</title><description>&lt;p&gt;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 &lt;em&gt;anyway&lt;/em&gt;) 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...)&lt;/p&gt;
  144. &lt;p&gt;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&lt;/p&gt;
  145. &lt;ul&gt;
  146. &lt;li&gt;the HOME key does nothing (with haptics turned on, it clicks, but it doesn't &lt;em&gt;act&lt;/em&gt; at all - long press doesn't work either)&lt;/li&gt;
  147. &lt;li&gt;the SEARCH key does nothing (likewise)&lt;/li&gt;
  148. &lt;li&gt;the system refuses to lock the screen, even with the "Lock Screen" app&lt;/li&gt;
  149. &lt;li&gt;the power-button menu only says "power off" and "reboot" - it doesn't list "airplane mode" or "silent mode"&lt;/li&gt;
  150. &lt;/ul&gt;
  151. &lt;p&gt;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 &lt;em&gt;all&lt;/em&gt; of the above complaints might be related, I found some useful links, mostly starting from &lt;a href="http://code.google.com/p/android/issues/detail?id=4358"&gt;http://code.google.com/p/android/issues/detail?id=4358&lt;/a&gt; though &lt;a href="http://groups.google.com/group/android-porting/browse_thread/thread/61baf6058966fe31"&gt;http://groups.google.com/group/android-porting/browse_thread/thread/61baf6058966fe31&lt;/a&gt; was particularly helpful in showing the actual repair technique:&lt;/p&gt;
  152. &lt;pre class="codehilite"&gt;&lt;code&gt;$ adb shell
  153. # sqlite3 /data/data/com.android.providers.settings/databases/settings.db
  154. INSERT INTO "secure" (name, value) VALUES ('device_provisioned', 1);
  155. .quit&lt;/code&gt;&lt;/pre&gt;
  156.  
  157.  
  158. &lt;p&gt;and then reboot the phone for it to actually take effect.  Apparently &lt;code&gt;device_provisioned&lt;/code&gt; is used by &lt;code&gt;inKeyguardRestrictedKeyInputMode&lt;/code&gt; in &lt;code&gt;frameworks/base/core/java/android/view/WindowManagerPolicy.java&lt;/code&gt; 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 &lt;code&gt;DEVICE_PROVISIONED&lt;/code&gt; seems to find the relevant code (which tells me it also turns off doing anything with the dock, based on &lt;code&gt;frameworks/base/services/java/com/android/server/DockObserver.java&lt;/code&gt; 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.&lt;/p&gt;
  159. &lt;p&gt;In the meantime, I should probably write a little &lt;code&gt;SL4A&lt;/code&gt; python app to make that change directly, see &lt;a href="http://code.google.com/p/android-scripting/issues/detail?id=184#c15"&gt;http://code.google.com/p/android-scripting/issues/detail?id=184#c15&lt;/a&gt; for the first steps in getting the "run python scripts as root" part of the riddle trail.  ( &lt;code&gt;packages/apps/Provision/src/com/android/provision/DefaultActivity.java&lt;/code&gt; has the bare skeleton of how to do it from java, but doesn't include the root or UI parts at all.)&lt;/p&gt;
  160.  
  161. </description><guid isPermaLink="true">http://www.thok.org/intranet/android/readme_1291292100.html</guid><pubDate>Thu, 02 Dec 2010 12:15:00 GMT</pubDate></item><item><title>sheevaplug: Wed Feb 17 01:23:00 2010</title><description>&lt;p&gt;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.&lt;/p&gt;
  162. &lt;p&gt;Conveniently, Marvell/Globalscale just announced the GuruPlug: a SheevaPlug with&lt;/p&gt;
  163. &lt;ul&gt;
  164. &lt;li&gt;more RAM&lt;/li&gt;
  165. &lt;li&gt;builtin 802.11&lt;/li&gt;
  166. &lt;li&gt;builtin bluetooth&lt;/li&gt;
  167. &lt;li&gt;2x USB2&lt;/li&gt;
  168. &lt;li&gt;2x GigE&lt;/li&gt;
  169. &lt;li&gt;eSATA&lt;/li&gt;
  170. &lt;/ul&gt;
  171. &lt;p&gt;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...)&lt;/p&gt;
  172. &lt;ul&gt;
  173. &lt;li&gt;GuruPlug &lt;a href="http://www.globalscaletechnologies.com/t-guruplugdetails.aspx"&gt;http://www.globalscaletechnologies.com/t-guruplugdetails.aspx&lt;/a&gt;
  174. &lt;/li&gt;
  175. &lt;li&gt;SATAport &lt;a href="http://www.sataport.com/"&gt;http://www.sataport.com/&lt;/a&gt;
  176. &lt;/li&gt;
  177. &lt;/ul&gt;
  178.  
  179. </description><guid isPermaLink="true">http://www.thok.org/intranet/toys/sheevaplug/readme_1266405780.html</guid><pubDate>Wed, 17 Feb 2010 11:23:00 GMT</pubDate></item><item><title>toys: Sat Jan 30 00:57:00 2010</title><description>&lt;p&gt;Tis the season for gadget discounts.  Over the last few months I picked up &lt;/p&gt;
  180. &lt;ul&gt;
  181. &lt;li&gt;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&lt;/li&gt;
  182. &lt;li&gt;a steeply discounted Canon Rebel XS DSLR (and later the 55-250mm lens, to go with the 18-55mm kit lens)&lt;/li&gt;
  183. &lt;li&gt;a second-hand Sony Vaio P, japanese edition&lt;/li&gt;
  184. &lt;li&gt;a discounted "chumby guts" kit&lt;/li&gt;
  185. &lt;/ul&gt;
  186. &lt;p&gt;Reviews will follow eventually (the DSLR deserves it's own category, but while it's stunningly good at some things, it's significantly &lt;em&gt;worse&lt;/em&gt; than the SX10-IS at others) but I mostly wanted to note some bits about the Vaio:&lt;/p&gt;
  187. &lt;ul&gt;
  188. &lt;li&gt;
  189. &lt;a href="http://korpus.juls.savba.sk/~garabik/odds/sony_vaio_p_linux.html"&gt;http://korpus.juls.savba.sk/~garabik/odds/sony_vaio_p_linux.html&lt;/a&gt; is useful but out of date; the one thing I needed from there was &lt;code&gt;setpci -s 00:02.0 F4.B=XX&lt;/code&gt; to set brightness, which helped with the "backlight stays off on return from suspend" problem, though it may turn out that &lt;code&gt;chvt&lt;/code&gt; gets the real credit.&lt;/li&gt;
  190. &lt;li&gt;it runs Ubuntu Lucid (daily snapshot) quite nicely, at full resolution (slowly, since the Poulsbo drivers are dead, but fast enough for my usage.)  &lt;code&gt;unetbootin&lt;/code&gt; produces an installer that works fine from a USB stick (though not from the builtin SD slot.)&lt;/li&gt;
  191. &lt;li&gt;it really weighs only 2oz more than the Kindle DX&lt;/li&gt;
  192. &lt;li&gt;I &lt;em&gt;adore&lt;/em&gt; the keyboard.&lt;/li&gt;
  193. &lt;/ul&gt;
  194.  
  195. </description><guid isPermaLink="true">http://www.thok.org/intranet/toys/gadget_lust_1264849020.html</guid><pubDate>Sat, 30 Jan 2010 10:57:00 GMT</pubDate></item><item><title>usb: Thu Oct  8 00:42:00 2009</title><description>&lt;p&gt;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...&lt;/p&gt;
  196. &lt;p&gt;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 &lt;code&gt;hiddev0&lt;/code&gt; and turned the events into weights.  As much for the practice as anything, I converted it to python - handling &lt;code&gt;ioctl&lt;/code&gt;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 &lt;em&gt;mattered&lt;/em&gt;.&lt;/p&gt;
  197. &lt;ul&gt;
  198. &lt;li&gt;forum thread about the scale &lt;a href="http://www.linuxquestions.org/questions/linux-hardware-18/installing-a-usb-scale-503125/page2.html"&gt;http://www.linuxquestions.org/questions/linux-hardware-18/installing-a-usb-scale-503125/page2.html&lt;/a&gt;
  199. &lt;/li&gt;
  200. &lt;li&gt;bkubes C code &lt;a href="http://kubes.org/src/usbscale.c"&gt;http://kubes.org/src/usbscale.c&lt;/a&gt;
  201. &lt;/li&gt;
  202. &lt;li&gt;my python version &lt;a href="usbscale.py"&gt;usbscale.py&lt;/a&gt;
  203. &lt;/li&gt;
  204. &lt;/ul&gt;
  205. &lt;p&gt;The python code probably needs to run as &lt;code&gt;root&lt;/code&gt; unless you do some &lt;code&gt;udev&lt;/code&gt; 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 &lt;em&gt;pouring&lt;/em&gt; 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.)&lt;/p&gt;
  206. &lt;p&gt;&lt;em&gt;note added 20140224&lt;/em&gt; I wonder if the app attached to the &lt;a href="adaptics.co"&gt;Adaptics&lt;/a&gt; "Drop" connected-scale will include that, it at least does &lt;a href="http://gigaom.com/2014/02/24/drop-gets-into-the-kitchen-with-a-connected-scale-for-bakers/"&gt;sophisticated recipe integration...&lt;/a&gt;&lt;/p&gt;
  207.  
  208. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/usb/readme_1254994920.html</guid><pubDate>Thu, 08 Oct 2009 09:42:00 GMT</pubDate></item><item><title>eeepc: Thu Jun 25 23:35:00 2009</title><description>&lt;p&gt;Since last writing here,&lt;/p&gt;
  209. &lt;ul&gt;
  210. &lt;li&gt;Asus has flooded the market with lots of different models&lt;/li&gt;
  211. &lt;li&gt;Supposedly the EEE T91 tablet is out but noone seems to actually have it&lt;ul&gt;
  212. &lt;li&gt;&lt;a href="http://www.engadget.com/2009/05/08/asus-eee-pc-t91-confirmed-for-late-may-or-early-june-release-in/"&gt;http://www.engadget.com/2009/05/08/asus-eee-pc-t91-confirmed-for-late-may-or-early-june-release-in/&lt;/a&gt;&lt;/li&gt;
  213. &lt;/ul&gt;
  214. &lt;/li&gt;
  215. &lt;li&gt;The EEE 900 hit woot, and mydigitaldiscount.com has nice 64G SSD upgrades...&lt;ul&gt;
  216. &lt;li&gt;&lt;a href="http://www.mydigitaldiscount.com/ProductDetail.jsp?LISTID=8000092B-1231822344"&gt;http://www.mydigitaldiscount.com/ProductDetail.jsp?LISTID=8000092B-1231822344&lt;/a&gt;&lt;/li&gt;
  217. &lt;/ul&gt;
  218. &lt;/li&gt;
  219. &lt;/ul&gt;
  220. &lt;p&gt;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.)&lt;/p&gt;
  221. &lt;p&gt;(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...)&lt;/p&gt;
  222.  
  223. </description><guid isPermaLink="true">http://www.thok.org/intranet/toys/eeepc/readme_1246005300.html</guid><pubDate>Fri, 26 Jun 2009 08:35:00 GMT</pubDate></item><item><title>marysmenu: Thu May  7 01:59:00 2009</title><description>&lt;p&gt;Ready for a "live" test (though I haven't checked it live against a
  224. menu, just against a blurry picture of one, so the prices may be off.)&lt;/p&gt;
  225. &lt;ul&gt;
  226. &lt;li&gt;&lt;a href="marychungs-lunch.html"&gt;marychungs-lunch.html&lt;/a&gt;&lt;/li&gt;
  227. &lt;/ul&gt;
  228. &lt;p&gt;The people I eat with often get things from the dinner menu at lunch
  229. time too, so getting that transcribed is next.  Other next steps
  230. should include:&lt;/p&gt;
  231. &lt;ul&gt;
  232. &lt;li&gt;ajax hooks to post items for popularity counts&lt;ul&gt;
  233. &lt;li&gt;possibly then add a filter on "my usuals"&lt;/li&gt;
  234. &lt;/ul&gt;
  235. &lt;/li&gt;
  236. &lt;li&gt;some CSS to make it look less like, well, one of &lt;em&gt;my&lt;/em&gt; interfaces :-)&lt;/li&gt;
  237. &lt;li&gt;multiple (named?) diners&lt;/li&gt;
  238. &lt;li&gt;"communist" mode - option to total a group and simply divide by the group size&lt;/li&gt;
  239. &lt;/ul&gt;
  240. &lt;p&gt;At some point I should start soliciting additional menus (local to
  241. Cambridge, MA for now) and do some comparison testing on non-Android
  242. phones.&lt;/p&gt;
  243.  
  244. </description><guid isPermaLink="true">http://www.thok.org/intranet/jquery/marysmenu/readme_1241693940.html</guid><pubDate>Thu, 07 May 2009 10:59:00 GMT</pubDate></item><item><title>ztwit: Wed Dec 10 00:15:00 2008</title><description>&lt;p&gt;Got one negative comment about the flickr updates, decided to interpret it as "make them more interesting" rather than actually &lt;em&gt;stopping&lt;/em&gt; 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...)&lt;/p&gt;
  245. &lt;p&gt;The flickr updates now include as many tags as they can, sorted by popularity and length, so the latest one says &lt;code&gt;[Concord,Great Meadows National Wildlife Refuge,Massachusetts,ice,sunshine,winter,marsh...]&lt;/code&gt; 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 &lt;code&gt;tag_popularity[tag] - 1/float(len(tag))&lt;/code&gt; (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:&lt;/p&gt;
  246. &lt;pre class="codehilite"&gt;&lt;code&gt;tags = sorted(tag_popularity, key=len)
  247. tags = sorted(tags, key=tag_popularity.__getitem__)&lt;/code&gt;&lt;/pre&gt;
  248.  
  249.  
  250. &lt;p&gt;and then &lt;code&gt;reverse&lt;/code&gt; the whole thing.  (Notice that sort-stability is the place where &lt;code&gt;sorted(reverse=True)&lt;/code&gt; is different from &lt;code&gt;reversed(sorted())&lt;/code&gt; - the former reverses the direction of the current key, but preserves the order of things that were equal; the later reverses everything.)&lt;/p&gt;
  251. &lt;p&gt;Future directions could include&lt;/p&gt;
  252. &lt;ul&gt;
  253. &lt;li&gt;saving 18 characters by shortening the reference (oh, I can save 11 of those just by using flickr's own shortcuts, &lt;em&gt;done&lt;/em&gt;)&lt;/li&gt;
  254. &lt;li&gt;keeping track of &lt;em&gt;all&lt;/em&gt; 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 &lt;em&gt;now&lt;/em&gt;...)&lt;/li&gt;
  255. &lt;/ul&gt;
  256.  
  257. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/ztwit/readme_1228904100.html</guid><pubDate>Wed, 10 Dec 2008 10:15:00 GMT</pubDate></item><item><title>blogthing: Wed Dec 10 00:02:00 2008</title><description>&lt;p&gt;I've gone another year without significant change to the blogging
  258. software; I did just add &lt;a href="http://rpc.weblogs.com"&gt;http://rpc.weblogs.com&lt;/a&gt; pinging to go along
  259. with the year-old google-pinging support (embarassingly, the only
  260. difference between the two is the noise they return on success, and I
  261. just print that anyway; I was just reminded because it showed up on
  262. &lt;a href="http://scripting.com"&gt;http://scripting.com&lt;/a&gt; recently.)&lt;/p&gt;
  263. &lt;p&gt;I have been putting a little time into using Sphinx to build one of my
  264. documentation/ranting sites, though, because Sphinx sites actually
  265. look pretty nice as-is, and maybe it's time to clean up the look
  266. around here a bit (especially code display.)  It looks like I'll be
  267. able to use the existing parsers to do at least a rough draft
  268. automatic conversion to RST, which is nice - though I'm seriously
  269. considering WikiCreole as well, it looks like RST still wins on tools.&lt;/p&gt;
  270. &lt;p&gt;Footnotes:&lt;/p&gt;
  271. &lt;ul&gt;
  272. &lt;li&gt;google api &lt;a href="http://www.google.com/help/blogsearch/pinging_API.html"&gt;http://www.google.com/help/blogsearch/pinging_API.html&lt;/a&gt;
  273. &lt;/li&gt;
  274. &lt;li&gt;verisign/weblogs.com api &lt;a href="http://www.weblogs.com/api.html"&gt;http://www.weblogs.com/api.html&lt;/a&gt;
  275. &lt;/li&gt;
  276. &lt;li&gt;sphinx &lt;a href="http://sphinx.pocoo.org/"&gt;http://sphinx.pocoo.org/&lt;/a&gt;
  277. &lt;/li&gt;
  278. &lt;li&gt;RST - reStructured Text - &lt;a href="http://docutils.sourceforge.net/rst.html"&gt;http://docutils.sourceforge.net/rst.html&lt;/a&gt;
  279. &lt;/li&gt;
  280. &lt;li&gt;WikiCreole &lt;a href="http://www.wikicreole.org/wiki/Creole1.0"&gt;http://www.wikicreole.org/wiki/Creole1.0&lt;/a&gt;
  281. &lt;/li&gt;
  282. &lt;/ul&gt;
  283.  
  284. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/blogthing/readme_1228903320.html</guid><pubDate>Wed, 10 Dec 2008 10:02:00 GMT</pubDate></item><item><title>modbook: Sat Dec  6 15:42:00 2008</title><description>&lt;p&gt;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:&lt;/p&gt;
  285. &lt;ul&gt;
  286. &lt;li&gt;only 3 layers&lt;/li&gt;
  287. &lt;li&gt;only saves in bitmap formats with flattened layers (and no transparency, at least in TIFF)&lt;/li&gt;
  288. &lt;li&gt;only 30 levels of undo&lt;/li&gt;
  289. &lt;li&gt;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)&lt;/li&gt;
  290. &lt;/ul&gt;
  291. &lt;p&gt;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...&lt;/p&gt;
  292.  
  293. </description><guid isPermaLink="true">http://www.thok.org/intranet/toys/modbook/readme_1228614120.html</guid><pubDate>Sun, 07 Dec 2008 01:42:00 GMT</pubDate></item><item><title>local_tasks: Wed Dec  3 02:03:00 2008</title><description>&lt;p&gt;Need a local task manager, to handle work-paranoia about external data leaks.  It should still have cheap external &lt;em&gt;inputs&lt;/em&gt;, as long as reading it requires "internal" access.&lt;/p&gt;
  294. &lt;p&gt;Hiveminder of course provides a lot of inspiration; key differences are&lt;/p&gt;
  295. &lt;ul&gt;
  296. &lt;li&gt;should tie directly in to existing intranet systems (RT, viewsvn, moinmoin, news) via links&lt;/li&gt;
  297. &lt;li&gt;should be faster in the face of large numbers of items&lt;/li&gt;
  298. &lt;/ul&gt;
  299. &lt;p&gt;Strictly speaking it doesn't need a web interface, though that'll make it easier to spread it to other people.&lt;/p&gt;
  300. &lt;p&gt;I considered just making it a roundup instance, but I'm not sure that actually buys us anything - &lt;code&gt;local_task&lt;/code&gt; doesn't even need to be multi-user, so much of the infrastructure goes away; it probably doesn't need more than basic locking...&lt;/p&gt;
  301.  
  302. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/local_tasks/readme_1228305780.html</guid><pubDate>Wed, 03 Dec 2008 12:03:00 GMT</pubDate></item><item><title>thokalbum: Sun Sep 14 23:46:00 2008</title><description>&lt;p&gt;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.&lt;/p&gt;
  303. &lt;p&gt;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...)&lt;/p&gt;
  304. &lt;p&gt;Footnotes: &lt;/p&gt;
  305. &lt;ul&gt;
  306. &lt;li&gt;sd syncable bug tracking &lt;a href="http://syncwith.us/sd/using"&gt;http://syncwith.us/sd/using&lt;/a&gt;
  307. &lt;/li&gt;
  308. &lt;li&gt;nagaina &lt;a href="http://www.thok.org/intranet/python/nagaina/index.html"&gt;http://www.thok.org/intranet/python/nagaina/index.html&lt;/a&gt;
  309. &lt;/li&gt;
  310. &lt;/ul&gt;
  311.  
  312. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/thokalbum/readme_1221468360.html</guid><pubDate>Mon, 15 Sep 2008 08:46:00 GMT</pubDate></item><item><title>chumby: Sat Aug  9 12:48:00 2008</title><description>&lt;p&gt;Ran into an interesting flaw in the chumby-as-alarm-clock - if DNS
  313. goes out, and it can't get to chumby.com, it doesn't do anything else.
  314. Just an unexpected dependency to be aware of (and more reason to drop
  315. in my own software instead :-)&lt;/p&gt;
  316.  
  317. </description><guid isPermaLink="true">http://www.thok.org/intranet/toys/chumby/readme_1218318480.html</guid><pubDate>Sat, 09 Aug 2008 21:48:00 GMT</pubDate></item><item><title>in-a-box: Sun Apr 13 21:51:00 2008</title><description>&lt;p&gt;Google AppEngine just introduced an interesting twist to this story.
  318. It's been widely pointed out that if a "win condition" for your
  319. Web-based Idea getting popular is "get bought by Google", then there's
  320. an advantage to already being on AppEngine - you already fit their
  321. deployment and scaling model, and the mechanics of the move have much
  322. lower friction.  (Expect the AppEngine library to sprout many more
  323. "mid level" components, like user messaging, so you can just "turn on"
  324. features instead of reinventing them - think in terms of what the Mac
  325. APIs did for Mac apps - and see how that makes it easier for something
  326. to be "part of the family" than to be pointlessly different.)&lt;/p&gt;
  327. &lt;p&gt;Given that, what does the feature set look like?&lt;/p&gt;
  328. &lt;ul&gt;
  329. &lt;li&gt;Single-signon: apparently there's a way to do openid with Google Apps&lt;/li&gt;
  330. &lt;li&gt;DNS: pointing to Google Apps works, and they are a registrar but I don't see a service yet&lt;/li&gt;
  331. &lt;li&gt;Shared storage: &lt;ul&gt;
  332. &lt;li&gt;google shared documents&lt;/li&gt;
  333. &lt;li&gt;bigtable&lt;/li&gt;
  334. &lt;li&gt;picasa (marginal, but a photo gallery of whiteboards is useful)&lt;/li&gt;
  335. &lt;/ul&gt;
  336. &lt;/li&gt;
  337. &lt;li&gt;Code repository&lt;ul&gt;
  338. &lt;li&gt;code.google or sourceforge (for your opensource parts)&lt;/li&gt;
  339. &lt;li&gt;for proprietary code... there's a gap here.&lt;/li&gt;
  340. &lt;/ul&gt;
  341. &lt;/li&gt;
  342. &lt;li&gt;email: gmail&lt;/li&gt;
  343. &lt;li&gt;calendaring: google calendar&lt;/li&gt;
  344. &lt;li&gt;scheduling: while a gtd app on GAE would be easy, it isn't a google-based thing yet&lt;/li&gt;
  345. &lt;li&gt;public discussion/forums: google groups&lt;/li&gt;
  346. &lt;/ul&gt;
  347. &lt;p&gt;This also slam-dunks the scaling question :-) It doesn't cover any of
  348. the more real-world parts of the service - business/management advice,
  349. payroll... thinking &lt;em&gt;very&lt;/em&gt; far ahead, could google do a SalesForce.com
  350. or AdminiStaff kind of play?  Even in the narrow startup space, there's
  351. plenty of duplication possible (that's one reason that experience in
  352. "startups" is useful in its own right.)&lt;/p&gt;
  353. &lt;p&gt;Clearly there's a lot of Instant Startup 2.0 already available in a
  354. google-shaped box - but the gaps are significant too...&lt;/p&gt;
  355.  
  356. </description><guid isPermaLink="true">http://www.thok.org/intranet/in-a-box/readme_1208155860.html</guid><pubDate>Mon, 14 Apr 2008 06:51:00 GMT</pubDate></item><item><title>vernier: Sat Mar 29 00:31:00 2008</title><description>&lt;p&gt;Thanks to Federico Grau (for going back and forth with Vernier) for
  357. finding a calibration mechanism, but also for noting that Greg Kroah
  358. Hartman's tutorial and example code (in particular, the user-space
  359. &lt;code&gt;get_temp&lt;/code&gt; wrapper) actually multiplies by the cryptic-looking
  360. value 0.0078125 to get Celsius values.&lt;/p&gt;
  361. &lt;p&gt;Thanks also to &lt;code&gt;johnl&lt;/code&gt; for pointing out that his device was
  362. calibrated in units of 128ths of a degree, instead of 100ths; when he
  363. pointed that out, I went back and looked at the cryptic-looking
  364. number, and realized that my "computational numerology" skills had
  365. failed me - 0.0078125 &lt;em&gt;is&lt;/em&gt; 1/128 (my original 1/100 was an entirely
  366. unjustified guess.)&lt;/p&gt;
  367. &lt;p&gt;(Also, thanks to Dave Vernier for his feedback, which hasn't yet been
  368. incorporated into the code - that's right, Vernier isn't just a clever
  369. name for a measurement company, it's an actual person :-)&lt;/p&gt;
  370. &lt;p&gt;Footnotes:&lt;/p&gt;
  371. &lt;ul&gt;
  372. &lt;li&gt;"Stainless Steel Temperature Probe (Order Code TMP-BTA)"  &lt;a href="http://www2.vernier.com/booklets/tmp-bta.pdf"&gt;http://www2.vernier.com/booklets/tmp-bta.pdf&lt;/a&gt;
  373. &lt;/li&gt;
  374. &lt;li&gt;Greg Kroah-Hartman's driver tutorial &lt;a href="http://tree.celinuxforum.org/CelfPubWiki/ELC2006Presentations?action=AttachFile&amp;amp;do=get&amp;amp;target=celf_2006_tutorial.pdf"&gt;http://tree.celinuxforum.org/CelfPubWiki/ELC2006Presentations?action=AttachFile&amp;amp;do=get&amp;amp;target=celf_2006_tutorial.pdf&lt;/a&gt;
  375. &lt;/li&gt;
  376. &lt;li&gt;ldusb reader with the (now-obvious) correction &lt;a href="gotemp-ldusb.py"&gt;gotemp-ldusb.py&lt;/a&gt;
  377. &lt;/li&gt;
  378. &lt;/ul&gt;
  379.  
  380. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/vernier/readme_1206783060.html</guid><pubDate>Sat, 29 Mar 2008 09:31:00 GMT</pubDate></item><item><title>pyfox: Wed Mar 26 22:46:00 2008</title><description>&lt;p&gt;Footnotes:&lt;/p&gt;
  381. &lt;ul&gt;
  382. &lt;li&gt;
  383. &lt;a href="http://developer.mozilla.org/en/docs/Creating_a_Python_XPCOM_component"&gt;http://developer.mozilla.org/en/docs/Creating_a_Python_XPCOM_component&lt;/a&gt;&lt;ul&gt;
  384. &lt;li&gt;assumes you've read &lt;a href="http://books.mozdev.org/html/mozilla-chp-8-sect-2.html"&gt;http://books.mozdev.org/html/mozilla-chp-8-sect-2.html&lt;/a&gt;
  385. &lt;/li&gt;
  386. &lt;/ul&gt;
  387. &lt;/li&gt;
  388. &lt;li&gt;all of the book reviews point to &lt;a href="http://www.xulplanet.com/"&gt;http://www.xulplanet.com/&lt;/a&gt;
  389. &lt;/li&gt;
  390. &lt;/ul&gt;
  391.  
  392. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/pyfox/readme_1206603960.html</guid><pubDate>Thu, 27 Mar 2008 07:46:00 GMT</pubDate></item><item><title>usgs: Thu Mar 20 00:33:00 2008</title><description>&lt;p&gt;As part of the &lt;code&gt;libremap&lt;/code&gt; project, the entire 24k scale USGS quads were
  393. acquired and made available on &lt;code&gt;archive.org&lt;/code&gt; (by gathering donations for
  394. a complete set of media.)&lt;/p&gt;
  395. &lt;p&gt;The top level "collection page" (&lt;code&gt;maps_usgs&lt;/code&gt;) has links to individual
  396. states (like &lt;code&gt;usgs_ma&lt;/code&gt;.) These then have "this just in" links (like
  397. &lt;code&gt;usgs_drg_ma_41070_e8&lt;/code&gt;) which are detail pages, with text metadata, xml
  398. metadata, &lt;code&gt;tfw&lt;/code&gt; files (georeferences) and the actual tif files.&lt;/p&gt;
  399. &lt;ul&gt;
  400. &lt;li&gt;the project &lt;a href="http://libremap.org/"&gt;http://libremap.org/&lt;/a&gt;
  401. &lt;/li&gt;
  402. &lt;li&gt;the published collection page &lt;a href="http://www.archive.org/details/maps_usgs"&gt;http://www.archive.org/details/maps_usgs&lt;/a&gt;
  403. &lt;/li&gt;
  404. &lt;li&gt;MA &lt;a href="http://www.archive.org/details/usgs_ma"&gt;http://www.archive.org/details/usgs_ma&lt;/a&gt;
  405. &lt;/li&gt;
  406. &lt;li&gt;selected MA map &lt;a href="http://www.archive.org/details/usgs_drg_ma_41070_e8"&gt;http://www.archive.org/details/usgs_drg_ma_41070_e8&lt;/a&gt;
  407. &lt;/li&gt;
  408. &lt;/ul&gt;
  409. &lt;p&gt;It may be more useful to use a collection search, and walk the "next"
  410. links, once we have the list of collection names.&lt;/p&gt;
  411. &lt;ul&gt;
  412. &lt;li&gt;&lt;a href="http://www.archive.org/search.php?query=collection%3A%22usgs_ma%22"&gt;http://www.archive.org/search.php?query=collection%3A%22usgs_ma%22&lt;/a&gt;&lt;/li&gt;
  413. &lt;li&gt;&lt;a href="http://www.archive.org/search.php?query=collection%3A%22maps_usgs%22"&gt;http://www.archive.org/search.php?query=collection%3A%22maps_usgs%22&lt;/a&gt;&lt;/li&gt;
  414. &lt;/ul&gt;
  415.  
  416. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/usgs/readme_1206005580.html</guid><pubDate>Thu, 20 Mar 2008 09:33:00 GMT</pubDate></item><item><title>toys: Tue Feb 26 01:20:00 2008</title><description>&lt;p&gt;&lt;a href="t9.py"&gt;t9.py&lt;/a&gt; is an exploration of words with ambiguous T9 (phone
  417. text interface) encodings.  The interesting bit is the scaling
  418. issue... or lack of one: it handled a 230K wordlist, producing 10k
  419. result sets, in about 30 seconds... on an EEEpc.  Completely naive
  420. implementation, no optimization (and thus no &lt;em&gt;wasted&lt;/em&gt; optimization :-)
  421. I did use &lt;code&gt;string.maketrans&lt;/code&gt; and &lt;code&gt;string.translate&lt;/code&gt; but that
  422. was more because I'd used them before and they're actually a pretty
  423. natural fit for this task.  (I did switch from lists to sets, but that
  424. wasn't performance-related either - the wordlist I was working from
  425. had a variety of entries that weren't unique when downcased, and it
  426. didn't occur to me to just use &lt;code&gt;sort -fu&lt;/code&gt; on it.)&lt;/p&gt;
  427. &lt;p&gt;Footnotes:&lt;/p&gt;
  428. &lt;ul&gt;
  429. &lt;li&gt;T9 appears to be a trademark of Nuance Communications, Inc. &lt;a href="http://www.t9.com"&gt;http://www.t9.com&lt;/a&gt;
  430. &lt;/li&gt;
  431. &lt;li&gt;The specific EEEpc tested is a 900mhz celeron M with 1G of useful RAM.&lt;/li&gt;
  432. &lt;/ul&gt;
  433.  
  434. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/toys/readme_1204024800.html</guid><pubDate>Tue, 26 Feb 2008 11:20:00 GMT</pubDate></item><item><title>hm: Sun Feb 24 20:46:00 2008</title><description>&lt;p&gt;Minor fixes to &lt;a href="todo.py"&gt;todo.py&lt;/a&gt; today;&lt;/p&gt;
  435. &lt;ul&gt;
  436. &lt;li&gt;broken return-value handling in &lt;code&gt;but_first&lt;/code&gt;
  437. &lt;/li&gt;
  438. &lt;li&gt;
  439. &lt;code&gt;list&lt;/code&gt; didn't report errors (&lt;code&gt;todo.pl&lt;/code&gt; has the same bug, patch sent upstream)&lt;/li&gt;
  440. &lt;li&gt;improved &lt;code&gt;sid&lt;/code&gt;-cookie handling&lt;/li&gt;
  441. &lt;/ul&gt;
  442. &lt;p&gt;(I'm using defer-until-task enough that I should make it an actual subcommand :-)&lt;/p&gt;
  443.  
  444. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/hm/readme_1203921960.html</guid><pubDate>Mon, 25 Feb 2008 06:46:00 GMT</pubDate></item><item><title>calendar: Tue Jan 29 02:36:00 2008</title><description>&lt;p&gt;&lt;code&gt;gcalcli.py&lt;/code&gt; might be a better answer to all of this.  See also &lt;code&gt;stfl&lt;/code&gt;.&lt;/p&gt;
  445.  
  446. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/calendar/readme_1201610160.html</guid><pubDate>Tue, 29 Jan 2008 12:36:00 GMT</pubDate></item><item><title>xscreensaver: Mon Jan 21 00:40:00 2008</title><description>&lt;p&gt;New project space for xscreensaver modules in python.  The most recent
  447. experiments have been in the area of vector text;
  448. &lt;a href="xss_vector_text.py"&gt;xss_vector_text.py&lt;/a&gt; isn't much to look at, and fairly retro,
  449. but it has a compact notation for pseudo-multi-segment characters and
  450. can draw a randomly selected word across the top of the screen.  Not
  451. exciting, just another piece (and I may replace it with real text with
  452. fonts later.)&lt;/p&gt;
  453. &lt;p&gt;One interesting note: the version of python-xlib I have has a typo, a
  454. call to &lt;code&gt;PolSegment&lt;/code&gt; instead of &lt;code&gt;PolySegment&lt;/code&gt;.  Fixed on
  455. sourceforge... back in 2003 :-) but the one in Debian didn't get
  456. updated until April 2007 (post-etch.)  If you have 0.12-5.1, read the
  457. comments in &lt;a href="xss_vector_text.py"&gt;xss_vector_text.py&lt;/a&gt; for details, or just make the
  458. obvious change.&lt;/p&gt;
  459. &lt;p&gt;Footnotes:&lt;/p&gt;
  460. &lt;ul&gt;
  461. &lt;li&gt;debian update to &lt;code&gt;python-xlib&lt;/code&gt; &lt;a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=421594"&gt;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=421594&lt;/a&gt;
  462. &lt;/li&gt;
  463. &lt;/ul&gt;
  464.  
  465. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/xscreensaver/readme_1200912000.html</guid><pubDate>Mon, 21 Jan 2008 10:40:00 GMT</pubDate></item><item><title>Mon Jan 14 22:47:00 2008</title><description>&lt;p /&gt;
  466. &lt;p&gt;The README-blog has enough content that it is starting to pick up
  467. traffic about random topics, even with only email and zephyr
  468. backchannels.  femtocomment got sidetracked into being an OpenID
  469. playground, which made sense a year ago, but looking at
  470. &lt;a href="http://openid.net/"&gt;http://openid.net/&lt;/a&gt; today, it's a lot more real, and I should start
  471. focusing on the &lt;i&gt;comment&lt;/i&gt; side of the story again.&lt;/p&gt;
  472. &lt;p&gt;(I'll probably start with something that works off of a simple
  473. hand-set cookie just to get it off the ground, but that's not
  474. inconsistent with having an OpenID interface, it's just a shortcut
  475. path.)&lt;/p&gt;
  476. &lt;h3&gt;Inputs:&lt;/h3&gt;
  477. &lt;ul&gt;&lt;li&gt; the comment itself&lt;/li&gt;&lt;li&gt; the authentication metadata&lt;/li&gt;&lt;li&gt; the context of the comment&lt;/li&gt;&lt;ul&gt;&lt;li&gt; replying to what posting&lt;/li&gt;&lt;li&gt; (later) replying to what comment&lt;/li&gt;&lt;li&gt; when&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;
  478. &lt;p /&gt;
  479. &lt;h3&gt;Outputs:&lt;/h3&gt;
  480. &lt;ul&gt;&lt;li&gt; rendering of comments (threads) on each topic page&lt;/li&gt;&lt;li&gt; global comment-review page&lt;/li&gt;&lt;ul&gt;&lt;li&gt; site-wide, for the administrator (me)&lt;/li&gt;&lt;li&gt; comment deletion&lt;/li&gt;&lt;li&gt; cookie revocation / (later) id blocking&lt;/li&gt;&lt;/ul&gt;&lt;li&gt; (later) RSS feeds for comment threads you're in&lt;/li&gt;&lt;li&gt; (later) email for comments&lt;/li&gt;&lt;/ul&gt;
  481. &lt;p /&gt;
  482. &lt;h3&gt;Constraints:&lt;/h3&gt;
  483. &lt;ul&gt;&lt;li&gt; Can't be generated offline the way the blog is&lt;/li&gt;&lt;ul&gt;&lt;li&gt; README-blog can insert a "talk to the service" bit, though&lt;/li&gt;&lt;li&gt; maybe README-blog can pull static copies of threads, so the service bit is only the freshest stuff?&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;
  484. &lt;p /&gt;
  485. &lt;p&gt;This is probably enough to start slinging bits around and see what it
  486. looks like :-)&lt;/p&gt;
  487. &lt;h3&gt;Footnotes:&lt;/h3&gt;
  488. &lt;ul&gt;&lt;li&gt; OpenID DevCamp &lt;a href="http://barcamp.org/OpenIDDevCamp"&gt;http://barcamp.org/OpenIDDevCamp&lt;/a&gt;&lt;/li&gt;&lt;li&gt; OpenID standards &lt;a href="http://openid.net"&gt;http://openid.net&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</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>&lt;p&gt;Codemonth is over, and while I didn't get as much done as I'd hoped, I
  489. did make some real progress... and while stuffing more software into
  490. the EEEpc and configuring it has been a major distraction, it just now
  491. gave something back - turns out that there &lt;em&gt;is&lt;/em&gt; a useful outline
  492. editor in debian after all, called &lt;code&gt;treeline&lt;/code&gt; (found during a
  493. mis-aimed &lt;code&gt;apt-cache search&lt;/code&gt; for "python doc".)  It's an outline
  494. editor that can make a fair guess at arbitrary XML files; it loaded
  495. meterstone's one sample file immediately - and was able to "export" it
  496. back (as "Generic" XML) to a file that meterstone could read
  497. (treeline's save format is somewhat different, though.)&lt;/p&gt;
  498. &lt;p&gt;A related search also turned up &lt;code&gt;tcm&lt;/code&gt;, the "Toolkit for Conceptual
  499. Modeling", which looks like it's trying to cover what would be the
  500. overall task breakdown part problem in more detail, without actually
  501. looking at estimation at all.  It's also a &lt;em&gt;very&lt;/em&gt; retro-looking
  502. &lt;code&gt;lesstif&lt;/code&gt; app, which apparently hasn't been touched since 2003, so
  503. I'm not sure it will actually help, but it seemed worth noting.&lt;/p&gt;
  504. &lt;p&gt;Footnotes:&lt;/p&gt;
  505. &lt;ul&gt;
  506. &lt;li&gt;codemonth &lt;a href="http://www.codemonth.org/"&gt;http://www.codemonth.org/&lt;/a&gt;
  507. &lt;/li&gt;
  508. &lt;li&gt;treeline &lt;a href="http://www.bellz.org/treeline/"&gt;http://www.bellz.org/treeline/&lt;/a&gt;
  509. &lt;/li&gt;
  510. &lt;li&gt;tcm &lt;a href="http://wwwhome.cs.utwente.nl/~tcm/"&gt;http://wwwhome.cs.utwente.nl/~tcm/&lt;/a&gt;
  511. &lt;/li&gt;
  512. &lt;/ul&gt;
  513.  
  514. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/meterstone/readme_1196687760.html</guid><pubDate>Mon, 03 Dec 2007 13:16:00 GMT</pubDate></item><item><title>krbvert: Sat Nov  3 23:55:00 2007</title><description>&lt;p&gt;I gave in and built my own &lt;code&gt;SLAB&lt;/code&gt; kernel and modules; I'm not too
  515. happy with the result (suspend works but I've had some lockups that
  516. I'm blaming the video driver for for now) but I'm going to move
  517. forward with it anyway.&lt;/p&gt;
  518. &lt;p&gt;Had a near miss with noticing that Gutsy's &lt;code&gt;ssh&lt;/code&gt; supports setting
  519. &lt;code&gt;GSSAPITrustDns=no&lt;/code&gt; but the documentation points out that this
  520. just means passing the value &lt;em&gt;to&lt;/em&gt; GSSAPI... which then goes back out
  521. to DNS to (mis)canonicalize it anyway, which misses the point, and
  522. lets me get back to work on this project :-)&lt;/p&gt;
  523. &lt;p&gt;A bunch of grinding, and discovering the need to copy the &lt;code&gt;struct
  524. addrinfo&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; the contained &lt;code&gt;ai_addr&lt;/code&gt; in the cache, and I've got a
  525. successful, if crude, tool...&lt;/p&gt;
  526. &lt;p&gt;Given &lt;code&gt;strdup&lt;/code&gt; I'm sort of surprised not to find a corresponding
  527. &lt;code&gt;memdup&lt;/code&gt;, so I put one in.  (The code would be more readable with
  528. a gnu-style &lt;code&gt;xstrdup&lt;/code&gt; and &lt;code&gt;xmemdup&lt;/code&gt; so maybe I'll add those
  529. later; for now the debugging code still gets in the way...)&lt;/p&gt;
  530. &lt;p&gt;Current state: grabs the IPv4 address that the first &lt;code&gt;getaddrinfo&lt;/code&gt;
  531. call returns, as it goes by, and saves it; when &lt;code&gt;getnameinfo&lt;/code&gt; is
  532. called with that address, stuff the originally-supplied name in the
  533. result, over the result that actually came back.&lt;/p&gt;
  534. &lt;p&gt;Future enhancements:&lt;/p&gt;
  535. &lt;ul&gt;
  536. &lt;li&gt;build a map from &lt;em&gt;all&lt;/em&gt; &lt;code&gt;getaddrinfo&lt;/code&gt; calls&lt;/li&gt;
  537. &lt;li&gt;handle IPv4 and IPv6 addresses&lt;/li&gt;
  538. &lt;li&gt;for that matter, handle all addresses that come back&lt;/li&gt;
  539. &lt;li&gt;package it for Debian&lt;/li&gt;
  540. &lt;li&gt;package it for FreeBSD (whatever that means)&lt;/li&gt;
  541. &lt;li&gt;investigate &lt;code&gt;getnameinfo&lt;/code&gt; flags more carefully&lt;/li&gt;
  542. &lt;li&gt;don't assume that &lt;code&gt;getnameinfo&lt;/code&gt; gets &lt;em&gt;any&lt;/em&gt; valid answer - if we get a match, return it directly without even calling the upstream function&lt;/li&gt;
  543. &lt;/ul&gt;
  544. &lt;p&gt;However, those can wait until I get some feedback - it now
  545. accomplishes the primary goal, which was to let me drop my
  546. hack-and-slash patches to ssh and just maintain a separate module.
  547. Think of it as "Aspect Oriented Programming... in C" :-)&lt;/p&gt;
  548. &lt;ul&gt;
  549. &lt;li&gt;Aspect Oriented Programming &lt;a href="http://aosd.net/"&gt;http://aosd.net/&lt;/a&gt;
  550. &lt;/li&gt;
  551. &lt;/ul&gt;
  552.  
  553. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/krbvert/readme_1194166500.html</guid><pubDate>Sun, 04 Nov 2007 08:55:00 GMT</pubDate></item><item><title>turbogears: Thu Sep  6 02:55:00 2007</title><description>&lt;p&gt;Another quick note - turns out we should be able to avoid the whole
  554. &lt;code&gt;IntCol&lt;/code&gt; problem with &lt;code&gt;sqlmeta.idName = "user_id"&lt;/code&gt; (and
  555. tweaking &lt;code&gt;welcome.kid&lt;/code&gt; to &lt;em&gt;display&lt;/em&gt; the username so we can get
  556. some evidence...) but that doesn't seem to change the &lt;em&gt;object&lt;/em&gt;, just
  557. the schema &lt;code&gt;user_id INTEGER PRIMARY KEY&lt;/code&gt; so it's easier to change
  558. &lt;code&gt;tgopenidlogin&lt;/code&gt; to reference user.id instead, and that seems to
  559. work fine... I can add login identifiers to pages, I can logout and
  560. login again... that's &lt;em&gt;really&lt;/em&gt; enough to get started :-)&lt;/p&gt;
  561. &lt;ul&gt;
  562. &lt;li&gt;&lt;a href="http://oturbogears.org/documentacao/tutorial/tutorial-sqlobject/manipulando-a-estrutura-do-banco"&gt;http://oturbogears.org/documentacao/tutorial/tutorial-sqlobject/manipulando-a-estrutura-do-banco&lt;/a&gt;&lt;/li&gt;
  563. &lt;/ul&gt;
  564.  
  565. </description><guid isPermaLink="true">http://www.thok.org/intranet/turbogears/readme_1189079700.html</guid><pubDate>Thu, 06 Sep 2007 11:55:00 GMT</pubDate></item><item><title>notdoneyet: Sun Aug 26 03:20:00 2007</title><description>&lt;p&gt;I worked through the tutorial, read a bit more and argued some things
  566. out with friends... and concluded that&lt;/p&gt;
  567. &lt;ul&gt;
  568. &lt;li&gt;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 :-)&lt;/li&gt;
  569. &lt;li&gt;django has a content-management-system bias - not a surprising one, but one that makes it a poor match for my development style&lt;/li&gt;
  570. &lt;li&gt;django has a related "databases matter" bias - likewise.&lt;/li&gt;
  571. &lt;/ul&gt;
  572. &lt;p&gt;I dug around a bit and discovered that TurboGears is more aligned to
  573. my perspective, and I already had a copy of the book... watched the
  574. "20 Minute Wiki screencast", and realized that it &lt;em&gt;did&lt;/em&gt; match my
  575. biases much better, so I'm going to stop beating my head against
  576. django for a while and pick up TurboGears again.&lt;/p&gt;
  577.  
  578. </description><guid isPermaLink="true">http://www.thok.org/intranet/django/notdoneyet/readme_1188130800.html</guid><pubDate>Sun, 26 Aug 2007 12:20:00 GMT</pubDate></item><item><title>django: Mon Aug 13 00:11:00 2007</title><description>&lt;p&gt;Random thought while working on this: does the model-view-controller
  579. encourage a split that, while making it practical to change parts of
  580. the system independently, makes it harder to focus on the overall user
  581. experience?  Or do you simply do them "all at once" early on and try
  582. to get the big picture right, and then &lt;em&gt;refine&lt;/em&gt; the 3 components on
  583. their own?&lt;/p&gt;
  584.  
  585. </description><guid isPermaLink="true">http://www.thok.org/intranet/django/readme_1186996260.html</guid><pubDate>Mon, 13 Aug 2007 09:11:00 GMT</pubDate></item><item><title>firefox: Tue Jul 24 01:50:00 2007</title><description>&lt;p&gt;I did try the search-through-HTML approach to strip the Conkeror
  586. link-numbers (since I have the cut&amp;amp;paste selection with contamination,
  587. and the raw HTML of the page, I can search for one to find the other.)
  588. My results were fuzzier than I liked, and refining the effort didn't
  589. really hold my attention.&lt;/p&gt;
  590. &lt;p&gt;I found something simpler:&lt;/p&gt;
  591. &lt;pre class="codehilite"&gt;&lt;code&gt;function strip_numbers_hard()
  592. {
  593.   removeExisting(document.commandDispatcher.focusedWindow.document);
  594. }&lt;/code&gt;&lt;/pre&gt;
  595.  
  596.  
  597. &lt;p&gt;If I run that before the cut&amp;amp;paste, I lose the numbered-links
  598. entirely, and the existing code should just work...&lt;/p&gt;
  599.  
  600. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/firefox/readme_1185274200.html</guid><pubDate>Tue, 24 Jul 2007 10:50:00 GMT</pubDate></item><item><title>pma430: Mon Jul  9 00:35:00 2007</title><description>&lt;p&gt;The PMA430 survived a european trip, as an image tank (at 700 pictures
  601. in one particular day, that was a good thing, though that means I
  602. &lt;em&gt;could&lt;/em&gt; have made do with a handful of cards, having the pictures in
  603. two places was comforting.)&lt;/p&gt;
  604. &lt;p&gt;As a web browser, it didn't do so well - mostly because, it turns out,
  605. that there's a lot of manufacturing variation in the quality of the
  606. connection of the antenna to the motherboard - so it makes sense to
  607. open it up and just solder it in place.  In the meantime, I only
  608. really had coverage in hotel lobbies, not in rooms... so I mostly used
  609. it to check on the outside world.  I didn't really have time to code
  610. a captioning tool, or even upload individual pictures to flickr with
  611. the browser, and ended up doing a lot of captioning back on the laptop
  612. with the copy I made before the plane ride home.&lt;/p&gt;
  613. &lt;p&gt;(Note that checking the outside world wasn't really a win, either; CNN
  614. was in the midst of a Paris Hilton droolfest, I think I'm just going
  615. to take them out of my bookmarks altogether and start reading IHT
  616. intead :-)&lt;/p&gt;
  617. &lt;p&gt;Also, now that I'm back, one of the OpenPMA developers has dug up the
  618. flash image builder tool source code - as I thought, they're simple
  619. enough to just rewrite as python scripts (using the &lt;code&gt;struct&lt;/code&gt;
  620. module) and that will help make the buildsystem more portable, as will
  621. using &lt;code&gt;genext2fs&lt;/code&gt; (looks like we might not even need fakeroot,
  622. given &lt;code&gt;genext2fs -P -U&lt;/code&gt; and all.)&lt;/p&gt;
  623. &lt;p&gt;Footnotes:&lt;/p&gt;
  624. &lt;ul&gt;
  625. &lt;li&gt;IHT (International Herald Tribune) &lt;a href="http://www.iht.com"&gt;http://www.iht.com&lt;/a&gt;
  626. &lt;/li&gt;
  627. &lt;li&gt;Probable CNN headline article that pushed me over the edge &lt;a href="http://www.cnn.com/2007/SHOWBIZ/TV/06/26/hilton.release/"&gt;http://www.cnn.com/2007/SHOWBIZ/TV/06/26/hilton.release/&lt;/a&gt;
  628. &lt;/li&gt;
  629. &lt;/ul&gt;
  630.  
  631. </description><guid isPermaLink="true">http://www.thok.org/intranet/toys/pma430/readme_1183973700.html</guid><pubDate>Mon, 09 Jul 2007 09:35:00 GMT</pubDate></item><item><title>Sun Jul  1 16:06:00 2007</title><description>&lt;p /&gt;
  632. &lt;p&gt;More experimentation in the past week leads me to believe that
  633. &lt;tt&gt;GL_POLYGON&lt;/tt&gt; and &lt;tt&gt;GL_QUAD_STRIP&lt;/tt&gt; and the like do triangular
  634. decomposition... and get it wrong, somehow, because only &lt;i&gt;some&lt;/i&gt; parts
  635. of various polygons go away with &lt;tt&gt;GL_CULL_FACE&lt;/tt&gt; but some obvious
  636. triangles remain that clearly shouldn't.  This seems to be consistent
  637. with accelerated and non-accelerated OpenGL in the server (discovered
  638. the latter when rolling back from a 2.6.22 kernel to 2.6.20, and
  639. forgetting to roll back the &lt;tt&gt;xorg-driver-fglrx&lt;/tt&gt; package.)  I'll
  640. have to try newer libraries.&lt;/p&gt;
  641. &lt;p&gt;The approach I'm taking for the moment is to simply draw a unit radius
  642. blue sphere, and then draw the continents over it; using
  643. &lt;tt&gt;GL_CULL_FACE&lt;/tt&gt; to cull polygons with backwards winding was
  644. supposed to make this do the right thing.&lt;/p&gt;
  645. &lt;p&gt;An alternate approach is suggested by some of the "NeHe" tutorial/demo
  646. programs - create a texture out of the polygons, and then map it on to
  647. the sphere.  This should make the rotation and other navigation
  648. stunningly fast, but departs rather a lot from the original program's
  649. concept...&lt;/p&gt;
  650. &lt;h3&gt;Footnotes:&lt;/h3&gt;
  651. &lt;ul&gt;&lt;li&gt; NeHe tutorials &lt;a href="http://nehe.gamedev.net"&gt;http://nehe.gamedev.net&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description><guid isPermaLink="true">http://www.thok.org/intranet/python/globe/README.html#Sun_Jul__1_16:06:00_2007</guid><pubDate>Sun, 01 Jul 2007 20:06:00 GMT</pubDate></item><item><title>Thu Jun 21 22:04:00 2007</title><description>&lt;p /&gt;
  652. &lt;p&gt;Found a better vcard parser, in &lt;tt&gt;pycocumalib/vcard.py&lt;/tt&gt; - PyCoCuMa
  653. (Pythonic Contact and Customer Management) is a somewhat dated-looking
  654. (Tk and XML-RPC based) pure-vcf contact manager.  Produced a simple
  655. &lt;tt&gt;vcard_to_pma.py&lt;/tt&gt; script that does a "good" match... fills in a
  656. &lt;tt&gt;&amp;lt;Contact&amp;gt;&lt;/tt&gt; with the obvious mapping from vcard fields.  Not
  657. attempting to sync, this is a one-way translation, and doesn't yet
  658. flag data that gets lost; AddressBook has a fair number of fields that
  659. aren't reflected in RFC 2426, like Profession, Spouse, and
  660. Pronunciation fields; likewise vcard has TZ, GEO, LOGO, and X-&lt;i&gt;
  661. extension fields that aren't mapped.  The next version of this should
  662. probably report any "leftover" data that doesn't get sent over, but I
  663. think this is a good start.&lt;/i&gt;&lt;/p&gt;
  664. &lt;h3&gt;Footnotes:&lt;/h3&gt;
  665. &lt;ul&gt;&lt;li&gt; PyCoCuMa upstream &lt;a href="http://www.srcco.de/pycocuma/index.html"&gt;http://www.srcco.de/pycocuma/index.html&lt;/a&gt; 0.4.5-6 (2005-09-13 23:25 CET) is the latest upstream&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.thok.org/intranet/python/contacts/vcard_to_pma.py"&gt;vcard_to_pma.py&lt;/a&gt;&lt;/li&gt;&lt;li&gt; RFC 2426 &lt;a href="http://www.ietf.org/rfc/rfc2426.txt"&gt;http://www.ietf.org/rfc/rfc2426.txt&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description><guid isPermaLink="true">http://www.thok.org/intranet/python/contacts/README.html#Thu_Jun_21_22:04:00_2007</guid><pubDate>Fri, 22 Jun 2007 02:04:00 GMT</pubDate></item><item><title>distributed-photography: Thu Apr 26 21:11:00 2007</title><description>&lt;p&gt;So many people have digital cameras, pretty much everywhere... but
  666. there's no infrastructure to &lt;em&gt;harness&lt;/em&gt; that.  Flickr Maps
  667. &lt;a href="http://www.flickr.com/map/"&gt;http://www.flickr.com/map/&lt;/a&gt; can be used to find &lt;em&gt;pictures&lt;/em&gt; in many
  668. places, but only those that have already been taken &lt;em&gt;and&lt;/em&gt; geolocated
  669. (often manually.)  (Flickr claims 15 million geolocated pictures, out
  670. of around 450 million.)&lt;/p&gt;
  671. &lt;p&gt;That gives us a standard set of Web 2.0 ingredients:&lt;/p&gt;
  672. &lt;ul&gt;
  673. &lt;li&gt;geography/locality&lt;/li&gt;
  674. &lt;li&gt;social/community&lt;/li&gt;
  675. &lt;li&gt;photos&lt;/li&gt;
  676. &lt;li&gt;realtime&lt;/li&gt;
  677. &lt;li&gt;subvert mainstream media&lt;/li&gt;
  678. &lt;li&gt;user developed content&lt;/li&gt;
  679. &lt;li&gt;mashup&lt;/li&gt;
  680. &lt;/ul&gt;
  681.  
  682. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/distributed-photography/readme_1177654260.html</guid><pubDate>Fri, 27 Apr 2007 06:11:00 GMT</pubDate></item><item><title>distractme: Sun Apr 15 13:01:00 2007</title><description>&lt;p&gt;I did a little more hacking here - a simple python script to figure
  683. out what's the top window and log it, using &lt;code&gt;subprocess.Popen&lt;/code&gt; to
  684. call &lt;code&gt;xwininfo&lt;/code&gt; and &lt;code&gt;xprop&lt;/code&gt;.&lt;/p&gt;
  685. &lt;p&gt;This turned up some interesting tidbits:&lt;/p&gt;
  686. &lt;ul&gt;
  687. &lt;li&gt;
  688. &lt;code&gt;xterm&lt;/code&gt; already has &lt;code&gt;WM_NAME&lt;/code&gt; set via an old &lt;code&gt;$PS1&lt;/code&gt; setting&lt;/li&gt;
  689. &lt;li&gt;
  690. &lt;code&gt;emacs&lt;/code&gt; only puts the buffer in the title for multiple frames; &lt;code&gt;(setq frame-title-format "%b")&lt;/code&gt; fixes this.&lt;/li&gt;
  691. &lt;li&gt;
  692. &lt;code&gt;firefox&lt;/code&gt; (using the &lt;code&gt;conkeror&lt;/code&gt; 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 &lt;code&gt;document.title = document.commandDispatcher.focusedWindow.location.href;&lt;/code&gt; statements.&lt;/li&gt;
  693. &lt;/ul&gt;
  694. &lt;p&gt;Since I was having some reliability issues with figuring out the "top
  695. window", I tried using &lt;code&gt;ratpoison -c 'windows %s%i'&lt;/code&gt; but something
  696. about running that 3 times/second (or possibly about using c-c to
  697. interrupt it) crashed ratpoison (1.4.0-beta4 ubuntu) which I'll try
  698. and diagnose later.&lt;/p&gt;
  699. &lt;p&gt;In the meantime, a discussion about some of my old perl code (the fact
  700. that I still set my X desktop with code that uses my pure-perl Xlib
  701. implementation,
  702. &lt;a href="http://www.foo.be/docs/tpj/issues/vol2_1/tpj0201-0010.html"&gt;http://www.foo.be/docs/tpj/issues/vol2_1/tpj0201-0010.html&lt;/a&gt; was pointed
  703. out as one of the last chunks of perl in my life, since my
  704. "conversion" to python) inspired me to look at &lt;code&gt;python-xlib&lt;/code&gt; again.
  705. Turns out that &lt;code&gt;python-xlib&lt;/code&gt; has a nicely rich interface (windows
  706. as objects with methods, rather than a thin mapping to the C bindings,
  707. while still being appropriately close to the wire.) &lt;code&gt;python-xlib&lt;/code&gt;
  708. gave me a number of advantages:&lt;/p&gt;
  709. &lt;ul&gt;
  710. &lt;li&gt;X errors (due to the transient nature of these particular windows) turn into &lt;code&gt;Xlib.error.BadWindow&lt;/code&gt; exceptions, which I can handle cleanly&lt;/li&gt;
  711. &lt;li&gt;it takes less code to ask for the particular property via &lt;code&gt;topwin.get_wm_name()&lt;/code&gt; than to parse them out of &lt;code&gt;xprop&lt;/code&gt; output&lt;/li&gt;
  712. &lt;li&gt;once I lost the extra baggage of parsing code, it was easier to see simpler ways to look at the overall structure&lt;/li&gt;
  713. &lt;li&gt;using the interactive python interpreter to poke at window state directly made it much easier to decide that &lt;code&gt;child.get_attributes().override_redirect&lt;/code&gt; was worth checking (turns out that were override-redirect windows which were higher on the list, but still not the "real" top window.)&lt;/li&gt;
  714. &lt;/ul&gt;
  715. &lt;p&gt;The current version &lt;a href="on_top.py"&gt;on_top.py&lt;/a&gt; still has a little debugging
  716. info, and only covers the &lt;em&gt;logging&lt;/em&gt; and data-gathering parts of the
  717. effort.  It doesn't cover actually mapping this information to what
  718. project I'm actually working on; I want to start out by collecting
  719. evidence, and after a few days of that will come back and figure out
  720. how to analyze it.&lt;/p&gt;
  721.  
  722. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/distractme/readme_1176674460.html</guid><pubDate>Sun, 15 Apr 2007 22:01:00 GMT</pubDate></item><item><title>effort: Sun Feb 25 20:50:00 2007</title><description>&lt;p&gt;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...)&lt;/p&gt;
  723. &lt;p&gt;Anyway, linux (well, unix) scanner support (using SANE) has been pretty good in general - doesn't typically handle the &lt;em&gt;cheapest&lt;/em&gt; 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.&lt;/p&gt;
  724. &lt;p&gt;I finally did a little more digging... actually plugged it in to an Ubuntu Edgy box, got the vendor and product ids (&lt;code&gt;vendor:0x4c5 product:0x10f2&lt;/code&gt;), and found references to &lt;em&gt;related&lt;/em&gt; models, but not this one.&lt;/p&gt;
  725. &lt;p&gt;To make a long story short:&lt;/p&gt;
  726. &lt;ul&gt;
  727. &lt;li&gt;the Mac model of the ScanSnap is different from the Windows one in three ways:&lt;ul&gt;
  728. &lt;li&gt;it is white&lt;/li&gt;
  729. &lt;li&gt;it is called the FI-5110EOX&lt;em&gt;M&lt;/em&gt; and not the FI-5110EOX&lt;/li&gt;
  730. &lt;li&gt;it has a distinct USB product id.&lt;/li&gt;
  731. &lt;/ul&gt;
  732. &lt;/li&gt;
  733. &lt;li&gt;it isn't different in any &lt;em&gt;other&lt;/em&gt; way...&lt;/li&gt;
  734. &lt;li&gt;adding &lt;code&gt;usb 0x04c5 0x10f2&lt;/code&gt; to the end of &lt;code&gt;/etc/sane.d/usb/fujitsu.conf&lt;/code&gt; got sane to recognize it&lt;/li&gt;
  735. &lt;li&gt;using &lt;code&gt;scanadf --device fujitsu:libusb:001:004 --source "ADF Duplex" --mode Color -v&lt;/code&gt; scanned both sides of the page I put into the scanner.&lt;/li&gt;
  736. &lt;/ul&gt;
  737. &lt;p&gt;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.)&lt;/p&gt;
  738.  
  739. </description><guid isPermaLink="true">http://www.thok.org/intranet/effort/readme_1172472600.html</guid><pubDate>Mon, 26 Feb 2007 06:50:00 GMT</pubDate></item><item><title>Thu Feb 22 21:28:00 2007</title><description>&lt;p /&gt;
  740. &lt;p&gt;Another random item.&lt;/p&gt;
  741. &lt;p&gt;&lt;tt&gt;*&lt;/tt&gt; should be just a star...&lt;/p&gt;</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>&lt;p&gt;Still running multihomed, clearly need to do at least some tests in a
  742. channel-specific manner.  The easy thing to start with is &lt;code&gt;probe_ping&lt;/code&gt;,
  743. since it has a &lt;code&gt;-S&lt;/code&gt; option for source address, which should do the right
  744. thing when combined with our iprules.  However, since this is testing
  745. the interface, not the remote resource, it isn't an option to
  746. &lt;code&gt;probe_ping&lt;/code&gt;, but a new &lt;code&gt;probe_interface&lt;/code&gt; or something like that.&lt;/p&gt;
  747. &lt;p&gt;Later versions should probably do similar tests with TCP.&lt;/p&gt;
  748.  
  749. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/nagaina/notes_1171023540.html</guid><pubDate>Fri, 09 Feb 2007 12:19:00 GMT</pubDate></item><item><title>irobot-create: Wed Jan 24 21:41:00 2007</title><description>&lt;p&gt;Turns out that all of the tools one uses to talk to the iRobot Create
  750. are already in ubuntu... &lt;code&gt;avrdude&lt;/code&gt;, &lt;code&gt;gcc-avr&lt;/code&gt;, etc.&lt;/p&gt;
  751. &lt;p&gt;Planned projects:&lt;/p&gt;
  752. &lt;ul&gt;
  753. &lt;li&gt;floor mapper&lt;/li&gt;
  754. &lt;li&gt;802.11 signal strength mapper&lt;/li&gt;
  755. &lt;li&gt;oqo chariot :-)&lt;/li&gt;
  756. &lt;/ul&gt;
  757. &lt;p&gt;First steps, though:&lt;/p&gt;
  758. &lt;ul&gt;
  759. &lt;li&gt;unpack CMexamples.zip, cd drive&lt;/li&gt;
  760. &lt;li&gt;add &lt;code&gt;#include &amp;lt;avr/signal.h&amp;gt;&lt;/code&gt; to &lt;code&gt;drive.c&lt;/code&gt;
  761. &lt;/li&gt;
  762. &lt;li&gt;use &lt;code&gt;"make DEBUG=stabs"&lt;/code&gt; becaues the ubuntu &lt;code&gt;avr-gcc&lt;/code&gt; doesn't support dwarf-2&lt;/li&gt;
  763. &lt;li&gt;plug in the cable&lt;/li&gt;
  764. &lt;li&gt;slide the controller switch to "on"&lt;ul&gt;
  765. &lt;li&gt;&lt;code&gt;"drivers/usb/serial/ftdi_sio.c: v1.4.3:USB FTDI Serial Converters Driver"&lt;/code&gt;&lt;/li&gt;
  766. &lt;/ul&gt;
  767. &lt;/li&gt;
  768. &lt;li&gt;
  769. &lt;code&gt;avrdude -p ATMega168 -P /dev/ttyUSB3 -c stk500 -U flash:w:drive.hex&lt;/code&gt;&lt;ul&gt;
  770. &lt;li&gt;&lt;code&gt;avrdude: AVR Part "ATMega168" not found.&lt;/code&gt;&lt;/li&gt;
  771. &lt;li&gt;ubuntu has 5.0, upstream is 5.3&lt;/li&gt;
  772. &lt;li&gt;
  773. &lt;a href="http://cvs.savannah.nongnu.org/viewcvs/avrdude/avrdude.conf.in?rev=1.118&amp;amp;root=avrdude&amp;amp;view=log"&gt;http://cvs.savannah.nongnu.org/viewcvs/avrdude/avrdude.conf.in?rev=1.118&amp;amp;root=avrdude&amp;amp;view=log&lt;/a&gt; shows that it was added in patch &lt;code&gt;#5100&lt;/code&gt;
  774. &lt;/li&gt;
  775. &lt;li&gt;added part stanza and partno define, comment out "signature" line, other new lines&lt;/li&gt;
  776. &lt;/ul&gt;
  777. &lt;/li&gt;
  778. &lt;/ul&gt;
  779. &lt;p&gt;Actual download:&lt;/p&gt;
  780. &lt;pre class="codehilite"&gt;&lt;code&gt;kurohyou$ avrdude -p ATMega168 -P /dev/ttyUSB3 -c stk500 -U flash:w:drive.hex
  781.  
  782. avrdude: AVR device initialized and ready to accept instructions
  783.  
  784. Reading | ################################################## | 100% 0.05s
  785.  
  786. avrdude: Device signature = 0x1e9406
  787. avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
  788.         To disable this feature, specify the -D option.
  789. avrdude: erasing chip
  790. avrdude: reading input file "drive.hex"
  791. avrdude: input file drive.hex auto detected as Intel Hex
  792. avrdude: writing flash (2382 bytes):
  793.  
  794. Writing | ################################################## | 100% 0.91s
  795.  
  796. avrdude: 2382 bytes of flash written
  797. avrdude: verifying flash memory against drive.hex:
  798. avrdude: load data flash data from input file drive.hex:
  799. avrdude: input file drive.hex auto detected as Intel Hex
  800. avrdude: input file drive.hex contains 2382 bytes
  801. avrdude: reading on-chip flash data:
  802.  
  803. Reading | ################################################## | 100% 0.81s
  804.  
  805. avrdude: verifying ...
  806. avrdude: 2382 bytes of flash verified
  807.  
  808. avrdude: safemode: Fuses OK
  809.  
  810. avrdude done.  Thank you.&lt;/code&gt;&lt;/pre&gt;
  811.  
  812.  
  813. &lt;p&gt;After running the stock program, I made simple changes to "wander drunkenly":&lt;/p&gt;
  814. &lt;pre class="codehilite"&gt;&lt;code&gt;int8_t weaving = 1;
  815. uint8_t weave_ticks = 0;&lt;/code&gt;&lt;/pre&gt;
  816.  
  817.  
  818. &lt;p&gt;and&lt;/p&gt;
  819. &lt;pre class="codehilite"&gt;&lt;code&gt;// wander drunkenly
  820. drive(100, weaving * 250);
  821. // how do we count time?
  822. weave_ticks += 1;
  823. if (weave_ticks &amp;gt; 30) {
  824.  weaving *= -1;    /* flip direction */
  825.  weave_ticks = 0;
  826. }&lt;/code&gt;&lt;/pre&gt;
  827.  
  828.  
  829. &lt;p&gt;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 &lt;em&gt;minutes&lt;/em&gt; to notice that the first version of this I ran, the robot was drifting to one side... because I'd made &lt;em&gt;weaving&lt;/em&gt; a &lt;code&gt;uint8_t&lt;/code&gt;, ie. left it unsigned, so the flip didn't do what was expected.&lt;/p&gt;
  830. &lt;p&gt;That's a reasonable "hello world" for this hardware :-)&lt;/p&gt;
  831.  
  832. </description><guid isPermaLink="true">http://www.thok.org/intranet/robots/irobot-create/readme_1169710860.html</guid><pubDate>Thu, 25 Jan 2007 07:41:00 GMT</pubDate></item><item><title>mmmpy: Sat Dec 30 22:39:00 2006</title><description>&lt;p&gt;One followup: A mostly unsuccessful search on (palmos "c++" stl)
  833. turned up some old articles comparing Symbian and PalmOS, and a new
  834. article on USTL - &lt;a href="http://ustl.sourceforge.net/"&gt;http://ustl.sourceforge.net/&lt;/a&gt; - a much less memory
  835. intensive STL (subset) replacement.  So if I do have to go down the
  836. porting path, that's something that might help.&lt;/p&gt;
  837.  
  838. </description><guid isPermaLink="true">http://www.thok.org/intranet/pilot/mmmpy/readme_1167554340.html</guid><pubDate>Sun, 31 Dec 2006 08:39:00 GMT</pubDate></item><item><title>robot-factory: Wed Dec 27 00:38:00 2006</title><description>&lt;p&gt;Today's thought is that "power" is a problem underlying all of these.
  839. I don't think of it as a distinct class of problem - it's also one
  840. that other people are taking care of :-) Existing drivers for energy
  841. storage technology include&lt;/p&gt;
  842. &lt;ul&gt;
  843. &lt;li&gt;cell phones&lt;/li&gt;
  844. &lt;li&gt;cordless power tools&lt;ul&gt;
  845. &lt;li&gt;this includes A123 batteries, but also butane "fuel cells"&lt;/li&gt;
  846. &lt;/ul&gt;
  847. &lt;/li&gt;
  848. &lt;li&gt;laptops&lt;/li&gt;
  849. &lt;/ul&gt;
  850. &lt;p&gt;(Electric cars seem to be &lt;em&gt;following&lt;/em&gt; the battery curve as driven by
  851. laptops, not influencing it directly.)&lt;/p&gt;
  852. &lt;p&gt;In a practical sense, power is dear up to the point where you have
  853. "enough", at which point &lt;em&gt;more&lt;/em&gt; power has limited value.  Devices that
  854. can charge themselves (or be charged by other things) only need to do
  855. short-term power management, if any.&lt;/p&gt;
  856.  
  857. </description><guid isPermaLink="true">http://www.thok.org/intranet/robot-factory/readme_1167215880.html</guid><pubDate>Wed, 27 Dec 2006 10:38:00 GMT</pubDate></item><item><title>bluetooth: Sun Dec 17 19:23:00 2006</title><description>&lt;p&gt;Inspired by &lt;a href="http://www.librarything.com/"&gt;http://www.librarything.com/&lt;/a&gt; I dug out the Flic Cordless
  858. bluetooth scanner again.  I have notes from a coworker who borrowed it
  859. and figured out how to talk to it; there's a registration-required SDK
  860. that I will probably grab if I have any trouble (I thought I had a
  861. copy already, but I haven't found it.)&lt;/p&gt;
  862. &lt;pre class="codehilite"&gt;&lt;code&gt;sudo rfcomm connect hci0 "00:A0:96:04:D2:B2" 1 &amp;amp;
  863. screen /dev/rfcomm0
  864. it sends:
  865. 79013400800202FD
  866. sent 02fd^f
  867. 09736154967502FE
  868. send 02fe^f
  869. got 3-tone downwards sequence (for "done"...)
  870.  
  871. W&amp;lt;RET&amp;gt;
  872. Microvision&amp;#174; Flic&amp;#174; Barcode Scanner, ID: 4117271B, FW: 2.8.0, BT: 1.20M
  873. W0000000000000000590000004117271BFFFF020800
  874. T1&amp;lt;RET&amp;gt; just beeps
  875. T9&amp;lt;RET&amp;gt; low-beeps&lt;/code&gt;&lt;/pre&gt;
  876.  
  877. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/bluetooth/readme_1166419380.html</guid><pubDate>Mon, 18 Dec 2006 05:23:00 GMT</pubDate></item><item><title>bookstuff: Thu Dec 14 01:06:00 2006</title><description>&lt;p&gt;Tried uploading Delicious Library's xml file directly to library
  878. thing.  Seems like it was a little too aggressive in that I got 900+
  879. books, many of which I clearly don't own; I think it doesn't know
  880. about the recommendations field.  But that's what &lt;code&gt;cElementTree&lt;/code&gt; is for...&lt;/p&gt;
  881. &lt;p&gt;Ah, much better: "LibraryThing found 161 unique ISBNs. 138 of them are
  882. new (not already in your library)." (I entered a small pile of books
  883. by looking around the room, and then clicking through suggestions and
  884. authors and going "oh, I have that one" :-)&lt;/p&gt;
  885. &lt;p&gt;&lt;a href="delicious_asin.py"&gt;delicious_asin.py&lt;/a&gt; is the (entirely trivial) extractor.&lt;/p&gt;
  886.  
  887. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/bookstuff/readme_1166094360.html</guid><pubDate>Thu, 14 Dec 2006 11:06:00 GMT</pubDate></item><item><title>todont: Wed Nov 22 01:41:00 2006</title><description>&lt;p&gt;Requirements, probably conflicting:&lt;/p&gt;
  888. &lt;ul&gt;
  889. &lt;li&gt;fast UI&lt;ul&gt;
  890. &lt;li&gt;ie. faster than the hiveminder web ui; probably faster than &lt;em&gt;any&lt;/em&gt; web UI, start with curses and emacs&lt;/li&gt;
  891. &lt;/ul&gt;
  892. &lt;/li&gt;
  893. &lt;li&gt;widely accessible UI&lt;ul&gt;
  894. &lt;li&gt;for me that means it needs a palm app&lt;/li&gt;
  895. &lt;li&gt;and probably a web app even if it is slow&lt;/li&gt;
  896. &lt;/ul&gt;
  897. &lt;/li&gt;
  898. &lt;li&gt;rich UI&lt;ul&gt;
  899. &lt;li&gt;while "review" and "only current doable" are useful pages, I clearly also need&lt;/li&gt;
  900. &lt;li&gt;show everything&lt;/li&gt;
  901. &lt;li&gt;show tree of dependencies (somehow, but especially in the form "what can I do to unsnarl the most")&lt;/li&gt;
  902. &lt;li&gt;What should I do next is quite reasonably based more on what it unlocks, not just what I can see&lt;/li&gt;
  903. &lt;li&gt;effort vs. payoff&lt;/li&gt;
  904. &lt;/ul&gt;
  905. &lt;/li&gt;
  906. &lt;li&gt;dependencies&lt;ul&gt;
  907. &lt;li&gt;and-then/but-first are a good simplification&lt;/li&gt;
  908. &lt;li&gt;at the same time, it needs to be easy to &lt;em&gt;find&lt;/em&gt; existing tasks to attach&lt;/li&gt;
  909. &lt;li&gt;"any of" or "choose among" is another path&lt;/li&gt;
  910. &lt;/ul&gt;
  911. &lt;/li&gt;
  912. &lt;li&gt;time/size recognition&lt;ul&gt;
  913. &lt;li&gt;sometimes I really am looking for "what's a 1/2 hour task I can do now"&lt;/li&gt;
  914. &lt;li&gt;making estimates &lt;em&gt;and recording the results later&lt;/em&gt; is good training&lt;/li&gt;
  915. &lt;li&gt;picking highest payoff tasks is sometimes the right strategy&lt;/li&gt;
  916. &lt;/ul&gt;
  917. &lt;/li&gt;
  918. &lt;/ul&gt;
  919. &lt;p&gt;That's certainly enough; it may be too much to do up front, but it's a
  920. description of the show-off point at least.&lt;/p&gt;
  921.  
  922. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/todont/readme_1164195660.html</guid><pubDate>Wed, 22 Nov 2006 11:41:00 GMT</pubDate></item><item><title>zephyr: Thu Nov 16 03:07:00 2006</title><description>&lt;p&gt;After ignoring the zephyr code for a while (the logger has Just Worked
  923. for rather a while, barring network outages, and it restarts well
  924. enough after those) I took another look at &lt;code&gt;ctypes&lt;/code&gt;.  One key difference
  925. is that pyrex imports the &lt;em&gt;abstract&lt;/em&gt; (as much as C ever is) structure
  926. definitions... so you can define fields by name based on what's
  927. visible and part of the API... because under the covers it is
  928. compiling against the header files; with &lt;code&gt;ctypes&lt;/code&gt;, you have to duplicate
  929. the &lt;em&gt;physical&lt;/em&gt; C structure, because it isn't compiling at all, just
  930. building up the same thing in memory.&lt;/p&gt;
  931. &lt;p&gt;Given that, it still only took 95 lines of code to cook up the notice
  932. type, initialize one, and send it (unauthenticated).  I still need to
  933. wrap it up in a more &lt;em&gt;useful&lt;/em&gt; interface, but this convinces me that it
  934. works for a library like this... next step is authentication, and then
  935. maybe gssapi...&lt;/p&gt;
  936.  
  937. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/zephyr/readme_1163682420.html</guid><pubDate>Thu, 16 Nov 2006 13:07:00 GMT</pubDate></item><item><title>openafs: Wed Nov  1 01:53:00 2006</title><description>&lt;p&gt;Wrapup:&lt;/p&gt;
  938. &lt;p&gt;These were an interesting exercise - but it turned out that my
  939. appetite for disk space was, after all, satiable; all of the volumes
  940. have been moved to a single Dell PE830 with mirrored 500G SATA drives.
  941. At this time the database servers still need moving, but the clever
  942. volume management issue no longer matters at this scale.&lt;/p&gt;
  943. &lt;p&gt;(The desktop minitowers are trailing-edge enough that it may be
  944. harmful to donate them; the martian box is now a wireless print server
  945. running Ubuntu Edgy Eft, and the HushPC is now a dvd-only MythTV
  946. box... so both still have life due to their specialized nature, namely
  947. "quiet enough (and small enough) to share space with humans in a
  948. civilized manner".)&lt;/p&gt;
  949.  
  950. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/openafs/readme_1162381980.html</guid><pubDate>Wed, 01 Nov 2006 11:53:00 GMT</pubDate></item><item><title>backup: Tue Oct 17 16:27:00 2006</title><description>&lt;p&gt;Hmm.  The commandline (exclusion) args should probably get stashed in
  951. &lt;code&gt;.backup_metadata&lt;/code&gt;.  For now put them here:&lt;/p&gt;
  952. &lt;pre class="codehilite"&gt;&lt;code&gt;time ./splitbackups.py  --path /home/eichin --prep --exclude tmp --exclude metacarta --exclude acid --exclude bigdig --exclude .svk --exclude PIX --exclude .kde/share/apps/akregator/Archive --exclude .mozilla/firefox/x2mkyrlv.default/Cache --exclude .snownews/cache&lt;/code&gt;&lt;/pre&gt;
  953.  
  954.  
  955. &lt;p&gt;&lt;code&gt;akgregator&lt;/code&gt; and &lt;code&gt;snownews&lt;/code&gt; are excluded because of Joliet issues.
  956. &lt;code&gt;firefox&lt;/code&gt; is excluded because it's running and expiring live.&lt;/p&gt;
  957.  
  958. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/backup/readme_1161134820.html</guid><pubDate>Wed, 18 Oct 2006 01:27:00 GMT</pubDate></item><item><title>vnc: Thu Oct 12 04:39:00 2006</title><description>&lt;p&gt;While looking for a Mac OS X VNC Server (to remote-sysadmin a Eudora
  959. problem that seemed impervious to ssh) I stumbled across "eggplant
  960. purple", a visually oriented, rather polished, GUI test harness based
  961. on VNC (so, while a Mac product, it can test pretty much anything.)
  962. The primary takeaway from the video demo was that GUI testing could be
  963. broken down into two simple abstractions:&lt;/p&gt;
  964. &lt;ul&gt;
  965. &lt;li&gt;find things to push&lt;/li&gt;
  966. &lt;li&gt;script how to push them&lt;/li&gt;
  967. &lt;/ul&gt;
  968. &lt;p&gt;They had a nice script-building GUI for this; basically a pass-through
  969. overlay on a VNC client where you could simply run the app under test
  970. (or even start with a blank desktop and &lt;em&gt;find&lt;/em&gt; it), making you break
  971. down "just click on that icon" into "trace the icon, optionally adjust
  972. the hotspot, click" which then became a saved TIFF off the icon, and a
  973. line of script "click name-of-tiff".&lt;/p&gt;
  974. &lt;p&gt;This made simple things look simple, and you could also see how to do
  975. more complex stuff from there.  An interesting bit that took a while
  976. to sink in was that failures automatically saved a screen shot of the
  977. last thing attempted - so it could be used to set up scripted
  978. screenshot generation simply as a side effect of tests with impossible
  979. end conditions. &lt;/p&gt;
  980.  
  981. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/vnc/readme_1160660340.html</guid><pubDate>Thu, 12 Oct 2006 13:39:00 GMT</pubDate></item><item><title>boston-massacre: Mon Jan  9 17:37:00 2006</title><description>&lt;p&gt;A friend suggested a scheme that he uses to more effectively identify
  982. and contain spam sourced mail; some searching/riffing on his name lead
  983. me to
  984. &lt;a href="http://www.law.umkc.edu/faculty/projects/ftrials/bostonmassacre/keyfigures.html"&gt;http://www.law.umkc.edu/faculty/projects/ftrials/bostonmassacre/keyfigures.html&lt;/a&gt;
  985. and thus the name of this project.&lt;/p&gt;
  986. &lt;p&gt;Basic concept: mechanically generate reply addresses.  When spam
  987. starts arriving by one, drop it.&lt;/p&gt;
  988. &lt;p&gt;Uses:&lt;/p&gt;
  989. &lt;ul&gt;
  990. &lt;li&gt;
  991. &lt;p&gt;personal mail: people mostly reply anyway, so that works; or they can
  992.    add one particular one to their address book, and as long as they
  993.    don't end up getting leaked, they keep working.&lt;/p&gt;
  994. &lt;/li&gt;
  995. &lt;li&gt;
  996. &lt;p&gt;list mail: doesn't work for mailman, membership-post-only addresses,
  997.    without some further kludging.  Perhaps always post from a bucket
  998.    address or a list-specific address in those cases.&lt;/p&gt;
  999. &lt;/li&gt;
  1000. &lt;li&gt;
  1001. &lt;p&gt;strangers: they come in via a generic address, and maybe don't get
  1002.    in.&lt;/p&gt;
  1003. &lt;/li&gt;
  1004. &lt;li&gt;
  1005. &lt;p&gt;existing correspondants: hunt them down and get them to update.&lt;/p&gt;
  1006. &lt;/li&gt;
  1007. &lt;/ul&gt;
  1008.  
  1009. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/boston-massacre/readme_1136864220.html</guid><pubDate>Tue, 10 Jan 2006 03:37:00 GMT</pubDate></item><item><title>sheetwork: Thu Dec 29 00:29:00 2005</title><description>&lt;dl&gt;
  1010. &lt;dt&gt;sheetwork&lt;/dt&gt;
  1011. &lt;dd&gt;A term used in edition binding for the binding operations
  1012. of folding, tipping, gathering, endsheeting, sewing, and smashing.
  1013. -- &lt;a href="http://palimpsest.stanford.edu/don/dt/dt3078.html"&gt;http://palimpsest.stanford.edu/don/dt/dt3078.html&lt;/a&gt;
  1014. &lt;/dd&gt;
  1015. &lt;/dl&gt;
  1016. &lt;p&gt;sheetwork is a tool for producing web pages.  Not an entire blog, but
  1017. a single page article, possibly for inclusion in an outer framework
  1018. which is a blog or album structure.  A page, an article, a journal
  1019. day....  Not, perhaps, a good match for the term.&lt;/p&gt;
  1020. &lt;ul&gt;
  1021. &lt;li&gt;needs to work well with emacs&lt;/li&gt;
  1022. &lt;li&gt;
  1023. &lt;code&gt;bzero&lt;/code&gt; provides some possible inspirations...&lt;/li&gt;
  1024. &lt;li&gt;an external tool for adding notation for objects, like images&lt;/li&gt;
  1025. &lt;li&gt;commandline cooking tools (like tex, too)&lt;/li&gt;
  1026. &lt;li&gt;scribe's &lt;code&gt;@documentstyle&lt;/code&gt; was a good idea&lt;/li&gt;
  1027. &lt;li&gt;nroff's command notation isn't bad for commands, but is bad for flow
  1028.   in text&lt;/li&gt;
  1029. &lt;li&gt;we've already got lots of wiki stuff, why not use it?&lt;/li&gt;
  1030. &lt;li&gt;"kid" is cool, if we end up with anything template-like&lt;/li&gt;
  1031. &lt;li&gt;rfc822 isn't bad as a low-end representation, at least for leading
  1032.   metadata, but doesn't handle body stuff&lt;/li&gt;
  1033. &lt;li&gt;must end up with an emacs mode, but not be doomed without it&lt;/li&gt;
  1034. &lt;/ul&gt;
  1035.  
  1036. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/sheetwork/readme_1135852140.html</guid><pubDate>Thu, 29 Dec 2005 10:29:00 GMT</pubDate></item><item><title>deli: Mon Dec 12 00:41:00 2005</title><description>&lt;p&gt;&lt;a href="http://delicious-py.berlios.de/"&gt;http://delicious-py.berlios.de/&lt;/a&gt;
  1037. needs a new maintainer... but might be a better thing to leverage&lt;/p&gt;
  1038.  
  1039. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/deli/readme_1134384060.html</guid><pubDate>Mon, 12 Dec 2005 10:41:00 GMT</pubDate></item><item><title>rss: Sun Nov 27 01:02:00 2005</title><description>&lt;p&gt;I need a better reader than snownews, more text-oriented (and
  1040. linux-friendly) than nnw.  (Though images in messages were nice; it
  1041. might suffice to use w3m as a renderer and hack w3m img...)&lt;/p&gt;
  1042.  
  1043. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/rss/readme_1133089320.html</guid><pubDate>Sun, 27 Nov 2005 11:02:00 GMT</pubDate></item><item><title>comics: Sun Nov 27 00:16:00 2005</title><description>&lt;p&gt;Most recently, switched to conkeror+firefox, and now hit c-c c-n in
  1044. the web browser to get the next comic.  The same queue is fed by a
  1045. one-liner in &lt;code&gt;~/.snownews/browser&lt;/code&gt;:&lt;/p&gt;
  1046. &lt;pre class="codehilite"&gt;&lt;code&gt;curl -Hurl:\ %s -d "" &amp;lt;http://localhost:3383/push_url&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  1047.  
  1048.  
  1049. &lt;p&gt;so urls from that are queued up the same way (see ../firefox.)&lt;/p&gt;
  1050. &lt;p&gt;Still should do some kind of auto-training; the simplest algorithm is
  1051. to fetch the whole page, then fetch it small-T (an hour? 5m?) later,
  1052. and see what changed, and ignore it.  Keep a record (vector?) of the
  1053. whittling, and use that instead of &lt;code&gt;check_maybe&lt;/code&gt;.  Possibly pick a
  1054. threshold of change and display it to me - and let me vote on same
  1055. vs. different...&lt;/p&gt;
  1056.  
  1057. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/comics/readme_1133086560.html</guid><pubDate>Sun, 27 Nov 2005 10:16:00 GMT</pubDate></item><item><title>todo-prodder: Wed Nov  3 03:08:00 2004</title><description>&lt;p&gt;higher level stuff&lt;/p&gt;
  1058. &lt;pre class="codehilite"&gt;&lt;code&gt;- produce list of whole-items, with date + subitems
  1059. - filter out [done]s or at least identify them&lt;/code&gt;&lt;/pre&gt;
  1060.  
  1061. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/todo-prodder/readme_1099487280.html</guid><pubDate>Wed, 03 Nov 2004 13:08:00 GMT</pubDate></item><item><title>topicmaster: Sat Sep 11 03:03:00 2004</title><description>&lt;p&gt;Another one - "virtual topic" of "all stufflogs mentioning chocolate
  1062. or cocoa in the clip itself"&lt;/p&gt;
  1063. &lt;p&gt;Then a metaproject of "chocolate printing"&lt;/p&gt;
  1064.  
  1065. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/topicmaster/readme_1094904180.html</guid><pubDate>Sat, 11 Sep 2004 12:03:00 GMT</pubDate></item><item><title>filthy-assistant: Wed Jun 30 00:00:00 2004</title><description>&lt;p&gt;I need to get back to the collection-of-interest-topics model, so that
  1066. short lived things like "getting passport" get pulled in, bigger
  1067. things like "accepted advertiser mail" do too...&lt;/p&gt;
  1068.  
  1069. </description><guid isPermaLink="true">http://www.thok.org/intranet/python/filthy-assistant/readme_1088589600.html</guid><pubDate>Wed, 30 Jun 2004 10:00:00 GMT</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:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. 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

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda