<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9099477617526256046</id><updated>2011-07-31T02:30:21.323-04:00</updated><category term='meta'/><category term='memories'/><category term='py2exe'/><category term='python'/><category term='hr'/><category term='concensus'/><category term='scope'/><category term='death'/><category term='python applescript automator DEVONthink'/><category term='hiringfail'/><category term='plea'/><category term='promise'/><category term='mercurial'/><category term='stuffing'/><category term='yeahright'/><category term='firstpost'/><category term='life'/><title type='text'>silent platform</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.jdwcornell.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.jdwcornell.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>jdwcornell</name><uri>http://www.blogger.com/profile/04647305480082428727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_OMnPQG2faJ4/SybZJJzLqOI/AAAAAAAABk4/-igZ0skHr-s/S220/jason.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9099477617526256046.post-514407847134335400</id><published>2009-12-29T19:54:00.009-05:00</published><updated>2009-12-30T12:24:48.181-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python applescript automator DEVONthink'/><title type='text'>webloc shortcuts into DEVONthink Web Archives - python + automator + applescript</title><content type='html'>&lt;span style="font-size:100%;"&gt;Recently I've been moving forward with my year-or-so long quest to organize my thoughts, readings and writings, and their associated notes, in a searchable format suitable for aiding me in deciding the order in which I should attack my ideas, and suitable for presenting me with relevant entries as I work through the execution of my ideas.  To store and retrieve my documents I've decided to give DEVONthink a shot.  A lot of searching, and a little bit of evaluating, went into this decision.  I'm not 100% sold that it will meet my needs, but seems fit in with them pretty nicely.  More on that another time, if I get around to it.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The Problem&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;In the past year I've accumulated 500 or so URL shortcuts on my Mac OS X desktop (more precisely, files with the extension .webloc that contain URLs in their resource forks).  These were created by me dragging bookmark-like strings from Safari or Firefox to the desktop, ostensibly for future consideration and collation.  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, I have a collection of 500 files, each of which contains a URL, and I want each of those to become individual Web Archive entries in DEVONthink.  This is versus its other record types that could be appropriate (PDF, URL, others).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;A Solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;DEVONthink has no mass import feature that solves this problem exactly.  Fortunately, and this is one of its outstanding features, DEVONthink is scriptable through AppleScript.  In fact, there is a context-sensitive script "Add web document to DEVONthink" which appears in the menu bar's Scripts menu when Safari or Firefox are in the foreground.  The contents of this script (~/Library/Scripts/Applications/Firefox/Add web document to DEVONthink.scpt) reveal how to send a URL, title and refering URL to DEVONthink for it to create a new record of the Web Archive type.&lt;br /&gt;&lt;br /&gt;I then googled how to get the URL stored in a .webloc file as a string.  I'm a Python programmer, and wanted to see how to do it in python and not AppleScript, so I ended up at &lt;a href="http://toxicsoftware.com/webloc-to-pinboard/"&gt;http://toxicsoftware.com/webloc-to-pinboard/&lt;/a&gt;.  The function infoForWebloc() does the trick.&lt;br /&gt;&lt;br /&gt;I hadn't used Automator before so instead of tying together the AppleScript and Python directly I decided to make this my first foray into Automator.  I created a Folder Action on a new folder (~/Desktop/url2devonthink/) with two actions:  Run Shell Script and Run AppleScript.&lt;br /&gt;&lt;br /&gt;The Shell Script portion executes a Python program to extract the URL and retrieve a suitable Title.&lt;br /&gt;&lt;br /&gt;Shell: /bin/bash&lt;br /&gt;Pass input: as arguments&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: bash"&gt;&lt;![CDATA[&lt;br /&gt;for f in "$@"&lt;br /&gt;do&lt;br /&gt;  /Users/jdw5/bin/webloc2url.py "$f"&lt;br /&gt;done&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Contents of ~/bin/webloc2url.py is as follows.  I've removed some optimizations for clarity and brevity:&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: python"&gt;&lt;![CDATA[&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;&lt;br /&gt;import Foundation&lt;br /&gt;from Carbon import File, Files, Res&lt;br /&gt;import sys&lt;br /&gt;from mechanize import Browser&lt;br /&gt;&lt;br /&gt;def infoForWebloc(inPath):&lt;br /&gt;  """convert a path to the WebLoc stored that file.  from http://toxicsoftware.com/webloc-to-pinboard/"""&lt;br /&gt;  theDisplayName = Foundation.NSFileManager.defaultManager().displayNameAtPath_(inPath)&lt;br /&gt;  resNum = Res.FSOpenResourceFile(inPath, File.FSGetResourceForkName(), Files.fsRdPerm)&lt;br /&gt;  Res.UseResFile(resNum)&lt;br /&gt;  theResource = Res.Get1Resource('url ', 256)&lt;br /&gt;  theURLFromResource = theResource.data&lt;br /&gt;  Res.CloseResFile(resNum)&lt;br /&gt;  theData = Foundation.NSData.dataWithContentsOfFile_(inPath)&lt;br /&gt;  thePropertyList =&lt;br /&gt;  Foundation.NSPropertyListSerialization.propertyListWithData_options_format_error_(theData,&lt;br /&gt;    0, None, None)&lt;br /&gt;  theURLFromData = thePropertyList['URL']&lt;br /&gt;  return theDisplayName, theURLFromResource&lt;br /&gt;&lt;br /&gt;def getTitle(url):&lt;br /&gt;  br = Browser()&lt;br /&gt;  br.open(url)&lt;br /&gt;  return br.title()&lt;br /&gt;&lt;br /&gt;for fn in sys.argv[1:]:&lt;br /&gt;  (displayname, url) = infoForWebloc(fn)&lt;br /&gt;  title = getTitle(url)&lt;br /&gt;  print url + "|||" + (title or 'Unknown Title')&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The AppleScript passes that on to DEVONthink for Web Archive creation.  Note that I cut-and-pasted most of this from ~/Library/Scripts/Applications/Firefox/Add web document to DEVONthink.scpt.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush:applescript"&gt;&lt;![CDATA[&lt;br /&gt;on run {input, parameters}&lt;br /&gt;tell application "DEVONthink Pro"&lt;br /&gt;  repeat with fn in input&lt;br /&gt;      try&lt;br /&gt;          set AppleScript's text item delimiters to "|||"&lt;br /&gt;          set this_URL to item 1 of text items of fn&lt;br /&gt;          set this_title to item 2 of text items of fn&lt;br /&gt;          set AppleScript's text item delimiters to ""&lt;br /&gt;   &lt;br /&gt;          set this_referrer to missing value&lt;br /&gt;   &lt;br /&gt;          tell application id "com.devon-technologies.thinkpro2" to create web document from this_URL&lt;br /&gt;             referrer this_referrer name this_title&lt;br /&gt;      on error error_message number error_number&lt;br /&gt;          display alert "DEVONagent" message error_message as warning&lt;br /&gt;      end try&lt;br /&gt;  end repeat&lt;br /&gt;end tell&lt;br /&gt;end run]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some caveats apply:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The above was almost certainly not the most optimal way of accomplishing the goal&lt;/li&gt;&lt;li&gt;The triple-pipe Cheap Hack (tm) was my lame workaround to not wanting to see how multiple arguments are passed between stages in Automator's pipes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The actual process was iterative and error-prone.  Some URLs had become bad, some I didn't want to include, and so on.&lt;/li&gt;&lt;li&gt;Since this was a one-time task I have no need to create a more structured and reliable program than the above.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Now all I have to do is catalog all those new entries!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9099477617526256046-514407847134335400?l=blog.jdwcornell.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jdwcornell.com/feeds/514407847134335400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9099477617526256046&amp;postID=514407847134335400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/514407847134335400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/514407847134335400'/><link rel='alternate' type='text/html' href='http://blog.jdwcornell.com/2009/12/webloc-shortcuts-into-devonthink-web.html' title='webloc shortcuts into DEVONthink Web Archives - python + automator + applescript'/><author><name>jdwcornell</name><uri>http://www.blogger.com/profile/04647305480082428727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_OMnPQG2faJ4/SybZJJzLqOI/AAAAAAAABk4/-igZ0skHr-s/S220/jason.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9099477617526256046.post-2922097356773369322</id><published>2009-12-14T19:34:00.004-05:00</published><updated>2009-12-14T20:16:35.944-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='meta'/><title type='text'>Why write essays?  Why write essays concisely?  Why write well-reasoned essays concisely?</title><content type='html'>I've been thinking a lot about writing recently.  Specifically, I've been considering:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What are my intrinsic motivators for wanting to write more?  How about extrinsic?&lt;/li&gt;&lt;li&gt;What's the extrinsic ROI?  Intrinsic?&lt;/li&gt;&lt;li&gt;Do I have the willpower to ignore something with a poor extrinsic ROI and a good intrinsic one?  Should I ignore it, even if I do have the willpower?&lt;/li&gt;&lt;li&gt;What about short and long term implications of the near-term decision I must make regarding spending more time on writing?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Of secondary concern to me are the topics of my writing, the format, the audiences and my writing's relevance.  These are by no means unimportant.  Indeed, they inform the answers to the questions I mention above, but they have not been the primary variables under consideration.&lt;br /&gt;&lt;br /&gt;This morning I spent about 15 minutes and wrote a thousand or so words in a stream-of-consciousness format. I wrote about topics I wanted to write about related to my position at Cornell.  I've been finding recently that I've been having a specific kind of communication problem with my staff.  That is, with some members, it has become obvious to me that I'm assuming too much preexisting knowledge, or that I've been assuming that I've communicated that knowledge in the past.  It is clear that I haven't, or didn't, communicate well.&lt;br /&gt;&lt;br /&gt;Therefore, I'd like to start building up a library of essays on various topics related to what I do professionally.  I'd like to use that exercise to both understand how to communicate my desires more effectively, and to provide a set of documents for future reference.&lt;br /&gt;&lt;br /&gt;This got me to wondering: is a collection of short essays more valuable in this context than a collection of detailed compositions with reasoned arguments and citations?  Academia has historically eschewed the blog entry as a medium for developing and delivering reasoned arguments, in favor of the well cited scholarly article.  The writing I'm considering is not scholarly, but perhaps the motivations behind requiring arguments to be well considered and cited still apply?  Is there room for scholarly-style writing in the realm of short essays on such mundane topics as "Why We Check In Our Code Periodically"?&lt;br /&gt;&lt;br /&gt;I have several thoughts, but in the spirit of short essays without well reasoned, substantiated arguments and conclusions, I figure I should publish this entry before I add any of them!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9099477617526256046-2922097356773369322?l=blog.jdwcornell.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jdwcornell.com/feeds/2922097356773369322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9099477617526256046&amp;postID=2922097356773369322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/2922097356773369322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/2922097356773369322'/><link rel='alternate' type='text/html' href='http://blog.jdwcornell.com/2009/12/why-write-essays-why-write-essays.html' title='Why write essays?  Why write essays concisely?  Why write well-reasoned essays concisely?'/><author><name>jdwcornell</name><uri>http://www.blogger.com/profile/04647305480082428727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_OMnPQG2faJ4/SybZJJzLqOI/AAAAAAAABk4/-igZ0skHr-s/S220/jason.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9099477617526256046.post-2517878361873935389</id><published>2009-08-02T17:11:00.005-04:00</published><updated>2009-08-02T22:20:13.467-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='py2exe'/><title type='text'>Patching Mercurial and TortoiseHG for CUWebAuth</title><content type='html'>&lt;div&gt;For a few months now I've been using a modified version of &lt;a href="http://mercurial.selenic.com/wiki/"&gt;Mercurial&lt;/a&gt; (hg) to push/pull/clone repositories protected with &lt;a href="https://confluence.cornell.edu/display/CUWAL/CUWebAuth+2.0"&gt;Cornell's CUWebAuth&lt;/a&gt;.  CUWebAuth is a single sign-on system implemented with Kerberos 5 which is primarily used to allow non-Kerberos-aware web browsers to use a trusted site (something like a web front end for kinit) to generate Kerberos credentials and store them in a cookie.  The upshot of this arrangement is that an end user's credentials (username and password) aren't passed to the service needing the identifying information, but instead are only sent to the trusted server.  The trusted server sends back Kerberos credentials to the browser, which sends them to the service needing the identification.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Ideally, I'd generate Kerberos credentials in python at the client (hg/tortoisehg), but I don't yet have the code in place to do that.  What I &lt;i&gt;did&lt;/i&gt; build was a urllib2 RedirectHandler which observes the CUWebAuth2 HTTP redirect, prompts the user for their username and password, sends these to the trusted server, acquires the Kerberos credentials and then replays the original HTTP request.  A combination of Python features allowed this to be done relatively simply.  Its simple, consistent module and namespacing system and the fact that it is interpreted allowed me to replace a function in one of hg's core libraries at runtime:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;br /&gt;import mercurial.url&lt;br /&gt;def opener(ui, authinfo=None):&lt;br /&gt;   ....&lt;br /&gt;   handlers.extend((urllib2.HTTPBasicAuthHandler(passmgr),&lt;br /&gt;      mercurial.url.httpdigestauthhandler(passmgr),&lt;br /&gt;      cornell.auth.CUWA.CUWARedirectHandler(passmgr, cookiejar)))&lt;br /&gt;   opener = urllib2.build_opener(*handlers)&lt;br /&gt;   ....&lt;br /&gt;   return opener&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;It works even though it isn't the ideal solution (that being generating credentials locally).  Cornell folks can get a copy of this library, and the prebuilt executable &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cuhg&lt;/span&gt; which you use in place of &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;hg&lt;/span&gt;, from &lt;a href="http://code.cals.cornell.edu/"&gt;http://code.cals.cornell.edu&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;One problem with this solution is that not all of my team members use the command line version of Mercurial.  Some use &lt;a href="http://bitbucket.org/tortoisehg/stable/wiki/Home"&gt;TortoiseHG&lt;/a&gt; on Windows.  Before I could deploy CUWebAuth protected Mercurial HTTP repositories for my group I needed my CUWebAuth patch to work with their client.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I spent about 10 hours over the past few months getting the TortoiseHG installer to build in one of my Windows VMs.  It has a lot of dependencies (Free downloads), but is documented reasonably well with only a few rough edges.  Most of that time was spent really getting to understand each step of the build process including &lt;a href="http://www.pygtk.org/"&gt;PyGTK&lt;/a&gt;, &lt;a href="http://www.jrsoftware.org/isinfo.php"&gt;Inno Setup&lt;/a&gt;, &lt;a href="http://www.py2exe.org/"&gt;py2exe&lt;/a&gt; and several other tools.  In the end I was able to build a version of the installer for TortoiseHG 0.8.1 with Mercurial 1.3.1 which functioned properly on a fresh Windows install.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;But, it turns out I didn't need to go through all that hassle!  The GUI components of TortoiseHG interact with Mercurial by behaving as if one were executing hg commands at the command line.  As part of the build process py2exe compiles .pyc files of all the project's dependent libraries (including Mercurial itself) into a zip file called Library.zip.  Adding Library.zip/mercurial/CUWA.pyc and updating Library.zip/mercurial/url.pyc with my modified opener() function was all it took to get my CUWebAuth redirect handler injected into TortoiseHG's HTTP client library!&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I'm reminded of the old tale of the engineer and the factory.  There's this factory which produces special boxes for packing delicate scientific equipment.  Every hour the manufacturing line is not running the company loses thousands of dollars.  They have staff on-site for dealing with day-to-day cleaning, lubricating and other maintenance tasks, but when something really goes wrong they have to call up the company that built the machine for support.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;So one day, after the regular maintenance has been performed for that day, the machine wouldn't start up again.  The foreman is stressing over how much money they're losing by not being able to operate so he calls the manufacturer to send over an engineer.  The engineer inspects the line, then walks over to a maintenance panel.  She opens it and turns an adjustment screw a quarter turn.  The line starts back up and everything is back to normal.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;A few weeks later the foreman gets a bill for $10,000.  Furious, he calls up the engineer and asks why it cost $10,000 for a half hour of her time.  He demands an itemized bill.  A few weeks later the itemized bill arrives.  It has two line items on it: &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;br /&gt;.5 hour labor: $150&lt;br /&gt;knowing where to put the screwdriver and turn: $9,850&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The point is that sometimes knowing exactly where to turn the screwdriver can be valuable both in terms of time saved and money spent.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9099477617526256046-2517878361873935389?l=blog.jdwcornell.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jdwcornell.com/feeds/2517878361873935389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9099477617526256046&amp;postID=2517878361873935389' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/2517878361873935389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/2517878361873935389'/><link rel='alternate' type='text/html' href='http://blog.jdwcornell.com/2009/08/patching-mercurial-and-tortoisehg-for.html' title='Patching Mercurial and TortoiseHG for CUWebAuth'/><author><name>jdwcornell</name><uri>http://www.blogger.com/profile/04647305480082428727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_OMnPQG2faJ4/SybZJJzLqOI/AAAAAAAABk4/-igZ0skHr-s/S220/jason.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9099477617526256046.post-4802017643419058488</id><published>2009-03-16T22:39:00.000-04:00</published><updated>2009-03-16T22:39:08.724-04:00</updated><title type='text'>What am I doing wrong?</title><content type='html'>So I got an auxiliary audio input installed in my car the other day.  Excellent.  I don't have to deal with the FM transceiver for the satellite radio or the iPhone anymore.  They sound awful, and when I travel to populated areas I have to hunt around the crowded FM dial for weak stations I can override.&lt;br /&gt;&lt;br /&gt;All I needed was a 1-2 meter (trying out the metric system here) cable with 1/8" (d'oh, failed already) &lt;a href="http://en.wikipedia.org/wiki/TRS_connector"&gt;TRS connector&lt;/a&gt;, a.k.a. "headphone plug"on both ends.  We don't have too many options in Ithaca for procurement of such a cable.  I made a valiant effort to "buy local": I asked one friend.  She said Gallagher's.  Unfortunately they went out of business years ago.&lt;br /&gt;&lt;br /&gt;So, Best Buy, Radio Shack, Target or WalMart.  I chose Target because I had to buy deoderant as well, and I don't have a high regard for Radio Shack brand deoderant.&lt;br /&gt;&lt;br /&gt;I expected to pay around $5-$10 for this item.  I walked into the electronics section of the store and immediately turned right into the first aisle.  It had iPod accessories.  I figured "hey, I'm connecting an iPhone, I bet this is where they'll keep the cable."  Among the various incarnations of iPod-specific adaptors I found what I was looking for.  Unfortunately, it was a Monster brand "iPod to Aux Input" 6 foot cable, with &lt;a href="http://www.youtube.com/watch?v=WRVzF9dBl7c"&gt;gold plating&lt;/a&gt; priced at $20.&lt;br /&gt;&lt;br /&gt;No way!  Directly above that they had a slot for another brand name "iPod to Aux Input" cable, priced at $14.99, but it was out of stock.  Hmmm... still too much.  I can do better.  I turn around and see the MP3 player section.&lt;br /&gt;&lt;br /&gt;Same $14.99 cable.  This time labeled "MP3 player to Aux Input" cable.  They had plenty of them.  So now it's a game.  What happens when I go find the portable CD player section?  Does it get cheaper?&lt;br /&gt;&lt;br /&gt;You bet!  Same brand again, same cable, now $9.99, just labeled "Portable CD player to Aux Input".  Now it is in my price range but I'm convinced I can &lt;span style="font-style: italic;"&gt;still&lt;/span&gt; do better at this same store.&lt;br /&gt;&lt;br /&gt;I go down the next aisle and find the generic Target brand cable section.  They have all sorts of audio cables.  RCA connectors.  Cable TV connectors.  HDMI.  Just about everything.  And there's the headphone jack cable.  In a box that, essentially, says "connects Stuff to Other Stuff".&lt;br /&gt;&lt;br /&gt;$3.69, including gold plating.&lt;br /&gt;&lt;br /&gt;People are MAKING MONEY on people who DON'T KNOW WHAT THEY'RE DOING.  Target is pulling off &lt;a href="http://en.wikipedia.org/wiki/Price_discrimination"&gt;price discrimination&lt;/a&gt; on four things that do the same thing within 3 meters of one another!  I'm in the wrong line of work!&lt;br /&gt;&lt;br /&gt;And now you understand this post's title.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9099477617526256046-4802017643419058488?l=blog.jdwcornell.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jdwcornell.com/feeds/4802017643419058488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9099477617526256046&amp;postID=4802017643419058488' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/4802017643419058488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/4802017643419058488'/><link rel='alternate' type='text/html' href='http://blog.jdwcornell.com/2009/03/what-am-i-doing-wrong.html' title='What am I doing wrong?'/><author><name>jdwcornell</name><uri>http://www.blogger.com/profile/04647305480082428727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_OMnPQG2faJ4/SybZJJzLqOI/AAAAAAAABk4/-igZ0skHr-s/S220/jason.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9099477617526256046.post-8990368496658065469</id><published>2009-03-16T21:51:00.001-04:00</published><updated>2009-03-16T22:09:30.890-04:00</updated><title type='text'>A Passive Infrared Motion Sensor Repeater/Extension?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_OMnPQG2faJ4/Sb79NWPpfEI/AAAAAAAAAUU/1ThHd8nHnOA/s1600-h/DSCN0447.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 230px; height: 171px;" src="http://3.bp.blogspot.com/_OMnPQG2faJ4/Sb79NWPpfEI/AAAAAAAAAUU/1ThHd8nHnOA/s320/DSCN0447.JPG" alt="" id="BLOGGER_PHOTO_ID_5313963016095104066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The light switch for my office appears to be a &lt;a href="http://greengate.coopercontrol.com/common/brands.cfm?pg=Detail&amp;amp;id=15154"&gt;SuperSwitch 2&lt;/a&gt; passive infrared light switch which, according to the site, is&lt;br /&gt;&lt;blockquote&gt;a motion sensing lighting control and conventional wall switch all-in-one&lt;/blockquote&gt;Great!  I don't have to turn it on, and it turns off when I leave.  What could be wrong with that? Nothing, I say!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OMnPQG2faJ4/Sb7_xw-dLqI/AAAAAAAAAUc/aEpa5srZvNw/s1600-h/DSCN0445.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 230px; height: 172px;" src="http://1.bp.blogspot.com/_OMnPQG2faJ4/Sb7_xw-dLqI/AAAAAAAAAUc/aEpa5srZvNw/s320/DSCN0445.JPG" alt="" id="BLOGGER_PHOTO_ID_5313965840769298082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;But wait.  Where did it get installed you ask?  Is it behind the door?&lt;br /&gt;&lt;br /&gt;D'oh!  Yes, that's where it got installed.&lt;br /&gt;&lt;br /&gt;FAIL.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If I leave the door completely open it can't detect my presence, and the light goes off after a bit. If I close the door people won't feel comfortable coming in. If I leave it halfway open (so the sensor can "see" me) visitors will invariably open it the rest of the way.&lt;br /&gt;&lt;br /&gt;So, the question is, how to work around this?  Relocation of the switch assembly is out of the question for a number of reason.&lt;br /&gt;&lt;br /&gt;I can think of several options, some of which are "hard" and some of which are "dumb":&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hack the sensor by removing the actual sensor from the switch assembly and running wires to where it could actually see me.&lt;/li&gt;&lt;li&gt;Rig up some kind of secondary sensor attached to a heat source that can simulate body heat and movement that can be placed within the sight lines of the room's real sensor.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Cut a sizable hole in the door.&lt;/li&gt;&lt;li&gt;Deal with it.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I'd rather not do a, c or d. If you know of something that will do b, with the door completely open, and without annoying me (like a random incandescent strobe of sorts), I would be somewhat indebted to you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9099477617526256046-8990368496658065469?l=blog.jdwcornell.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jdwcornell.com/feeds/8990368496658065469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9099477617526256046&amp;postID=8990368496658065469' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/8990368496658065469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/8990368496658065469'/><link rel='alternate' type='text/html' href='http://blog.jdwcornell.com/2009/03/passive-infrared-motion-sensor.html' title='A Passive Infrared Motion Sensor Repeater/Extension?'/><author><name>jdwcornell</name><uri>http://www.blogger.com/profile/04647305480082428727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_OMnPQG2faJ4/SybZJJzLqOI/AAAAAAAABk4/-igZ0skHr-s/S220/jason.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_OMnPQG2faJ4/Sb79NWPpfEI/AAAAAAAAAUU/1ThHd8nHnOA/s72-c/DSCN0447.JPG' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9099477617526256046.post-3773617786275775005</id><published>2009-02-23T11:23:00.003-05:00</published><updated>2009-02-23T11:39:26.150-05:00</updated><title type='text'>now named blog - silent platform</title><content type='html'>On my way back from Boston and the &lt;a href="http://doteduguru.com/id2306-pictures-from-first-hetweetup.html"&gt;#HEtweetup&lt;/a&gt; I was listening to some Rage Against the Machine.  The &lt;a href="http://www.google.com/search?hl=en&amp;amp;safe=off&amp;amp;client=firefox-a&amp;amp;rls=org.mozilla%3Aen-US%3Aofficial&amp;amp;hs=Qtd&amp;amp;q=rage+against+silent+platform+lyrics&amp;amp;btnG=Search"&gt;lyrics&lt;/a&gt; to the song included the phrase "silent platform".&lt;br /&gt;&lt;br /&gt;While the socio-economic-political issues in which I am interested aren't quite the same same as those covered in Township Rebellion, I'd still like to think that understanding their reality is critical to the long-term viability of academia and higher education, and that I can use this blog to publicly (Creative Commons-licensed) refine those thoughts, silently.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9099477617526256046-3773617786275775005?l=blog.jdwcornell.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jdwcornell.com/feeds/3773617786275775005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9099477617526256046&amp;postID=3773617786275775005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/3773617786275775005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/3773617786275775005'/><link rel='alternate' type='text/html' href='http://blog.jdwcornell.com/2009/02/now-named-blog-silent-platform.html' title='now named blog - silent platform'/><author><name>jdwcornell</name><uri>http://www.blogger.com/profile/04647305480082428727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_OMnPQG2faJ4/SybZJJzLqOI/AAAAAAAABk4/-igZ0skHr-s/S220/jason.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9099477617526256046.post-6438817797478273399</id><published>2008-11-23T18:21:00.004-05:00</published><updated>2008-11-23T18:46:58.360-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stuffing'/><category scheme='http://www.blogger.com/atom/ns#' term='death'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><category scheme='http://www.blogger.com/atom/ns#' term='memories'/><title type='text'>Thanksgiving won't be the same this year</title><content type='html'>For most of my life my mother's mother hosted Thanksgiving supper for their three children and their families.  I was at them all until I moved to California in 1998, though I returned for a few after that.  She stopped hosting them a few years ago due to declining health.  I've joined her for several Thanksgivings since, either out or at another relative's home.&lt;br /&gt;&lt;br /&gt;Well, I think I need to be more accurate.  I was at &lt;span style="font-style: italic;"&gt;almost&lt;/span&gt; all of them.  I missed my first (in 1975) because I was in the hospital that day, having been born that morning.&lt;br /&gt;&lt;br /&gt;Even when I wasn't there I could taste the special stuffing she would make, or the kielbasa she would serve on occasion.  In fact, I can taste it right now even though I'm eating a chicken dish baked with potatoes, garlic and peas, which tastes nothing like home-made turkey stuffing complete with sausage bits.&lt;br /&gt;&lt;br /&gt;This year, and every year from now on, I will still have those memories.  But, she will only be joining me in spirit.  She passed away early this morning in her sleep.  She had been in declining health for several years with heart problems, but had been doing well recently.  The news came as a surprise to me and others.  Some good news is that she passed in her sleep at home, and not in a hospital bed.&lt;br /&gt;&lt;br /&gt;Goodbye Grandmom, you will be missed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9099477617526256046-6438817797478273399?l=blog.jdwcornell.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jdwcornell.com/feeds/6438817797478273399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9099477617526256046&amp;postID=6438817797478273399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/6438817797478273399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/6438817797478273399'/><link rel='alternate' type='text/html' href='http://blog.jdwcornell.com/2008/11/thanksgiving-wont-be-same-this-year.html' title='Thanksgiving won&apos;t be the same this year'/><author><name>jdwcornell</name><uri>http://www.blogger.com/profile/04647305480082428727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_OMnPQG2faJ4/SybZJJzLqOI/AAAAAAAABk4/-igZ0skHr-s/S220/jason.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9099477617526256046.post-3743619880206716021</id><published>2008-11-19T21:52:00.007-05:00</published><updated>2008-11-19T22:46:39.984-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concensus'/><category scheme='http://www.blogger.com/atom/ns#' term='hiringfail'/><category scheme='http://www.blogger.com/atom/ns#' term='hr'/><title type='text'>On the other side</title><content type='html'>Today I was on the other side of the interview table for the first time in eight years, this time with a lot more experience under my belt.  The last time I did this I focused on the hard skills (programming) and ignored the soft skills.  Epic FAIL.&lt;br /&gt;&lt;br /&gt;I'm hiring what Cornell calls a Programmer/Analyst III.  This person will be helping my team (the Administrative Computing group) build software to meet the business needs of the College.  I'm seeking a person with web frontend skills (think: proficiency in XHTML, CSS, JavaScript) who as an eye for design (but is not a designer) and who has a computer science foundation.&lt;br /&gt;&lt;br /&gt;This time around I arranged for four sets of interviewers, each with a 45 minute time slot:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The Team (peers in my group)&lt;/li&gt;&lt;li&gt;The Constituents (reps from each of the groups my team primarily supports)&lt;/li&gt;&lt;li&gt;The Primary Constituents (the College's Communications organization.  This is a "web" position)&lt;/li&gt;&lt;li&gt;Smart People (a few bright well-connected people who don't fall into the above categories who take the candidate out to lunch)&lt;/li&gt;&lt;/ul&gt;These were second round interviews.  The candidates passed technical interviews, such as they are in my environment, over the previous few weeks.  The goal of these second round interviews was to receive input, but &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; to necessarily generate consensus, on the following points:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Demeanor.  Can you see yourself enjoying your professional interactions with the candidate?&lt;/li&gt;&lt;li&gt;Communication.  Does this person communicate topics of a technical nature in language you can understand?&lt;/li&gt;&lt;li&gt;Stewardship.  Do you believe they will hold your interests and the College's interests in mind when making decisions?&lt;/li&gt;&lt;li&gt;Overall Feel.  Does it seem like this candidate will fit in well here? &lt;/li&gt;&lt;/ul&gt;At the end of the day I felt as exhausted as the candidate seemed to feel.  Feedback is pending, but I got a positive response from the few interviewers with whom I talked later in the day.&lt;br /&gt;&lt;br /&gt;I have the second candidate running the same gauntlet tomorrow, and then I have the weekend to spend stewing over my decision after getting feedback tomorrow and Friday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9099477617526256046-3743619880206716021?l=blog.jdwcornell.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jdwcornell.com/feeds/3743619880206716021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9099477617526256046&amp;postID=3743619880206716021' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/3743619880206716021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/3743619880206716021'/><link rel='alternate' type='text/html' href='http://blog.jdwcornell.com/2008/11/on-other-side.html' title='On the other side'/><author><name>jdwcornell</name><uri>http://www.blogger.com/profile/04647305480082428727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_OMnPQG2faJ4/SybZJJzLqOI/AAAAAAAABk4/-igZ0skHr-s/S220/jason.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9099477617526256046.post-670323424009589800</id><published>2008-11-17T21:22:00.000-05:00</published><updated>2008-11-17T21:34:56.176-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plea'/><category scheme='http://www.blogger.com/atom/ns#' term='yeahright'/><category scheme='http://www.blogger.com/atom/ns#' term='scope'/><category scheme='http://www.blogger.com/atom/ns#' term='firstpost'/><category scheme='http://www.blogger.com/atom/ns#' term='promise'/><title type='text'>Yeah, About 10 years too late, huh?</title><content type='html'>This will prove to be my first really honest truly official public blog post.  Why didn't I bother before?  Probably had something to do with thinking that no one else cared about what I'd write, or that there was nothing new under the sun.&lt;br /&gt;&lt;br /&gt;Well, maybe so.  But I'm going to do it anyway.  At least one post a week.  I promise.  Yes, one &lt;span style="font-style: italic;"&gt;earth&lt;/span&gt; week.&lt;br /&gt;&lt;br /&gt;I suppose I have to scope this blog.  So, I'll take a page out of many Delaware corporations' playbooks: the purpose of this blog is to conduct any legitimate blogness that might be of interest to the blog's shareholders (that would be me).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9099477617526256046-670323424009589800?l=blog.jdwcornell.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jdwcornell.com/feeds/670323424009589800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9099477617526256046&amp;postID=670323424009589800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/670323424009589800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9099477617526256046/posts/default/670323424009589800'/><link rel='alternate' type='text/html' href='http://blog.jdwcornell.com/2008/11/yeah-about-10-years-too-late-huh.html' title='Yeah, About 10 years too late, huh?'/><author><name>jdwcornell</name><uri>http://www.blogger.com/profile/04647305480082428727</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_OMnPQG2faJ4/SybZJJzLqOI/AAAAAAAABk4/-igZ0skHr-s/S220/jason.png'/></author><thr:total>0</thr:total></entry></feed>
