<?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-6806118251241543344</id><updated>2012-01-07T22:08:44.919-08:00</updated><category term='web application'/><category term='Unix'/><category term='extract-transform-load'/><category term='Phishing'/><category term='CFL'/><category term='ETL'/><category term='heat map'/><category term='web'/><category term='yang chin'/><category term='Solar Energy'/><category term='google books'/><category term='fructose'/><category term='blackbody'/><category term='Electronics'/><category term='Mathematics'/><category term='glucose'/><category term='mutex'/><category term='santur'/><category term='fructose malabsorption'/><category term='Biology'/><category term='spider'/><category term='website-monitoring'/><category term='closures'/><category term='Scheme'/><category term='ABC'/><category term='photograph'/><category term='Radiative Cooling'/><category term='Hackbrett'/><category term='diabetes'/><category term='thermal radiation'/><category term='Incompressible flow'/><category term='simulation'/><category term='Color Science'/><category term='engineering employment'/><category term='Computer Science'/><category term='Convection'/><category term='Asperger-Syndrome'/><category term='Ink Marbling'/><category term='Music'/><category term='fractals'/><category term='Cool Roof'/><category term='philosophy'/><category term='Science'/><category term='google labs'/><category term='unix-script'/><category term='Map'/><category term='musical instruments'/><category term='Energy Efficiency'/><category term='hammer dulcimer'/><category term='Compact Fluorescent Lamp'/><category term='Color'/><category term='cymbalom'/><category term='Design Pattern'/><category term='Climate change'/><category term='hammered dulcimer'/><category term='Space-filling curves'/><category term='Computer Graphics'/><category term='Internet Fraud'/><title type='text'>Voluntocracy</title><subtitle type='html'>Governance by those who do the work.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-623870861177362664</id><published>2011-12-25T20:12:00.000-08:00</published><updated>2011-12-28T12:50:21.552-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer Graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Ink Marbling'/><title type='text'>"Mathematical Marbling" to appear in IEEE Computer Graphics and Applications</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-eAql90XEQk8/Tvfzoad5uLI/AAAAAAAABNs/uzt6QmOnojU/s1600/c.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-eAql90XEQk8/Tvfzoad5uLI/AAAAAAAABNs/uzt6QmOnojU/s320/c.png" width="315" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A paper on&amp;nbsp;&lt;a href="http://people.csail.mit.edu/jaffer/Marbling"&gt;marbling&lt;/a&gt;, which I wrote with Shufang Lu, Xiaogang Jin, Hanli Zhao, and Xiaoyang Mao has been accepted for publication:&lt;br /&gt;&lt;br /&gt;Lu, S.; Jaffer, A.; Jin, X.; Zhao, H.; Mao, X.; ,&lt;br /&gt;"Mathematical Marbling,"&lt;br /&gt;Computer Graphics and Applications, IEEE , vol.PP, no.99, pp.1, 0&lt;br /&gt;doi: 10.1109/MCG.2011.51&lt;br /&gt;&lt;a href="http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;amp;arnumber=5887299&amp;amp;isnumber=5185484"&gt;http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;amp;arnumber=5887299&amp;amp;isnumber=5185484&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-623870861177362664?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/623870861177362664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=623870861177362664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/623870861177362664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/623870861177362664'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/12/mathematical-marbling-to-appear-in-ieee.html' title='&quot;Mathematical Marbling&quot; to appear in IEEE Computer Graphics and Applications'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-eAql90XEQk8/Tvfzoad5uLI/AAAAAAAABNs/uzt6QmOnojU/s72-c/c.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-6590396579728048672</id><published>2011-11-30T19:49:00.000-08:00</published><updated>2011-11-30T19:49:33.570-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Color'/><category scheme='http://www.blogger.com/atom/ns#' term='heat map'/><category scheme='http://www.blogger.com/atom/ns#' term='thermal radiation'/><category scheme='http://www.blogger.com/atom/ns#' term='blackbody'/><title type='text'>The Colors of Heat</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://people.csail.mit.edu/jaffer/Color/Heat/heat-color.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="576" width="128" src="http://people.csail.mit.edu/jaffer/Color/Heat/heat-color.png" /&gt;&lt;/a&gt;&lt;/div&gt;  Hot objects can &lt;a href="http://en.wikipedia.org/wiki/Thermal_radiation"&gt;glow&lt;/a&gt; visibly.  &lt;a href="http://www.blksmth.com/heat_colors.htm"&gt;Heat Colors for Blacksmiths&lt;/a&gt;  shows images of &lt;a href="http://en.wikipedia.org/wiki/Mild_steel"&gt;mild steel&lt;/a&gt; at various temperatures.&lt;br /&gt;&lt;br /&gt;  At a given temperature, a &lt;a href="http://en.wikipedia.org/wiki/Blackbody"&gt;blackbody&lt;/a&gt; will emit more light than any other surface.  The table below shows the colors of a blackbody at exponentially decreasing absolute temperate.  The left column of colors is how they would naturally appear.  The top color is a sky blue, which has a color temperature of approximately 10000&amp;nbsp;K.&lt;br /&gt;&lt;br /&gt;  In the right column, each temperature's &lt;a href="http://en.wikipedia.org/wiki/Chromaticity"&gt;chromaticity&lt;/a&gt; is scaled proportionally to its Celsius temperature.&lt;br /&gt;&lt;br /&gt;  Read more at &lt;a href="http://people.csail.mit.edu/jaffer/Color/Heat"&gt;http://people.csail.mit.edu/jaffer/Color/Heat&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-6590396579728048672?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/6590396579728048672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=6590396579728048672' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/6590396579728048672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/6590396579728048672'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/11/colors-of-heat.html' title='The Colors of Heat'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-2442681861071425790</id><published>2011-08-20T18:46:00.000-07:00</published><updated>2011-08-20T18:46:01.368-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unix-script'/><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='mutex'/><category scheme='http://www.blogger.com/atom/ns#' term='website-monitoring'/><title type='text'>Script to Monitor Websites</title><content type='html'>As the maintainer of several websites, it is annoying to learn that a website has been down for hours or days only by email from a frustrated member of the browsing public.&lt;br /&gt;&lt;br /&gt;What is needed is an automated method to periodically check websites and notify me when their status changes (up or down).  This method must involve a computer other than the one hosting the website, because a stopped computer can't notify me of anything.&lt;br /&gt;&lt;br /&gt;I have created a &lt;a href="http://en.wikipedia.org/wiki/Unix_script"&gt;Unix script&lt;/a&gt; "wstatus" to be run periodically by &lt;a href="http://en.wikipedia.org/wiki/Cron"&gt;crontab&lt;/a&gt;.  Its first argument is a URL to retrieve from the website; the second is the email address to send notifications to.  The wstatus script puts small files in a $(HOME)/.status/ directory (.status in your home directory).&lt;br /&gt;&lt;br /&gt;The crontab entry:&lt;br /&gt;&lt;pre&gt;*/10 * * * * $HOME/bin/wstatus http://voluntocracy.org/server-status.txt jaffer@localhost&lt;/pre&gt;reads "server-status.txt" from "http://voluntocracy.org" every 10 minutes.  If the content or error retrieved differs from the last, then the first line of that content or error is emailed to me (locally).  "server-status.txt" contains just the line "voluntocracy.org is up!".&lt;br /&gt;&lt;br /&gt;I wonder how often my ISP changes my IP-address:&lt;br /&gt;&lt;pre&gt;25 * * * * $HOME/bin/wstatus http://automation.whatismyip.com/n09230945.asp jaffer@localhost&lt;/pre&gt;checkes once an hour (at 25 minutes past).  Of course, if I move my computer to another network, I get an email notifying me of the change.  If you use automation.whatismyip.com, be sure to observe their rule: &lt;a href="http://www.whatismyip.com/faq/automation.asp"&gt; &lt;i&gt;We ask that automated files hit our site no more then once every five minutes or once every 300 seconds.&lt;/i&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The early version of wstatus consisted of just the black code below. But it occasionally sent two email notices for a single change of status when the cron period was small.  I believe this happens because cron starts its child processes with less (numerically higher) priority than users have; and these processes queue up while higher priority jobs are running.&lt;br /&gt;&lt;br /&gt;The code in red was added to dismiss a wstatus process if another is already running.  Among the basic Unix file commands, only &lt;a href="http://en.wikipedia.org/wiki/Rm_%28Unix%29"&gt;rm&lt;/a&gt; (ReMove file) returns a status allowing it to be used as a &lt;a href="http://en.wikipedia.org/wiki/Mutex"&gt;mutex&lt;/a&gt;.  Thus, to grab the mutex the script tries to remove a file with the extension ".idl".  If it succeeded, the script continues to run; otherwise it exits immediately.&lt;br /&gt;&lt;br /&gt;This will work except if the script is interrupted and does not restore the ".idl" file.  To handle this case, the line in green was added to restore the ".idl" file when the script exits because it doesn't grab the mutex.  Whereas the code without the green line will generate only one email per change no matter how many wstatus processes are running simultaneously, with the green line, only suppression of the second wstatus process is guaranteed.  If it is the case that double processes occur more frequently than higher multiples, then this approach is reasonable.&lt;br /&gt;&lt;br /&gt;&lt;fieldset&gt;  &lt;legend&gt;&lt;b&gt;wstatus&lt;/b&gt;&lt;/legend&gt;&lt;PRE&gt;#! /bin/sh&lt;br /&gt;# Copyright (C) 2011 Aubrey Jaffer&lt;br /&gt;if test -z "$1"; then&lt;br /&gt;    echo "$0: Missing URL (first) argument" 1&amp;gt;&amp;amp;2&lt;br /&gt;    exit 1&lt;br /&gt;elif test -z "$2"; then&lt;br /&gt;    echo "$0: Missing email (second) argument" 1&amp;gt;&amp;amp;2&lt;br /&gt;    exit 1&lt;br /&gt;fi&lt;br /&gt;host=`echo $1 | sed 's%.*//%%' | sed 's%/.*%%'`&lt;br /&gt;sfile=${HOME}/.status/${host}-status.txt&lt;br /&gt;&lt;font color=red&gt;mfile=${HOME}/.status/${host}-status.idl&lt;/font&gt;&lt;br /&gt;mkdir -p ${HOME}/.status/&lt;br /&gt;if test -f ${sfile}; then&lt;br /&gt;    &lt;font color=red&gt;if ! rm ${mfile} &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;/font&gt;&lt;br /&gt;        &lt;font color=green&gt;touch ${mfile}&lt;/font&gt;&lt;br /&gt;        &lt;font color=red&gt;exit 0&lt;br /&gt;    fi&lt;/font&gt;&lt;br /&gt;    cp -f ${sfile} ${sfile}~&lt;br /&gt;fi&lt;br /&gt;if ! wget -q -T 30 -O- $1 &amp;gt; ${sfile} 2&amp;gt;&amp;amp;1; then&lt;br /&gt;    echo could not reach \"`echo $1 | sed 's%.*//%%'`\" &amp;gt; ${sfile}&lt;br /&gt;fi&lt;br /&gt;if ! (test -f ${sfile}~ &amp;amp;&amp;amp; diff -q ${sfile}~ ${sfile} &amp;gt;/dev/null 2&amp;gt;&amp;amp;1;) then&lt;br /&gt;    mail -s "`head -1 ${sfile}`" $2 &amp;lt; ${sfile}&lt;br /&gt;fi&lt;br /&gt;&lt;font color=red&gt;touch ${mfile}&lt;/font&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/fieldset&gt;&lt;br /&gt;The use of rm as a mutex is rare, perhaps novel.  I have not tested whether rm is actually atomic; but even if it isn't, it reduces by an order of magnitude the window of opportunity for repeated messages from wstatus.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-2442681861071425790?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/2442681861071425790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=2442681861071425790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/2442681861071425790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/2442681861071425790'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/08/script-to-monitor-websites.html' title='Script to Monitor Websites'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-3285696723339661047</id><published>2011-07-06T20:03:00.000-07:00</published><updated>2011-07-06T20:09:07.686-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Space-filling curves'/><category scheme='http://www.blogger.com/atom/ns#' term='fractals'/><title type='text'>Recurrence for Multidimensional Self-Similar Functions</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://people.csail.mit.edu/jaffer/Geometry/RMDSSF" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="256" width="256" src="http://4.bp.blogspot.com/-L_rWxf0S_e0/ThUd9o96tWI/AAAAAAAABJc/H42oSIz_owA/s320/Peano.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Staring at this diagram of the Peano space-filling curve inspired the &lt;a href="http://people.csail.mit.edu/jaffer/Geometry/RMDSSF"&gt;recurrence formula&lt;/a&gt;, something I have been seeking for a couple of years.  It remains to derive the inverse function and generalize the recurrence to produce Hilbert space-filling functions as well.&lt;br /&gt;&lt;br /&gt;If the unit cell is a &lt;a href="http://en.wikipedia.org/wiki/Hamiltonian_path"&gt;Hamiltonian Path&lt;/a&gt;, the resulting function is a space-filling curve.  Functions resulting from unit cells which don't connect all their nodes are still self-similar (fractal).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://people.csail.mit.edu/jaffer/Geometry/RMDSSF" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="256" width="256" src="http://3.bp.blogspot.com/-BBOyXvml-MI/ThUcYHfryVI/AAAAAAAABJU/GAMOW0kfawE/s320/Pjm.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once the formula was discovered, creating a better space-filling curve, one which is nearly isotropic, is not difficult.  This may not be novel in 2 dimensions, but the higher dimensional varieties are.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-3285696723339661047?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/3285696723339661047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=3285696723339661047' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/3285696723339661047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/3285696723339661047'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/07/recurrence-for-multidimensional-self.html' title='Recurrence for Multidimensional Self-Similar Functions'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-L_rWxf0S_e0/ThUd9o96tWI/AAAAAAAABJc/H42oSIz_owA/s72-c/Peano.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-1909386905024334831</id><published>2011-06-12T12:20:00.000-07:00</published><updated>2012-01-07T22:07:29.127-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Convection'/><title type='text'>Free Convection from Rectangular Plate</title><content type='html'>&lt;span class="Apple-style-span" style="background-color: white; font-family: Georgia, serif; font-size: 16px;"&gt;Have completed a milestone in theory of convection&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: Georgia, serif; font-size: 16px;"&gt;&amp;nbsp;&lt;i&gt;(corrected 2012-01-08)&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: Georgia, serif; font-size: 16px;"&gt;&lt;a href="http://people.csail.mit.edu/jaffer/SimRoof/Convection/" style="color: #5588aa; text-decoration: none;"&gt;http://people.csail.mit.edu/jaffer/SimRoof/Convection/&lt;/a&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: Georgia, serif; font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://people.csail.mit.edu/jaffer/SimRoof/Convection/h-vs-ang.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="224" src="http://people.csail.mit.edu/jaffer/SimRoof/Convection/h-vs-ang.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;Free convection correlations for inclined rectangular plates involve characteristic-lengths&amp;nbsp;&lt;i&gt;L&lt;sub&gt;H&lt;/sub&gt;&lt;/i&gt;,&amp;nbsp;&lt;i&gt;L&lt;sub&gt;W&lt;/sub&gt;&lt;/i&gt;, and&amp;nbsp;&lt;i&gt;L*&lt;/i&gt;&amp;nbsp;(area divided by perimeter). Each correlation is computed using its own characteristic-length. Flows are then compared and selected as convective surface-conductances (&lt;i&gt;h&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;Proposed is the complete free convective surface conductance for one side of a flat&amp;nbsp;&lt;i&gt;L&lt;sub&gt;H&lt;/sub&gt;&lt;/i&gt;&amp;nbsp;by&amp;nbsp;&lt;i&gt;L&lt;sub&gt;W&lt;/sub&gt;&lt;/i&gt;&amp;nbsp;rectangular isothermal plate inclined&amp;nbsp;&lt;i&gt;θ&lt;/i&gt;&amp;nbsp;around the level edge which is&amp;nbsp;&lt;i&gt;L&lt;sub&gt;W&lt;/sub&gt;&lt;/i&gt;&amp;nbsp;long.&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="right" nowrap=""&gt;&lt;a href="http://people.csail.mit.edu/jaffer/SimRoof/Convection/#L*"&gt;&lt;i&gt;L*&lt;/i&gt;&lt;/a&gt;&amp;nbsp;=&lt;/td&gt;&lt;td colspan="3" nowrap=""&gt;&lt;i&gt;L&lt;sub&gt;H&lt;/sub&gt;&lt;/i&gt;⋅&lt;i&gt;L&lt;sub&gt;W&lt;/sub&gt;&lt;/i&gt;&amp;nbsp;/ (2 (&lt;i&gt;L&lt;sub&gt;H&lt;/sub&gt;&lt;/i&gt;+&lt;i&gt;L&lt;sub&gt;W&lt;/sub&gt;&lt;/i&gt;))&lt;/td&gt;&lt;td rowspan="99" width="3%"&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td rowspan="99" width="3%"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right" nowrap=""&gt;&lt;i&gt;R&lt;/i&gt;&amp;nbsp;=&lt;/td&gt;&lt;td colspan="3" nowrap=""&gt;min(&lt;i&gt;L&lt;sub&gt;H&lt;/sub&gt;&lt;/i&gt;,&amp;nbsp;&lt;i&gt;L&lt;sub&gt;W&lt;/sub&gt;&lt;/i&gt;)/2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right" nowrap=""&gt;&lt;a href="http://people.csail.mit.edu/jaffer/SimRoof/Convection/#Pr"&gt;Pr&lt;/a&gt;&amp;nbsp;=&lt;/td&gt;&lt;td colspan="3" nowrap=""&gt;&lt;i&gt;c&lt;sub&gt;p&lt;/sub&gt;&lt;/i&gt;⋅μ/&lt;i&gt;k&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right" nowrap=""&gt;&lt;a href="http://people.csail.mit.edu/jaffer/SimRoof/Convection/#Ra"&gt;Ra&lt;/a&gt;(&lt;i&gt;L&lt;/i&gt;) =&lt;/td&gt;&lt;td colspan="3" nowrap=""&gt;|Δ&lt;i&gt;T&lt;/i&gt;|⋅&lt;i&gt;g&lt;/i&gt;⋅ρ&lt;sup&gt;2&lt;/sup&gt;⋅&lt;i&gt;c&lt;sub&gt;p&lt;/sub&gt;&lt;/i&gt;⋅&lt;i&gt;L&lt;/i&gt;&lt;sup&gt;3&lt;/sup&gt;&amp;nbsp;/ (&lt;i&gt;T&lt;/i&gt;⋅μ⋅&lt;i&gt;k&lt;/i&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right" nowrap=""&gt;&lt;a href="http://people.csail.mit.edu/jaffer/SimRoof/Convection/#HHT"&gt;HHT*&lt;/a&gt;(Ra*) =&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td colspan="2" nowrap=""&gt;{0.65 + 0.36 Ra*&lt;sup&gt;1/6&lt;/sup&gt;}&lt;sup&gt;2&lt;/sup&gt;&lt;/td&gt;&lt;td align="right"&gt;1≤Ra*≤1.5×10&lt;sup&gt;9&lt;/sup&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;i&gt;θ&lt;/i&gt;=−90°&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right" nowrap=""&gt;&lt;a href="http://people.csail.mit.edu/jaffer/SimRoof/Convection/#Free Convection"&gt;T9.3&lt;/a&gt;(Ra) =&lt;/td&gt;&lt;td&gt;{.825 +&lt;/td&gt;&lt;td align="center" nowrap=""&gt;.387 Ra&lt;sup&gt;1/6&lt;/sup&gt;&lt;br /&gt;&lt;hr noshade="" /&gt;[1+(.492/Pr)&lt;sup&gt;9/16&lt;/sup&gt;]&lt;sup&gt;8/27&lt;/sup&gt;&lt;/td&gt;&lt;td&gt;}&lt;sup&gt;2&lt;/sup&gt;&lt;/td&gt;&lt;td align="right"&gt;1≤Ra≤10&lt;sup&gt;12&lt;/sup&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;i&gt;θ&lt;/i&gt;=0°&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right" nowrap=""&gt;&lt;a href="http://people.csail.mit.edu/jaffer/SimRoof/Convection/#Schulenberg"&gt;Nu&lt;sub&gt;45&lt;/sub&gt;&lt;/a&gt;(Ra) =&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td align="center" nowrap=""&gt;0.544 Ra&lt;sup&gt;1/5&lt;/sup&gt;&lt;br /&gt;&lt;hr noshade="" /&gt;[1+(0.785/Pr)&lt;sup&gt;3/5&lt;/sup&gt;]&lt;sup&gt;1/3&lt;/sup&gt;&lt;/td&gt;&lt;td colspan="3"&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;i&gt;θ&lt;/i&gt;=+90°&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td nowrap=""&gt;&lt;i&gt;h&lt;/i&gt;&lt;sup&gt;&amp;nbsp;&lt;/sup&gt;=&amp;nbsp;&lt;i&gt;k&lt;/i&gt;⋅max(&lt;/td&gt;&lt;td align="center" nowrap=""&gt;Nu&lt;sub&gt;45&lt;/sub&gt;(Ra(&lt;i&gt;R&lt;/i&gt;))&lt;br /&gt;&lt;hr noshade="" /&gt;&lt;i&gt;R&lt;/i&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;,&lt;/b&gt;&lt;/td&gt;&lt;td align="center" nowrap=""&gt;T9.3(Ra(&lt;i&gt;L&lt;sub&gt;H&lt;/sub&gt;&lt;/i&gt;) cos&amp;nbsp;&lt;i&gt;θ&lt;/i&gt;)&lt;br /&gt;&lt;hr noshade="" /&gt;&lt;i&gt;L&lt;sub&gt;H&lt;/sub&gt;&lt;/i&gt;&lt;/td&gt;&lt;td&gt;)&lt;/td&gt;&lt;th rowspan="99" width="12%"&gt;&lt;/th&gt;&lt;td align="right"&gt;0°≤&lt;i&gt;θ&lt;/i&gt;≤90°&lt;/td&gt;&lt;th rowspan="99" width="1%"&gt;&lt;/th&gt;&lt;td&gt;UCT3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td nowrap=""&gt;&lt;i&gt;h&lt;/i&gt;&amp;nbsp;=&amp;nbsp;&lt;i&gt;k&lt;/i&gt;⋅max(&lt;/td&gt;&lt;td align="center" nowrap=""&gt;HHT*(Ra(&lt;i&gt;L*&lt;/i&gt;) sin(−&lt;i&gt;θ&lt;/i&gt;))&lt;br /&gt;&lt;hr noshade="" /&gt;&lt;i&gt;L*&lt;/i&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;,&lt;/b&gt;&lt;/td&gt;&lt;td align="center" nowrap=""&gt;T9.3(Ra(&lt;i&gt;L&lt;sub&gt;H&lt;/sub&gt;&lt;/i&gt;) cos&amp;nbsp;&lt;i&gt;θ&lt;/i&gt;)&lt;br /&gt;&lt;hr noshade="" /&gt;&lt;i&gt;L&lt;sub&gt;H&lt;/sub&gt;&lt;/i&gt;&lt;/td&gt;&lt;td&gt;)&lt;/td&gt;&lt;td&gt;−90°≤&lt;i&gt;θ&lt;/i&gt;≤0°&lt;/td&gt;&lt;td&gt;UHT3&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;hr /&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=6806118251241543344" name="Forced Convection"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=6806118251241543344" name="Forced Convection"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-1909386905024334831?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/1909386905024334831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=1909386905024334831' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1909386905024334831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1909386905024334831'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/06/natural-convection-from-rectangular.html' title='Free Convection from Rectangular Plate'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-23741709430514236</id><published>2011-05-08T19:57:00.000-07:00</published><updated>2011-05-09T13:11:46.177-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fructose malabsorption'/><category scheme='http://www.blogger.com/atom/ns#' term='fructose'/><category scheme='http://www.blogger.com/atom/ns#' term='glucose'/><category scheme='http://www.blogger.com/atom/ns#' term='diabetes'/><title type='text'>Excess Fructose Content of Foods</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://voluntocracy.org/Fructose" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="208" width="220" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Agave_americana_a-m.jpg/220px-Agave_americana_a-m.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Fructose"&gt;Fructose&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Glucose"&gt;glucose&lt;/a&gt; are simultaneously absorbed in equal amounts by the intestines.  Excess fructose is absorbed by a different mechanism.  In individuals with &lt;a href="http://en.wikipedia.org/wiki/Fructose_malabsorption"&gt;fructose malabsorption&lt;/a&gt;, excess fructose remains in the intestines where fermentation causes gastric distress.&lt;br /&gt;&lt;br /&gt;Glucose requires insulin to be absorbed from the bloodstream, while fructose does not.  There has been vigorous debate as to whether individuals with &lt;a href="http://en.wikipedia.org/wiki/Diabetes_mellitus"&gt;Diabetes mellitus&lt;/a&gt; (a metabolic disease characterized by high blood sugar) should consume or avoid fructose.&lt;br /&gt;&lt;br /&gt;In any case, it would be interesting to have a chart showing the spectrum of fructose-heavy to glucose-heavy foods.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.usda.gov/wps/portal/usda/usdahome?navid=FOOD_NUTRITION&amp;amp;navtype=SU&amp;amp;edeployment_action=changenav"&gt;USDA&lt;/a&gt; &lt;a href="http://www.nal.usda.gov/fnic/foodcomp/search/"&gt; National Nutrient Database&lt;/a&gt; gives nutrient values for 7636 foods; but only 1134 of them have fructose and glucose values.&lt;br /&gt;&lt;br /&gt;This database was used to create a &lt;a href="http://voluntocracy.org/Fructose"&gt;&lt;strong&gt;table of the 1134 foods having fructose and glucose values&lt;/strong&gt;&lt;/a&gt;.  The foods are listed in order of decreasing amount of excess fructose.&lt;br /&gt;&lt;br /&gt;The database doesn't give data for &lt;a href="http://en.wikipedia.org/wiki/High-fructose_corn_syrup"&gt; High Fructose Corn Syrup&lt;/a&gt;.  Used mostly in soft drinks, HFCS&amp;nbsp;55 is composed of approximately 55% fructose and 42% glucose.  This would give it a 13% excess of fructose, comparable to the 15% and 20% fructose excesses of lemonade powders near the top of the chart.&lt;br /&gt;&lt;br /&gt;When dried, the Agave americana plant pictured above has the most excess fructose (39%) of the foods in the database.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-23741709430514236?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/23741709430514236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=23741709430514236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/23741709430514236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/23741709430514236'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/05/excess-fructose-content-of-foods.html' title='Excess Fructose Content of Foods'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-6774661919100666466</id><published>2011-03-23T19:00:00.000-07:00</published><updated>2011-03-23T19:06:25.270-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design Pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='closures'/><category scheme='http://www.blogger.com/atom/ns#' term='ETL'/><category scheme='http://www.blogger.com/atom/ns#' term='extract-transform-load'/><title type='text'>Design Pattern for Multi-Format Extract-Transform-Load</title><content type='html'>&lt;p&gt;Presented is a design-pattern for single-pass &lt;a href="http://en.wikipedia.org/wiki/Extract,_transform,_load"&gt;extract-transform-load&lt;/a&gt; (ETL) processing of line-oriented files which automatically detects the line format, but which does not require any domain-specific code devoted to deciding the format of the input file. &lt;/p&gt;&lt;hr&gt;&lt;p&gt;The &lt;a href="http://people.csail.mit.edu/jaffer/Color/Dictionaries"&gt;Color-Name Dictionaries&lt;/a&gt; web-page analyzes and compares more than 3 dozen color dictionaries from book and online sources.  The dictionary sources are in 19 (plain-text and HTML) formats.  The largest is the "NBS/ISCC Dictionary of Color Names" with 5411 color names; and there are several with over 1300 names.  Some color dictionaries are updated or added every year. &lt;/p&gt;&lt;p&gt;The dictionary files share these characteristics: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Each color-name entry appears on a single line.&lt;/li&gt;&lt;li&gt;All the intended color-name entries in a file have the same&lt;br /&gt;format.&lt;/li&gt;&lt;li&gt;A Preamble and comments may be mixed with the color-name&lt;br /&gt;entries.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There are format errors, inconsistencies, duplicates, and collisions (where a color name is repeated with different color coordinates) in some of the files.  In spite of this, &lt;a href="http://people.csail.mit.edu/jaffer/slib_5.html#IDX970"&gt;file-&amp;gt;color-dictionary&lt;/a&gt; and &lt;a href="http://people.csail.mit.edu/jaffer/slib_5.html#IDX970"&gt;url-&amp;gt;color-dictionary&lt;/a&gt; in the SLIB &lt;a href="http://people.csail.mit.edu/jaffer/slib_5.html#SEC143"&gt;color-database&lt;/a&gt; module are able to automatically detect the format and extract and clean the data and insert it into relational tables.  This is accomplished in an easy-to-extend fashion using &lt;a href="http://en.wikipedia.org/wiki/Closure_(computer_science)"&gt;closures&lt;/a&gt;. This code is written in &lt;a href="http://people.csail.mit.edu/jaffer/Scheme"&gt;Scheme&lt;/a&gt;, but the same idea should work in any language with closures. &lt;/p&gt;&lt;p&gt;The main ETL loop has &lt;samp&gt;port&lt;/samp&gt; bound to an input-stream reading from the dictionary source file: &lt;/p&gt;&lt;pre&gt;        (do ((line (read-line port) (read-line port)))&lt;br /&gt;            ((eof-object? line)&lt;br /&gt;             (display "Inserted ") (display *idx*) (display " colors") (newline)&lt;br /&gt;             *rcs-header*)&lt;br /&gt;          (let ((colin (parse-rgb-line line)))&lt;br /&gt;            (cond ((equal? "" line))&lt;br /&gt;                  ((not colin) (write-line line))&lt;br /&gt;                  ((numbered-gray? (cadr colin)))&lt;br /&gt;                  (else&lt;br /&gt;                   (for-each&lt;br /&gt;                    (lambda (name)&lt;br /&gt;                      (let ((oclin (color-table:row-retrieve name)))&lt;br /&gt;                        (cond&lt;br /&gt;                         ((and oclin (equal? (car colin) (cadr oclin))))&lt;br /&gt;                         ((not oclin)&lt;br /&gt;                          (set! *idx* (+ 1 *idx*))&lt;br /&gt;                          (color-table:row-insert&lt;br /&gt;                           (list name (car colin) *idx*)))&lt;br /&gt;                         (else (slib:warn 'collision colin oclin)))))&lt;br /&gt;                    (cdr colin))))))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The &lt;samp&gt;do&lt;/samp&gt; loop iterates over the lines read from &lt;samp&gt;port&lt;/samp&gt;, calling &lt;samp&gt;parse-rgb-line&lt;/samp&gt; on each. The call to &lt;samp&gt;parse-rgb-line&lt;/samp&gt; returns false unless the line was parsed as a valid color-dictionary line.  If it returns false, &lt;samp&gt;line&lt;/samp&gt; is printed to the log.  If it returns a data row, each name in the row is checked for an existing table entry; if it matches, nothing is done; if it doesn't match, a warning is generated; if there is no entry, then it is created. &lt;/p&gt;&lt;pre&gt;    (define (parse-rgb-line line)&lt;br /&gt;     ...&lt;br /&gt;        (for-each&lt;br /&gt;         (lambda (method)&lt;br /&gt;           (or ans&lt;br /&gt;               (let ((try (method line)))&lt;br /&gt;                 (cond (try (set! ans try)&lt;br /&gt;                            (display "**** Using method ")&lt;br /&gt;                            (display method-id) (newline)&lt;br /&gt;                            (set! parse-rgb-line method))))))&lt;br /&gt;         (list&lt;br /&gt;          (lambda (line) ...)&lt;br /&gt;          (lambda (line) ...)&lt;br /&gt;          ...&lt;br /&gt;         )))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The construction of &lt;samp&gt;parse-rgb-line&lt;/samp&gt; is a bit unusual. The &lt;samp&gt;for-each&lt;/samp&gt; procedure calls its first argument &lt;code&gt;(lambda&amp;nbsp;(method)&amp;nbsp;...)&lt;/code&gt; with each function &lt;code&gt;(lambda&amp;nbsp;(line)&amp;nbsp;...)&lt;/code&gt; in the list which is its second argument.  The first-argument procedure returns immediately if &lt;samp&gt;ans&lt;/samp&gt; is not false.  Otherwise, it calls &lt;samp&gt;method&lt;/samp&gt; with the input line. If &lt;samp&gt;method&lt;/samp&gt; returns a data row, then &lt;samp&gt;ans&lt;/samp&gt; is set to it, and no other &lt;samp&gt;method&lt;/samp&gt;s will be called.  The test of &lt;samp&gt;ans&lt;/samp&gt; can be eliminated through the use of an escape continuation. &lt;/p&gt;&lt;p&gt;Most importantly, when &lt;samp&gt;method&lt;/samp&gt; returns a data row, it sets &lt;samp&gt;parse-rgb-line&lt;/samp&gt; to &lt;samp&gt;method&lt;/samp&gt;, so that after the current invocation of &lt;samp&gt;parse-rgb-line&lt;/samp&gt; returns (or escapes), the &lt;samp&gt;method&lt;/samp&gt; which worked will be called directly.  Thus &lt;samp&gt;parse-rgb-line&lt;/samp&gt; is a self-replacing function! &lt;/p&gt;&lt;p&gt;If &lt;samp&gt;parse-rgb-line&lt;/samp&gt; is defined internally to another procedure, the containing procedure can be reentrant (as SLIB is). &lt;/p&gt;&lt;p&gt;Here is a typical &lt;code&gt;(lambda&amp;nbsp;(line)&amp;nbsp;...)&lt;/code&gt; function: &lt;/p&gt;&lt;pre&gt;          (lambda (line)&lt;br /&gt;            (case (sscanf line " %24[a-zA-Z0-9_ ] %d %d %d %e %e %e %s"&lt;br /&gt;                          name r g b ri gi bi junk)&lt;br /&gt;              ((7)&lt;br /&gt;               (set! method-id 'm7)&lt;br /&gt;               (list (check-match line&lt;br /&gt;                                  (color:sRGB r g b)&lt;br /&gt;                                  (floats-&amp;gt;rgb ri gi bi))&lt;br /&gt;                     (color-name:canonicalize name)))&lt;br /&gt;              (else #f)))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;samp&gt;sscanf&lt;/samp&gt; is called with 8 variables, but this function will succeed only if exactly 7 are scanned; this is to detect extra stuff on the line. &lt;samp&gt;method-id&lt;/samp&gt; is for reporting which method succeeded. &lt;samp&gt;check-match&lt;/samp&gt; is called to warn if the RGB integer coordinates don't match the floating-point color coordinates. &lt;/p&gt;&lt;p&gt;If a format needs to ignore junk at the end of lines, then it should come after any functions (in the list) whose formats it might spoof. This way, the more specific format takes precedence. &lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;A design-pattern employing a self-replacing function provides single-pass ETL processing of line-oriented files which automatically detects the line format. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-6774661919100666466?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/6774661919100666466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=6774661919100666466' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/6774661919100666466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/6774661919100666466'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/03/design-pattern-for-multi-format-extract.html' title='Design Pattern for Multi-Format Extract-Transform-Load'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-3744036159963060934</id><published>2011-03-15T13:05:00.000-07:00</published><updated>2011-03-15T13:52:15.420-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='musical instruments'/><category scheme='http://www.blogger.com/atom/ns#' term='santur'/><category scheme='http://www.blogger.com/atom/ns#' term='hammered dulcimer'/><category scheme='http://www.blogger.com/atom/ns#' term='Hackbrett'/><category scheme='http://www.blogger.com/atom/ns#' term='hammer dulcimer'/><category scheme='http://www.blogger.com/atom/ns#' term='cymbalom'/><category scheme='http://www.blogger.com/atom/ns#' term='google books'/><category scheme='http://www.blogger.com/atom/ns#' term='google labs'/><category scheme='http://www.blogger.com/atom/ns#' term='yang chin'/><title type='text'>Names for Hammer Dulcimer in English Books 1800-2000</title><content type='html'>&lt;a href="http://ngrams.googlelabs.com/graph?content=santur%2Chammer+dulcimer%2Ccymbalom%2Cyang+chin%2CHackbrett%2Chammered+dulcimer&amp;year_start=1800&amp;year_end=2000&amp;corpus=0&amp;smoothing=3"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="330" width="900" src="http://ngrams.googlelabs.com/chart?content=santur%2Chammer%20dulcimer%2Ccymbalom%2Cyang%20chin%2CHackbrett%2Chammered%20dulcimer&amp;corpus=0&amp;smoothing=3&amp;year_start=1800&amp;year_end=2000" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://ngrams.googlelabs.com/"&gt;Google Labs&lt;/a&gt; has a nice webapp for creating graphs of word- and phrase-frequency versus time for the millions of books they have scanned.&lt;br /&gt;&lt;br /&gt;Here is a graph of the frequency of various names for hammer-dulcimer from 1800 to the present.  Click on the graph to try out the webapp for your own ideas.  One caution; it is case-sensitive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-3744036159963060934?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/3744036159963060934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=3744036159963060934' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/3744036159963060934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/3744036159963060934'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/03/names-for-hammer-dulcimer-in-english.html' title='Names for Hammer Dulcimer in English Books 1800-2000'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-5730895267055188941</id><published>2011-03-04T13:39:00.000-08:00</published><updated>2011-03-09T07:23:39.046-08:00</updated><title type='text'>YouTube Hangs my Ubuntu-10.04 HP-dv7</title><content type='html'>At 7:17pm on Mar 2 2011 Ubuntu-10.04.1 running on an HP dv7 (x86_64) ceased to be able to play YouTube videos.  Both Chromium and FireFox get wedged.  Hulu and other Flash services play without problems.  But after a couple of seconds of playing a YouTube video, the screen goes black with white streaks. /var/log/kern.log goes into loop:&lt;br /&gt;&lt;pre&gt;Mar  2 19:17:37 dv7 kernel: [ 8232.470145] [drm:radeon_fence_wait] *ERROR* fence(ffff8800b8044980:0x000097BA) 510ms timeout going to reset GPU&lt;br /&gt;Mar  2 19:17:37 dv7 kernel: [ 8232.470157] radeon 0000:01:00.0: GPU softreset &lt;br /&gt;Mar  2 19:17:37 dv7 kernel: [ 8232.470164] radeon 0000:01:00.0:   R_008010_GRBM_STATUS=0xE53024A4&lt;br /&gt;Mar  2 19:17:37 dv7 kernel: [ 8232.470171] radeon 0000:01:00.0:   R_008014_GRBM_STATUS2=0x00110002&lt;br /&gt;Mar  2 19:17:37 dv7 kernel: [ 8232.470177] radeon 0000:01:00.0:   R_000E50_SRBM_STATUS=0x200000C0&lt;br /&gt;Mar  2 19:17:37 dv7 kernel: [ 8232.470192] radeon 0000:01:00.0:   R_008020_GRBM_SOFT_RESET=0x00007FEE&lt;br /&gt;Mar  2 19:17:37 dv7 kernel: [ 8232.470249] radeon 0000:01:00.0: R_008020_GRBM_SOFT_RESET=0x00000001&lt;br /&gt;Mar  2 19:17:37 dv7 kernel: [ 8232.470314] radeon 0000:01:00.0:   R_000E60_SRBM_SOFT_RESET=0x00000402&lt;br /&gt;Mar  2 19:17:37 dv7 kernel: [ 8232.519205] radeon 0000:01:00.0:   R_008010_GRBM_STATUS=0x00003028&lt;br /&gt;Mar  2 19:17:37 dv7 kernel: [ 8232.519211] radeon 0000:01:00.0:   R_008014_GRBM_STATUS2=0x00000002&lt;br /&gt;Mar  2 19:17:37 dv7 kernel: [ 8232.519217] radeon 0000:01:00.0:   R_000E50_SRBM_STATUS=0x200000C0&lt;br /&gt;Mar  2 19:17:37 dv7 kernel: [ 8232.523318] [drm:radeon_fence_wait] *ERROR* fence(ffff8800b8044980:0x000097BA) 570ms timeout&lt;br /&gt;Mar  2 19:17:37 dv7 kernel: [ 8232.523320] [drm:radeon_fence_wait] *ERROR* last signaled fence(0x000097BA)&lt;br /&gt;Mar  2 19:17:39 dv7 kernel: [ 8235.040219] [drm:radeon_fence_wait] *ERROR* fence(ffff8800c4203ac0:0x000097C3) 510ms timeout going to reset GPU&lt;br /&gt;Mar  2 19:17:39 dv7 kernel: [ 8235.040231] radeon 0000:01:00.0: GPU softreset &lt;br /&gt;Mar  2 19:17:39 dv7 kernel: [ 8235.040238] radeon 0000:01:00.0:   R_008010_GRBM_STATUS=0xA0003028&lt;br /&gt;Mar  2 19:17:39 dv7 kernel: [ 8235.040245] radeon 0000:01:00.0:   R_008014_GRBM_STATUS2=0x00000002&lt;br /&gt;Mar  2 19:17:39 dv7 kernel: [ 8235.040251] radeon 0000:01:00.0:   R_000E50_SRBM_STATUS=0x200000C0&lt;br /&gt;Mar  2 19:17:39 dv7 kernel: [ 8235.040263] radeon 0000:01:00.0:   R_008020_GRBM_SOFT_RESET=0x00007FEE&lt;br /&gt;Mar  2 19:17:39 dv7 kernel: [ 8235.040319] radeon 0000:01:00.0: R_008020_GRBM_SOFT_RESET=0x00000001&lt;br /&gt;Mar  2 19:17:39 dv7 kernel: [ 8235.040384] radeon 0000:01:00.0:   R_000E60_SRBM_SOFT_RESET=0x00000402&lt;br /&gt;Mar  2 19:17:39 dv7 kernel: [ 8235.089275] radeon 0000:01:00.0:   R_008010_GRBM_STATUS=0x00003028&lt;br /&gt;Mar  2 19:17:39 dv7 kernel: [ 8235.089280] radeon 0000:01:00.0:   R_008014_GRBM_STATUS2=0x00000002&lt;br /&gt;Mar  2 19:17:39 dv7 kernel: [ 8235.089286] radeon 0000:01:00.0:   R_000E50_SRBM_STATUS=0x200000C0&lt;br /&gt;Mar  2 19:17:39 dv7 kernel: [ 8235.091966] [drm:radeon_fence_wait] *ERROR* fence(ffff8800c4203ac0:0x000097C3) 570ms timeout&lt;br /&gt;Mar  2 19:17:39 dv7 kernel: [ 8235.091968] [drm:radeon_fence_wait] *ERROR* last signaled fence(0x000097C3)&lt;br /&gt;Mar  2 19:17:42 dv7 kernel: [ 8237.611578] [drm:radeon_fence_wait] *ERROR* fence(ffff8800c4203f00:0x000097CA) 510ms timeout going to reset GPU&lt;br /&gt;Mar  2 19:17:42 dv7 kernel: [ 8237.611591] radeon 0000:01:00.0: GPU softreset &lt;br /&gt;&lt;/pre&gt;Reinstalling Flash didn't help.  Eight hours earlier, I had updated to 2.6.32-29-generic; but booting with the previous kernel version doesn't help.  Installing the "linux-firmware-nonfree" drivers made no difference.&lt;br /&gt;&lt;pre&gt;Start-Date: 2011-03-02  10:42:14&lt;br /&gt;Install: linux-headers-2.6.32-29-generic (2.6.32-29.58), linux-headers-2.6.32-29 (2.6.32-29.58), linux-image-2.6.32-29-generic (2.6.32-29.58)&lt;br /&gt;Upgrade: linux-generic (2.6.32.28.32, 2.6.32.29.35), linux-headers-generic (2.6.32.28.32, 2.6.32.29.35), linux-image-generic (2.6.32.28.32, 2.6.32.29.35), linux-libc-dev (2.6.32-28.55, 2.6.32-29.58)&lt;br /&gt;End-Date: 2011-03-02  10:43:29&lt;br /&gt;&lt;/pre&gt;What has changed to cause this?&lt;br /&gt;Others with the same problem are posting to&lt;br /&gt;&lt;a href="http://ubuntuforums.org/showthread.php?t=1699550"&gt;http://ubuntuforums.org/showthread.php?t=1699550&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.webupd8.org/2011/03/fix-pinkred-youtube-videos-bug-using.html"&gt;Fix Pink / Red YouTube Videos Bug Using Flash 10.2 In Ubuntu&lt;/a&gt;&lt;br /&gt;"Possible fix 3" solved the problem by disabling "hardware acceleration" in Flash.  So who's bug is this?  Is the bug in Flash 10.2 or something it calls?  In any case, plugins shouldn't be able to crash X11.  So X11 is behaving badly; but the errors show up in "kern.log"; does the kernel deserve some of the blame?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-5730895267055188941?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/5730895267055188941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=5730895267055188941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/5730895267055188941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/5730895267055188941'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/03/youtube-hangs-my-ubuntu-1004-hp-dv7.html' title='YouTube Hangs my Ubuntu-10.04 HP-dv7'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-7306035269382920939</id><published>2011-02-02T19:53:00.000-08:00</published><updated>2011-02-02T19:53:42.713-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='engineering employment'/><category scheme='http://www.blogger.com/atom/ns#' term='Asperger-Syndrome'/><title type='text'>Asperger-Syndrome Software Job Index</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Asperger_syndrome"&gt;Asperger syndrome&lt;/a&gt; is an autism spectrum disorder that is characterized by significant difficulties in social interaction, along with restricted and repetitive patterns of behavior and interests.&lt;br /&gt;&lt;br /&gt;In the last few years it seems like more and more job postings for engineers are including requirements for better than average communication or interpersonal skills.  Back when I was an undergraduate student, engineering was a good career choice for nerds. Apparently, no longer. Looking at &lt;a href="http://boston.craigslist.org/sof/"&gt;Craigslist - boston software/QA/DBA/etc jobs classifieds&lt;/a&gt; for Wed Feb 02, 2011, 19 out of 33 postings require good communication or interpersonal skills. Several of the postings by third-party recruiters didn't have the full job description and might also require those skills.  So today's Asperger-syndrome-software-job-index is 42% or less; only 42% of the job postings don't mention communication or interpersonal skills.&lt;br /&gt;&lt;br /&gt;&lt;table border=1&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2194239569.html"&gt;Software Development Engineer&lt;/a&gt; - (UMass, Boston Campus)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2194165806.html"&gt;Research Programmer&lt;/a&gt; -  (Cambridge)&lt;/td&gt;&lt;td&gt;Strong organizational and communication skills and the ability to work with others.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2194143125.html"&gt;SQL Database Administrator&lt;/a&gt; -  (Cranston, RI)&lt;/td&gt;&lt;td&gt;Good written and oral communication skills.&lt;br&gt;&lt;br /&gt;Good interpersonal skills.&lt;br&gt;&lt;br /&gt;Ability to present ideas in user-friendly language.&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2194052805.html"&gt;Software Engineer (Java)&lt;/a&gt; -  (Downtown Boston)&lt;/td&gt;&lt;td&gt;Excellent verbal and written communication skills. Be able to clearly communicate at both high and basic technical levels.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193998323.html"&gt;Data/Analytics Engineer&lt;/a&gt; -  (Boston)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193980705.html"&gt;Developer in Testing&lt;/a&gt; -  (Boston, MA)&lt;/td&gt;&lt;td&gt;High energy level &amp; excellent people/team member skills&lt;br&gt;&lt;br /&gt;Good communication ability&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193970689.html"&gt;Director of Systems Operations &lt;/a&gt; -  (Kendall Square, Cambridge, MA)&lt;/td&gt;&lt;td&gt;Excellent customer service attitude, communication skills (written and verbal), and interpersonal skills.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193958071.html"&gt;QA Engineer - Java &lt;/a&gt; -  (Greater Boston)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/bmw/sof/2193934367.html"&gt;QA Engineer&lt;/a&gt; -  (Waltham)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193758443.html"&gt;Microsoft  Tech. Solutions Prof.&lt;/a&gt; -  (Virtual)&lt;/td&gt;&lt;td&gt;Excellent written and oral communication skills&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/bmw/sof/2193627456.html"&gt;Entry-level Tech Support - $60k&lt;/a&gt; -  (Waltham, MA)&lt;/td&gt;&lt;td&gt;Excellent communication skills&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193626946.html"&gt;Software Engineer – .NET Development Contractor&lt;/a&gt; -  (Cambridge, MA)&lt;/td&gt;&lt;td&gt;Good written and oral communication skills&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/sob/sof/2193613876.html"&gt;Sr. Software Engineer - Flex/Flash&lt;/a&gt; -  (Rte. 495 South)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193600159.html"&gt;.NET Application Engineer – C# - CSS - SQL&lt;/a&gt; -  (Boston, MA)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/sob/sof/2193567881.html"&gt;Want to get into the HealthCare field??  VB.NET position open!&lt;/a&gt; -  (Braintree, MA)&lt;/td&gt;&lt;td&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/bmw/sof/2193518494.html"&gt;Sr. Software Engineer&lt;/a&gt; -  (Rt. 128 West)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193453532.html"&gt;Junior Java Developer&lt;/a&gt; -  (Downtown Boston)&lt;/td&gt;&lt;td&gt;Good verbal and written communication skills&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193355072.html"&gt;iOS Developer&lt;/a&gt; -  (Providence Rhode Island)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193321641.html"&gt;Are you Mark Zuckerberg without the idea?&lt;/a&gt; - &lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/nwb/sof/2193228841.html"&gt;Hardware Quality Assurance Engineer&lt;/a&gt; -  (North Reading)&lt;/td&gt;&lt;td&gt;Strong communication skills and cross-functional leadership &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193192064.html"&gt;Contract Software Developer&lt;/a&gt; -  (Boston) &lt;span class="p"&gt; img&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Strong communication and collaboration skills.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/bmw/sof/2193189722.html"&gt;Document Prod Coord.&lt;/a&gt; -  (Wellesley)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193179748.html"&gt;Mid-Level Software Developer&lt;/a&gt; -  (Boston) &lt;span class="p"&gt; img&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Strong communication and collaboration skills.&lt;br&gt;&lt;br /&gt;Strong communication and collaboration skills.[sic]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193168089.html"&gt;Release Engineering Manager&lt;/a&gt; -  (Boston) &lt;span class="p"&gt; img&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Strong communication and collaboration skills.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193130504.html"&gt;Information Management Software Developer&lt;/a&gt; -  (Cambridge, MA)&lt;/td&gt;&lt;td&gt;Should have problem solving and research skills along with excellent written and verbal communication skills.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193129832.html"&gt;Senior LAMP Developer&lt;/a&gt; -  (Lexington)&lt;/td&gt;&lt;td&gt;Excellent communication skills&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://boston.craigslist.org/gbs/sof/2193126348.html"&gt;Mid-Level LAMP Developer&lt;/a&gt; -  (Lexington)&lt;/td&gt;&lt;td&gt;Good communication skills&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-7306035269382920939?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/7306035269382920939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=7306035269382920939' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/7306035269382920939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/7306035269382920939'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/02/asperger-syndrome-software-job-index.html' title='Asperger-Syndrome Software Job Index'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-830653168702138030</id><published>2011-01-17T18:34:00.000-08:00</published><updated>2011-01-19T18:02:15.086-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><category scheme='http://www.blogger.com/atom/ns#' term='web application'/><category scheme='http://www.blogger.com/atom/ns#' term='ABC'/><title type='text'>New webapp to transpose tunes in ABC format.</title><content type='html'>I made a web application out of my program to transpose tunes in ABC format.&lt;br /&gt;&lt;a href="http://voluntocracy.org/Music/Transpose.html"&gt;http://voluntocracy.org/Music/Transpose.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;FORM METHOD="post"      ACTION="http://people.csail.mit.edu/jaffer/cgi-bin/transpose.cgi"&gt;&lt;DIV&gt;Instrument key (Bb), interval (-3. or 1/5), or semitones (+12): &lt;INPUT TYPE=TEXT NAME=interval SIZE=5&gt;&lt;/DIV&gt;&lt;DIV&gt;Paste an ABC tune or its URL here:&lt;BR&gt;&lt;TEXTAREA NAME=abc rows=8 cols=80&gt;&lt;/TEXTAREA&gt;&lt;/DIV&gt;&lt;DIV&gt;  &lt;INPUT TYPE=SUBMIT VALUE="Transpose"&gt;&lt;INPUT TYPE=RESET&gt;&amp;nbsp;&amp;nbsp;&lt;INPUT TYPE=CHECKBOX NAME=mime&gt;Check square to save file, otherwise view.&lt;/DIV&gt;&lt;/FORM&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-830653168702138030?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/830653168702138030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=830653168702138030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/830653168702138030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/830653168702138030'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/01/new-webapp-to-transpose-tunes-in-abc.html' title='New webapp to transpose tunes in ABC format.'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-5337309586622872943</id><published>2011-01-12T21:31:00.000-08:00</published><updated>2011-01-12T21:31:06.109-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><category scheme='http://www.blogger.com/atom/ns#' term='ABC'/><title type='text'>ABC Music Transpose Program</title><content type='html'>I have reorganized my &lt;a href="http://voluntocracy.org/Music"&gt;Music Pages&lt;/a&gt; and added a page for my &lt;a href="http://voluntocracy.org/Music/Transpose.html"&gt;program to transpose ABC-format music files&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;UL&gt;  &lt;LI&gt;&lt;A HREF="http://voluntocracy.org/Music/tunes.html"&gt;Folk Tunes&lt;/A&gt;&lt;/LI&gt;  &lt;LI&gt;&lt;A HREF="http://voluntocracy.org/Music/Tunes.html"&gt;About the Folk Tunes&lt;/A&gt;&lt;/LI&gt;  &lt;LI&gt;&lt;A HREF="http://voluntocracy.org/Music/ABC.html"&gt;ABC Music Notation&lt;/A&gt;&lt;/LI&gt;  &lt;LI&gt;&lt;A HREF="http://voluntocracy.org/Music/Transpose.html"&gt;ABC Transpose Program&lt;/A&gt;&lt;/LI&gt;  &lt;LI&gt;&lt;A HREF="http://voluntocracy.org/Music/Overtones.html"&gt;Why Musical Scales Work&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-5337309586622872943?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/5337309586622872943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=5337309586622872943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/5337309586622872943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/5337309586622872943'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/01/abc-music-transpose-program.html' title='ABC Music Transpose Program'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-178160680257495658</id><published>2011-01-12T09:29:00.000-08:00</published><updated>2011-01-12T21:17:06.158-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CFL'/><category scheme='http://www.blogger.com/atom/ns#' term='Electronics'/><category scheme='http://www.blogger.com/atom/ns#' term='Energy Efficiency'/><category scheme='http://www.blogger.com/atom/ns#' term='Compact Fluorescent Lamp'/><title type='text'>Don't Install CFLs in the Bathroom</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Electronic_ballast" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="265" width="300" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c4/Elektronstarterp.jpg/300px-Elektronstarterp.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;A correspondent writes:&lt;br /&gt;&lt;blockquote&gt;I just replaced three 60 watt &lt;a href="http://en.wikipedia.org/wiki/Compact_fluorescent_lamp"&gt;CFL&lt;/a&gt;s in my bathroom that had failed in less than 2 years.  Box says 4 years for instant on minis.&lt;br /&gt;&lt;/blockquote&gt;Its not the glass bulb, but the &lt;a href="http://en.wikipedia.org/wiki/Electronic_ballast"&gt;electronic ballast&lt;/a&gt; in the base of the CFL which fails from exposure to moisture.&lt;br /&gt;&lt;br /&gt;Most consumer electronics contain semiconductor chips in plastic packages, which do not remain sealed over the product's life.  This practice is good enough in dry environments, but hydrogen from moisture infiltrates silicon chips, eventually causing the transistor thresholds to change, which causes failure.&lt;br /&gt;&lt;br /&gt;Depending on your local electricity rates, the expected life of a CFL is not long enough to recoup its cost in energy savings if the lamp is used less than two hours a day.  Putting CFLs in little-used locations is likely also not energy-efficient considering the energy and materials used to manufacture and dispose of the bulb.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-178160680257495658?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/178160680257495658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=178160680257495658' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/178160680257495658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/178160680257495658'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/01/dont-install-cfls-in-bathroom.html' title='Don&apos;t Install CFLs in the Bathroom'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-686650547008645181</id><published>2011-01-03T19:13:00.000-08:00</published><updated>2011-01-05T19:07:44.733-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='simulation'/><category scheme='http://www.blogger.com/atom/ns#' term='Solar Energy'/><category scheme='http://www.blogger.com/atom/ns#' term='Radiative Cooling'/><title type='text'>Simulating Availability of Radiative Cooling</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://people.csail.mit.edu/jaffer/SimRoof/PerfectLambertian" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="305" width="390" src="http://people.csail.mit.edu/jaffer/SimRoof/Tropics/912120TY-perfect-nirt-zr-avl-hr.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The &lt;a href="http://people.csail.mit.edu/jaffer/SimRoof"&gt;SimRoof&lt;/a&gt; program I have been developing can now create graphs of the availability of radiative cooling.  This "Perfect CoolRoof" graph shows that in Guam:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The roof will provide more than 7&amp;nbsp;W/m&lt;sup&gt;2&lt;/sup&gt; of cooling 99% of the time;&lt;/LI&gt;&lt;li&gt;the roof will provide more than 22&amp;nbsp;W/m&lt;sup&gt;2&lt;/sup&gt; of cooling 90% of the time;&lt;/LI&gt;&lt;li&gt;the roof will provide more than 60&amp;nbsp;W/m&lt;sup&gt;2&lt;/sup&gt; of cooling 50% of the time (the median);&lt;/LI&gt;&lt;li&gt;the roof will provide more than 80&amp;nbsp;W/m&lt;sup&gt;2&lt;/sup&gt; of cooling only 10% of the time;&lt;/LI&gt;&lt;li&gt;the roof will provide more than 90&amp;nbsp;W/m&lt;sup&gt;2&lt;/sup&gt; of cooling only 1% of the time.&lt;/LI&gt; &lt;/UL&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-686650547008645181?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/686650547008645181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=686650547008645181' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/686650547008645181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/686650547008645181'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2011/01/simulating-availability-of-radiative.html' title='Simulating Availability of Radiative Cooling'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-4557515134051862023</id><published>2010-12-21T11:33:00.000-08:00</published><updated>2010-12-21T13:36:00.132-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><category scheme='http://www.blogger.com/atom/ns#' term='Ink Marbling'/><title type='text'>Marbling the Torus</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://people.csail.mit.edu/jaffer/Marbling/TM-bouquetsx2.jpg" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="360" width="360" src="http://people.csail.mit.edu/jaffer/Marbling/TM-bouquetsx2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I have cleaned up the math on &lt;a href="http://people.csail.mit.edu/jaffer/Marbling/Torus"&gt;Marbling the Torus&lt;/a&gt; and changed my scripts to oversample the images, resulting in less graininess.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-4557515134051862023?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/4557515134051862023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=4557515134051862023' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/4557515134051862023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/4557515134051862023'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2010/12/marbling-torus.html' title='Marbling the Torus'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-1255151208809103664</id><published>2010-12-11T21:17:00.000-08:00</published><updated>2010-12-11T21:17:44.253-08:00</updated><title type='text'>Kjorcevo and Gankino</title><content type='html'>I added two kopanicas (11/8) to my &lt;a href="http://voluntocracy.org/Music/tunes.html"&gt;Folk Tunes page&lt;/a&gt;: &lt;a href="http://voluntocracy.org/Music/tunes.html#Kjorcevo"&gt;Kjorcevo&lt;/a&gt; and &lt;a href="http://voluntocracy.org/Music/tunes.html#Gankino"&gt;Gankino&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-1255151208809103664?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/1255151208809103664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=1255151208809103664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1255151208809103664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1255151208809103664'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2010/12/kjorcevo-and-gankino.html' title='Kjorcevo and Gankino'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-5560372812323700428</id><published>2010-11-29T22:03:00.000-08:00</published><updated>2010-11-29T22:03:08.966-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ink Marbling'/><category scheme='http://www.blogger.com/atom/ns#' term='Incompressible flow'/><title type='text'>Modeling Ink Drops</title><content type='html'>Added to &lt;a href="http://people.csail.mit.edu/jaffer/Marbling/Dropping-Ink"&gt;http://people.csail.mit.edu/jaffer/Marbling/Dropping-Ink&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;... given a point &lt;i&gt;P&lt;/i&gt; and a new ink drop of radius &lt;i&gt;r&lt;/i&gt; centered at &lt;i&gt;C&lt;/i&gt;, move the point radially from &lt;i&gt;C&lt;/i&gt; to:&lt;br /&gt;&lt;br /&gt;&lt;TABLE&gt;&lt;TR&gt;&lt;TD&gt;&lt;I&gt;C&lt;/I&gt; + (&lt;I&gt;P&lt;/I&gt; &amp;minus; &lt;I&gt;C&lt;/I&gt;) &amp;#183; sqrt&lt;TD&gt;&lt;FONT SIZE="+3"&gt;(&lt;/FONT&gt;&lt;TD&gt;1 + &lt;TD ALIGN=CENTER&gt;&lt;I&gt;r&lt;/I&gt;&lt;FONT SIZE=-1&gt;&lt;SUP&gt;2&lt;/SUP&gt;&lt;/FONT&gt;&lt;HR NOSHADE&gt;||&lt;I&gt;P&lt;/I&gt; &amp;minus; &lt;I&gt;C&lt;/I&gt;||&lt;FONT SIZE=-1&gt;&lt;SUP&gt;2&lt;/SUP&gt;&lt;/FONT&gt;&lt;TD&gt;&lt;FONT SIZE="+3"&gt;)&lt;/FONT&gt;&lt;br /&gt;&lt;/TABLE&gt;&lt;br /&gt;  &lt;P&gt;One correspondent complains that, because the divergence of this transform is not zero, it can't be incompressible. &lt;/P&gt;  &lt;P&gt;Divergence is defined for a continuously differentiable vector field.  But this transform is not continuously differentiable around &lt;I&gt;C&lt;/I&gt;; thus its divergence isn't well-defined. The common definition of &lt;dfn&gt;incompressible&lt;/dfn&gt; is in terms of the divergence of a vector field.  For a vector-field where the divergence isn't well-defined, the definition is silent. &lt;/P&gt;  &lt;IMG SRC="http://people.csail.mit.edu/jaffer/Marbling/annuli.png" WIDTH=256 HEIGHT=256 ALIGN=RIGHT ALT=""&gt;&lt;br /&gt;  &lt;P&gt;However, I can show that this transform preserves the area of all neighborhoods not containing &lt;I&gt;C&lt;/I&gt;.  Consider the annulus centered on &lt;I&gt;C&lt;/I&gt; having inner radius sqrt(&lt;I&gt;a&lt;/I&gt;/&lt;i&gt;&amp;pi;&lt;/i&gt;) and outer radius sqrt((&lt;I&gt;a&lt;/I&gt;+&lt;i&gt;b&lt;/i&gt;)/&lt;i&gt;&amp;pi;&lt;/i&gt;).  Its area is &lt;i&gt;b&lt;/i&gt;. &lt;/P&gt;  &lt;P&gt;If ink is injected at &lt;I&gt;C&lt;/I&gt; forming a new circular region centered on &lt;I&gt;C&lt;/I&gt; having area &lt;i&gt;e&lt;/i&gt;, the annulus having area &lt;i&gt;b&lt;/i&gt; will expand to have an inner radius of sqrt((&lt;I&gt;a&lt;/I&gt;+&lt;i&gt;e&lt;/i&gt;)/&lt;i&gt;&amp;pi;&lt;/i&gt;) and an outer radius of sqrt((&lt;I&gt;a&lt;/I&gt;+&lt;i&gt;b&lt;/i&gt;+&lt;i&gt;e&lt;/i&gt;)/&lt;i&gt;&amp;pi;&lt;/i&gt;).  The area of the expanded annulus is still &lt;i&gt;b&lt;/i&gt;.  Note that the expanded annulus is thinner than the original. &lt;/P&gt;  &lt;P&gt;Because this transform is radially symmetric, any annulus slice with sides forming angles with &lt;I&gt;C&lt;/I&gt; of &lt;i&gt;&amp;theta;&lt;/i&gt; and &lt;i&gt;&amp;eta;&lt;/i&gt; will map to the expanded annulus slice between the angles of &lt;i&gt;&amp;theta;&lt;/i&gt; and &lt;i&gt;&amp;eta;&lt;/i&gt;.  Because the annulus and slices can be made arbitrarily small, all neighborhoods not containing &lt;I&gt;C&lt;/I&gt; map to regions having the same area. &lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-5560372812323700428?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/5560372812323700428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=5560372812323700428' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/5560372812323700428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/5560372812323700428'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2010/11/modeling-ink-drops.html' title='Modeling Ink Drops'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-1398979572844697968</id><published>2010-11-29T21:51:00.000-08:00</published><updated>2010-11-29T21:51:18.133-08:00</updated><title type='text'>ICC Profiles</title><content type='html'>From &lt;a href="http://people.csail.mit.edu/jaffer/Color/Dictionaries"&gt;http://people.csail.mit.edu/jaffer/Color/Dictionaries&lt;/A&gt;:&lt;br /&gt;&lt;br /&gt;Section 10.14, "namedColor2Type", of &lt;A HREF="http://color.org/ICC1v42_2006-05.pdf"&gt;Specification ICC.1:2004-10 (Profile version 4.2.0.0)&lt;/A&gt;:&lt;br /&gt;&lt;br /&gt;&lt;BLOCKQUOTE&gt;  The namedColor2Type is a count value and array of structures that provide colour coordinates for 7-bit ASCII colour names.  For each named colour, a PCS and optional device representation of the colour are given.  Both representations are 16-bit values and PCS values shall be relative colorimetric.  The device representation corresponds to the header's "colour space of data" field.  This representation should be consistent with the "number of device components" field in the namedColor2Type.  If this field is 0, device coordinates are not provided.  The PCS representation corresponds to the header's PCS field.  The PCS representation is always provided.  Colour names are fixed-length, 32-byte fields including null termination.  In order to maintain maximum portability, it is strongly recommended that special characters of the 7-bit ASCII set not be used.&lt;br /&gt;&lt;/BLOCKQUOTE&gt;&lt;br /&gt;This namedColor2Type specification dates back to version 3.2 (1995), perhaps earlier.  Only XYZ and L*a*b* colors are supported.  Although version 4.2 defines "multiLocalizedUnicodeType", namedColor2Type is restricted to ASCII (and length less than 32.B).  The colors in this table are specific to the profiled device.  So namedColor2Type appears to be intended for including "spot" colors (such as from Pantone) in a device profile, not for device-independent color dictionaries.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-1398979572844697968?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/1398979572844697968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=1398979572844697968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1398979572844697968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1398979572844697968'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2010/11/icc-profiles.html' title='ICC Profiles'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-5880749628237672319</id><published>2010-11-23T11:05:00.000-08:00</published><updated>2010-11-23T11:05:56.160-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Color'/><category scheme='http://www.blogger.com/atom/ns#' term='Color Science'/><title type='text'>XKCD Color Name Dictionary</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://people.csail.mit.edu/jaffer/Color/Dictionaries#xkcd" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="310" width="306" src="http://people.csail.mit.edu/jaffer/Color/xkcd-rgb.png"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;New on my &lt;a href="http://people.csail.mit.edu/jaffer/Color/Dictionaries"&gt;Color Dictionaries&lt;/a&gt; webpage, &lt;a href="http://people.csail.mit.edu/jaffer/Color/Dictionaries#xkcd"&gt;XKCD Color Name Survey&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;XKCD's 2010 color name survey is similar to the &lt;a HREF="http://people.csail.mit.edu/jaffer/Color/Dictionaries#cne-2007"&gt;Color Naming Experiment&lt;/A&gt;.  Rectangles of RGB colors on a white background were presented for the subject to name.&lt;br /&gt;&lt;br /&gt;Compared with &lt;a HREF="http://people.csail.mit.edu/jaffer/Color/Dictionaries#cne-2007"&gt;Color Naming Experiment&lt;/A&gt;, XKCD has better coverage of the darkest octant.&lt;br /&gt;&lt;br /&gt;The &lt;a HREF="xkcd.pdf"&gt;catalog&lt;/A&gt; compares XKCD with CNE.  Most of the darker shades common to both dictionaries are darker in XKCD. Greens seem to be overrepresented, probably a result of generating samples from a color-space which is perceptually very nonuniform.&lt;br /&gt;&lt;br /&gt;With its larger set of dark colors, the &lt;a HREF="http://people.csail.mit.edu/jaffer/Color/xkcd-rgb.txt"&gt;XKCD Color Name Dictionary&lt;/A&gt; surpasses the &lt;a HREF="http://people.csail.mit.edu/jaffer/Color/Dictionaries#cne-2007"&gt;Color Naming Experiment&lt;/A&gt; dictionary (and X11) for surface colors, although a large portion of its colors will not print faithfully.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-5880749628237672319?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/5880749628237672319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=5880749628237672319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/5880749628237672319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/5880749628237672319'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2010/11/xkcd-color-name-dictionary.html' title='XKCD Color Name Dictionary'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-184575040722105884</id><published>2010-11-09T20:24:00.000-08:00</published><updated>2010-11-09T21:06:47.544-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Color'/><category scheme='http://www.blogger.com/atom/ns#' term='Color Science'/><title type='text'>New Color Dictionary</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://people.csail.mit.edu/jaffer/Color/Dictionaries#fs595c" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="310" width="306" src="http://people.csail.mit.edu/jaffer/Color/fs595c-rgb.png"&gt;&lt;/a&gt;&lt;/div&gt;New on my &lt;a href="http://people.csail.mit.edu/jaffer/Color/Dictionaries"&gt;Color Dictionaries&lt;/a&gt; webpage, &lt;a href="http://people.csail.mit.edu/jaffer/Color/Dictionaries#fs595c"&gt;US Federal Standard 595C&lt;/a&gt;.  Although not a general-purpose source, these colors are of use when rendering post-boxes (15050), school-buses (13415), flags (UN Flag Blue 35250), signs and military clothing and equipment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-184575040722105884?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/184575040722105884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=184575040722105884' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/184575040722105884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/184575040722105884'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2010/11/new-color-dictionary.html' title='New Color Dictionary'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-1005437529588508240</id><published>2010-10-07T11:14:00.000-07:00</published><updated>2010-10-07T11:21:28.366-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='simulation'/><category scheme='http://www.blogger.com/atom/ns#' term='Solar Energy'/><category scheme='http://www.blogger.com/atom/ns#' term='Radiative Cooling'/><title type='text'>Simulating Sun-Shielded Roofs</title><content type='html'>&lt;a href="http://people.csail.mit.edu/jaffer/cool/SolarScreens"&gt;&lt;img src="http://people.csail.mit.edu/jaffer/SimRoof/Tropics/912120TY-covclrf-nrt-vs-dbt-ghi_gt_0.png" align=right alt=""&gt;&lt;/a&gt;&lt;br /&gt;The &lt;a href="http://people.csail.mit.edu/jaffer/SimRoof"&gt;SimRoof&lt;/a&gt; program I have been developing can now simulate the &lt;a href="http://people.csail.mit.edu/jaffer/cool/SolarScreens"&gt;thermal performance of sun-shielding roof covers&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For more, &lt;a href="http://people.csail.mit.edu/jaffer/cool/SolarScreens"&gt;click on the graph&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-1005437529588508240?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/1005437529588508240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=1005437529588508240' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1005437529588508240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1005437529588508240'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2010/10/simulating-sun-shielded-roofs.html' title='Simulating Sun-Shielded Roofs'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-2453905222770016859</id><published>2010-09-06T10:07:00.000-07:00</published><updated>2010-09-07T20:22:28.297-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cool Roof'/><category scheme='http://www.blogger.com/atom/ns#' term='simulation'/><category scheme='http://www.blogger.com/atom/ns#' term='Solar Energy'/><category scheme='http://www.blogger.com/atom/ns#' term='Radiative Cooling'/><title type='text'>Simulating CoolRoofs</title><content type='html'>&lt;a href="http://people.csail.mit.edu/jaffer/cool/CoolRoof#Simulation"&gt;&lt;img src="http://people.csail.mit.edu/jaffer/SimRoof/Tropics/912120TY-nrt-vs-hr.png" align=right&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://people.csail.mit.edu/jaffer/SimRoof"&gt;SimRoof&lt;/a&gt; program I have been developing can now simulate the thermal performance of horizontal &lt;a href="http://en.wikipedia.org/wiki/Cool_roof"&gt;cool-roofs&lt;/a&gt; from the measurements made by &lt;a href="http://www.coolroofs.org/"&gt;coolroofs.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For more, &lt;a href="http://people.csail.mit.edu/jaffer/cool/CoolRoof#Simulation"&gt;click on the graph.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-2453905222770016859?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/2453905222770016859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=2453905222770016859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/2453905222770016859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/2453905222770016859'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2010/09/simulating-coolroofs.html' title='Simulating CoolRoofs'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-7124416442733171345</id><published>2010-08-11T13:21:00.000-07:00</published><updated>2010-08-11T21:55:43.308-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spider'/><category scheme='http://www.blogger.com/atom/ns#' term='photograph'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Argiope aurantia</title><content type='html'>&lt;a href="http://goo.gl/photos/tchf" imageanchor="1" style="clear:right;margin-bottom:1em;margin-left:1em"&gt;&lt;img border="0" src="http://lh6.ggpht.com/_35njvom8s9M/TGL7FMwzukI/AAAAAAAABHQ/MTU7rjETZAs/s512/img_2286.jpg"&gt;&lt;/a&gt;&lt;br /&gt;This spider at about 4.cm is the largest I can remember seeing.  It has an interesting zigzag pattern in its web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-7124416442733171345?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/7124416442733171345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=7124416442733171345' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/7124416442733171345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/7124416442733171345'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2010/08/large-spider.html' title='Argiope aurantia'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_35njvom8s9M/TGL7FMwzukI/AAAAAAAABHQ/MTU7rjETZAs/s72-c/img_2286.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-4927147507080751769</id><published>2010-07-30T08:19:00.001-07:00</published><updated>2010-07-30T08:19:08.508-07:00</updated><title type='text'>chipping-sparrow chicks</title><content type='html'>&lt;div style="text-align: left; padding: 3px;"&gt;&lt;a href="http://www.flickr.com/photos/30176033@N08/4843314809/" title="photo sharing"&gt;&lt;img src="http://farm5.static.flickr.com/4089/4843314809_b4561a5394.jpg" style="border: solid 2px #000000;" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 0.8em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/30176033@N08/4843314809/"&gt;chipping-sparrow chicks&lt;/a&gt;, originally uploaded by &lt;a href="http://www.flickr.com/people/30176033@N08/"&gt;aubrey_jaffer&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;p&gt;Here are three-day-old chipping-sparrow chicks.  The nest is in a yew(?) bush in a neighbor's yard.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-4927147507080751769?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/4927147507080751769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=4927147507080751769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/4927147507080751769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/4927147507080751769'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2010/07/chipping-sparrow-chicks.html' title='chipping-sparrow chicks'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4089/4843314809_b4561a5394_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-2679299432922964683</id><published>2010-05-29T18:59:00.000-07:00</published><updated>2010-05-30T06:50:44.252-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><title type='text'>West meets East</title><content type='html'>2500 years ago, &lt;a href="http://en.wikipedia.org/wiki/Gautama_Buddha"&gt;Buddha&lt;/a&gt;, sage of the (warrior) &lt;a href="http://en.wikipedia.org/wiki/Shakya"&gt;Shakya&lt;/a&gt; clan, taught:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;All is impermanent.&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;65 years ago, the &lt;a href="http://en.wikipedia.org/wiki/Douglas_MacArthur"&gt;warrior sage of the MacArthur clan&lt;/a&gt; answered:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;There is no security, only opportunity.&lt;/b&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-2679299432922964683?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/2679299432922964683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=2679299432922964683' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/2679299432922964683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/2679299432922964683'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2010/05/west-meets-east.html' title='West meets East'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-4130757174990041057</id><published>2010-05-04T21:05:00.001-07:00</published><updated>2010-05-04T21:05:49.669-07:00</updated><title type='text'>Storm clouds</title><content type='html'>&lt;div style="text-align: left; padding: 3px;"&gt;&lt;a href="http://www.flickr.com/photos/30176033@N08/4579853641/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3307/4579853641_f9115d8bc8.jpg" style="border: solid 2px #000000;" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 0.8em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/30176033@N08/4579853641/"&gt;IMG_2160&lt;/a&gt;, originally uploaded by &lt;a href="http://www.flickr.com/people/30176033@N08/"&gt;aubrey_jaffer&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;p&gt;The sun was shining brightly behind thunderheads.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-4130757174990041057?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/4130757174990041057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=4130757174990041057' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/4130757174990041057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/4130757174990041057'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2010/05/storm-clouds.html' title='Storm clouds'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3307/4579853641_f9115d8bc8_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-4538218176738141463</id><published>2010-03-07T18:07:00.000-08:00</published><updated>2010-03-11T16:40:22.577-08:00</updated><title type='text'>Color Name Dictionaries</title><content type='html'>Newly expanded and updated, &lt;a HREF="http://people.csail.mit.edu/jaffer/Color/Dictionaries"&gt;Color-Name Dictionaries&lt;/A&gt; is my most popular webpage, averaging 150 visits per day. It is linked from Wikipedia and elsewhere. Chirag Mehta has created a &lt;a href="http://chir.ag/projects/name-that-color/"&gt;Name that Color&lt;/a&gt; webapp using the &lt;a href="http://people.csail.mit.edu/jaffer/Color/Dictionaries#resene"&gt;Resene Paint Colours&lt;/a&gt; list. There is even a &lt;a href="http://colordictionary.heroku.com/"&gt;Color Dictionary iPhone app&lt;/a&gt; based on the &lt;a href="http://people.csail.mit.edu/jaffer/Color/Dictionaries#nbs-iscc"&gt;NBS-ISCC Centroids&lt;/a&gt; and &lt;a href="http://people.csail.mit.edu/jaffer/Color/Dictionaries#NBS-ISCC-Dictionaries"&gt;Dictionaries of Color Names&lt;/a&gt;.&lt;br /&gt;&lt;p&gt;Unfortunately, &lt;a HREF="http://people.csail.mit.edu/jaffer/Color/Dictionaries"&gt;Color-Name Dictionaries&lt;/A&gt; has not been noticed by the &lt;a href="http://www.x.org/"&gt;X.Org Foundation&lt;/A&gt; nor the &lt;a href="http://w3c.org"&gt;World Wide Web Consortium&lt;/a&gt;, whose products contain deeply flawed color dictionaries from the 1980s.  Instigating change in the face of so much organizational inertia is a daunting task.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-4538218176738141463?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/4538218176738141463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=4538218176738141463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/4538218176738141463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/4538218176738141463'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2010/03/color-name-dictionaries-has-become-my.html' title='Color Name Dictionaries'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-1658662996069762562</id><published>2009-12-30T18:52:00.000-08:00</published><updated>2009-12-31T11:22:13.001-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><title type='text'>Integers-as-Bits versus Bit-Arrays</title><content type='html'>&lt;a HREF="http://srfi.schemers.org/srfi-60/srfi-60.html"&gt;&lt;cite&gt;Integers As Bits&lt;/cite&gt; (SRFI-60)&lt;/A&gt; is motivated this way:&lt;br /&gt;&lt;blockquote&gt;Treating integers as two's-complement strings of bits is an arcane but important domain of computer science.  It is used for:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;hashing;&lt;br /&gt;&lt;li&gt;Galois-field[2] calculations of error-detecting and error-correcting codes;&lt;br /&gt;&lt;li&gt;cryptography and ciphers;&lt;br /&gt;&lt;li&gt;pseudo-random number generation;&lt;br /&gt;&lt;li&gt;register-transfer-level modeling of digital logic designs;&lt;br /&gt;&lt;li&gt;index arithmetic of Fast-Fourier transforms;&lt;br /&gt;&lt;li&gt;packing and unpacking numbers in persistant data structures;&lt;br /&gt;&lt;li&gt;space-filling curves with applications to dimension reduction and sparse multi-dimensional database indexes; and&lt;br /&gt;&lt;li&gt;generating initial values for root-finders and transcendental function algorithms.&lt;br /&gt;&lt;/UL&gt;&lt;/blockquote&gt;Many people's first impulse is to conflate integers with bit-vectors. But this is not useful when we realize that functional operations on immutable integers-as-bits are less inefficient than side-effecting operations on large bit-vectors. &lt;p&gt;Bit-vectors can be used to construct very fast indexes for database tables having millions of records.  To keep the working-set small, creation of megabit arrays is done explicitly; the bit-vector procedures accumulate their results into one of the operands. Functional operations on bignums would be impractical for such an application. &lt;p&gt;Let&lt;dl&gt;&lt;dt&gt;&lt;i&gt;N&lt;/I&gt;&lt;br /&gt;&lt;dd&gt;be the largest number of significant bits in bignum inputs to a bitwise computation; and&lt;br /&gt;&lt;dt&gt;&lt;i&gt;P&lt;/I&gt;&lt;br /&gt;&lt;dd&gt;be the number of binary bitwise operations (LOGAND, LOGOR, ...) in a computation.&lt;br /&gt;&lt;/DL&gt;Consider the computation to find the disjunction of &lt;i&gt;P&lt;/I&gt; bit-vectors (&lt;i&gt;a&lt;/I&gt;&amp;nbsp;OR&amp;nbsp;&lt;i&gt;b&lt;/I&gt;&amp;nbsp;OR&amp;nbsp;&lt;i&gt;c&lt;/I&gt;&amp;nbsp;...). Using (bignum) integers-as-bits, &lt;i&gt;P&lt;/I&gt; bignums will be allocated and &lt;i&gt;P&lt;/I&gt;-1 bignums will be discarded in the course of the computation.  Thus it consumes O(&lt;i&gt;PN&lt;/I&gt;) space and time. &lt;p&gt;Accumulating the result of multiple disjunctions in one bit-vector consumes only O(&lt;i&gt;N&lt;/I&gt;) storage and O(&lt;i&gt;PN&lt;/I&gt;) time. &lt;p&gt;The worst case for bit-vector accumulation is a full binary tree of 2&lt;sup&gt;&lt;i&gt;q&lt;/I&gt;&lt;/sup&gt; bit-vectors with &lt;i&gt;P&lt;/I&gt;=2&lt;sup&gt;&lt;i&gt;q&lt;/I&gt;&lt;/sup&gt;-1 binary operations.  By reusing temporary bit-vectors, storage can be limited to O(&lt;i&gt;Nq&lt;/I&gt;)=O(&lt;i&gt;N&lt;/I&gt;log&lt;i&gt;P&lt;/I&gt;) and O(&lt;i&gt;PN&lt;/I&gt;) time. &lt;p&gt;A clever optimizer could be written to convert functional bitwise expressions into accumulating bit-vector forms, but I haven't found functional bitwise operators to be easier to work with than imperative bit-vector operators for database indexing. &lt;p&gt;In addition to the generic &lt;a HREF="http://people.csail.mit.edu/jaffer/slib_7.html#SEC193"&gt;Array&lt;/A&gt; and &lt;a HREF="http://people.csail.mit.edu/jaffer/slib_7.html#SEC195"&gt;Array Mapping&lt;/A&gt; procedures of &lt;a HREF="http://people.csail.mit.edu/jaffer/SLIB"&gt;SLIB&lt;/a&gt;, the following procedures in &lt;a HREF="http://people.csail.mit.edu/jaffer/SCM"&gt;SCM&lt;/a&gt; were written to support the use of bit-vectors as database indexes.  This technique works best for indexes having only a few indexed values (with many records per value).  One bit-vector is devoted to each indexed value for a field; a 1-bit indicates that the corresponding record has that value in that field.  Indexes for values which are sparse can instead be encoded by vectors of integers, each integer indicating the record having that value in that field.  Indexes coded in these ways allow fast calculation of complicated queries. &lt;p&gt;&lt;h2&gt;&lt;a HREF="http://people.csail.mit.edu/jaffer/scm_5.html#SEC76"&gt;5.4.3 Bit Vectors&lt;/A&gt;&lt;/H2&gt;&lt;p&gt;Bit vectors can be written and read as a sequence of &lt;code&gt;0&lt;/CODE&gt;s and &lt;code&gt;1&lt;/CODE&gt;s prefixed by &lt;code&gt;#*&lt;/CODE&gt;. &lt;pre&gt;#1At(#f #f #f #t #f #t #f) =&gt; #*0001010&lt;br /&gt;&lt;/PRE&gt;&lt;p&gt;Some of these operations will eventually be generalized to other uniform-arrays. &lt;p&gt;&lt;dl&gt;&lt;dt&gt;&lt;u&gt;Function:&lt;/U&gt; &lt;b&gt;bit-count&lt;/B&gt; &lt;i&gt;bool bv&lt;/I&gt;&lt;br /&gt;&lt;dd&gt; Returns the number of occurrences of &lt;var&gt;bool&lt;/VAR&gt; in &lt;var&gt;bv&lt;/VAR&gt;.&lt;br /&gt;&lt;/DL&gt;&lt;p&gt;&lt;dl&gt;&lt;dt&gt;&lt;u&gt;Function:&lt;/U&gt; &lt;b&gt;bit-position&lt;/B&gt; &lt;i&gt;bool bv k&lt;/I&gt;&lt;br /&gt;&lt;dd&gt; Returns the minimum index of an occurrence of &lt;var&gt;bool&lt;/VAR&gt; in &lt;var&gt;bv&lt;/VAR&gt; which is at least &lt;var&gt;k&lt;/VAR&gt;.  If no &lt;var&gt;bool&lt;/VAR&gt; occurs within the specified range &lt;code&gt;#f&lt;/CODE&gt; is returned.&lt;br /&gt;&lt;/DL&gt;&lt;p&gt;&lt;dl&gt;&lt;dt&gt;&lt;u&gt;Function:&lt;/U&gt; &lt;b&gt;bit-invert!&lt;/B&gt; &lt;i&gt;bv&lt;/I&gt;&lt;br /&gt;&lt;dd&gt; Modifies &lt;var&gt;bv&lt;/VAR&gt; by replacing each element with its negation.&lt;br /&gt;&lt;/DL&gt;&lt;p&gt;&lt;dl&gt;&lt;dt&gt;&lt;u&gt;Function:&lt;/U&gt; &lt;b&gt;bit-set*!&lt;/B&gt; &lt;i&gt;bv uve bool&lt;/I&gt;&lt;br /&gt;&lt;dd&gt;If &lt;var&gt;uve&lt;/VAR&gt; is a &lt;font COLOR=red&gt;bit-vector, then &lt;/FONT&gt;&lt;var&gt;bv&lt;/VAR&gt; and &lt;var&gt;uve&lt;/VAR&gt; must be of the same length.  If &lt;var&gt;bool&lt;/VAR&gt; is &lt;code&gt;#t&lt;/CODE&gt;, &lt;font COLOR=red&gt;then &lt;/FONT&gt;&lt;var&gt;uve&lt;/VAR&gt; is OR'ed into &lt;var&gt;bv&lt;/VAR&gt;; If &lt;var&gt;bool&lt;/VAR&gt; is &lt;code&gt;#f&lt;/CODE&gt;, the inversion of &lt;var&gt;uve&lt;/VAR&gt; is AND'ed into &lt;var&gt;bv&lt;/VAR&gt;.&lt;br /&gt;&lt;p&gt;If &lt;var&gt;uve&lt;/VAR&gt; is a unsigned integer &lt;font COLOR=red&gt;vector, then &lt;/FONT&gt;all the elements of &lt;var&gt;uve&lt;/VAR&gt; must be between 0 and the &lt;code&gt;LENGTH&lt;/CODE&gt; of &lt;var&gt;bv&lt;/VAR&gt;.  The bits of &lt;var&gt;bv&lt;/VAR&gt; corresponding to the indexes in &lt;var&gt;uve&lt;/VAR&gt; are set to &lt;var&gt;bool&lt;/VAR&gt;.&lt;br /&gt;&lt;p&gt;The return value is unspecified.&lt;br /&gt;&lt;/DL&gt;&lt;p&gt;&lt;dl&gt;&lt;dt&gt;&lt;u&gt;Function:&lt;/U&gt; &lt;b&gt;bit-count*&lt;/B&gt; &lt;i&gt;bv uve bool&lt;/I&gt;&lt;br /&gt;&lt;dd&gt;Returns&lt;br /&gt;&lt;pre&gt;(bit-count (bit-set*! (if bool bv (bit-invert! bv)) uve #t) #t).&lt;br /&gt;&lt;/PRE&gt;&lt;p&gt;&lt;var&gt;bv&lt;/VAR&gt; is not modified.&lt;br /&gt;&lt;/DL&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-1658662996069762562?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/1658662996069762562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=1658662996069762562' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1658662996069762562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1658662996069762562'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2009/12/integers-as-bits-versus-bit-arrays.html' title='Integers-as-Bits versus Bit-Arrays'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-7678876201673253965</id><published>2009-12-15T15:18:00.000-08:00</published><updated>2009-12-15T15:20:02.336-08:00</updated><title type='text'>Schlep Toolchains</title><content type='html'>&lt;a HREF="http://people.csail.mit.edu/jaffer/Schlep"&gt;Schlep Toolchains&lt;/A&gt; documents and distributes the hyper-cross-platform technology used to create the WB B-tree database libraries and new implementation of Water &lt;http://waterlanguage.org/&gt; for C, C#, and Java from source written in a subset of Scheme.&lt;br /&gt;&lt;p&gt;One might assume that in order for Schlep-dialect code to map to these three languages [C, C#, and Java], the Schlep-dialect must manifest the worst limitations of each language; but translation can actually rectify some of these limitations.&lt;br /&gt;&lt;p&gt;If I had to pick one practical feature of Scheme which elevates it above other languages, it would be internal definitions.  The Algorithmic Language Scheme allows procedure definitions (using &lt;code&gt;define&lt;/code&gt;, &lt;code&gt;letrec&lt;/code&gt;, and named-&lt;code&gt;let&lt;/code&gt;) inside of other procedures, which none of C, C#, or Java does.  Internal definitions allow calls of internal procedures with a small number of arguments to replace the common alternatives:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;duplication of code, or&lt;br /&gt;&lt;li&gt;top-level definitions and calls passing large numbers of arguments.&lt;br /&gt;&lt;/ul&gt;C and C# have a &lt;samp&gt;`goto'&lt;/samp&gt; statement, enabling Schlep to emulate calling of internal-procedures &lt;i&gt;in the tail position&lt;/i&gt; using some variable assignments (sometimes including temporary variable binding to emulate simultaneous assignment) followed by a &lt;code&gt;goto&lt;/code&gt; statement.  The restriction to the tail-position does not allow internal recursion other than tail-recursion; but this facilitates use of internal procedures in many situations which would otherwise force less desirable practices. &lt;p&gt;Java lacks a &lt;samp&gt;`goto'&lt;/samp&gt; statement.  Tail-called internal procedures are instead implemented using &lt;code&gt;while&amp;nbsp;(true)&lt;/code&gt;, &lt;code&gt;continue&lt;/code&gt;, and &lt;code&gt;break&lt;/code&gt; with labels.  The resulting Java code is not as readable as the original Scheme-dialect; but that loss in clarity is balanced by greater expressive power. &lt;p&gt;&lt;a HREF="http://people.csail.mit.edu/jaffer/Schlep/Schlep-example"&gt;Schlep-example&lt;/A&gt; gives an example of a procedure with an internal procedure and how Schlep translates this procedure into C, C#, and Java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-7678876201673253965?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/7678876201673253965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=7678876201673253965' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/7678876201673253965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/7678876201673253965'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2009/12/schlep-toolchains.html' title='Schlep Toolchains'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-2529191396475040052</id><published>2009-11-14T21:33:00.000-08:00</published><updated>2009-11-15T14:50:21.612-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Map'/><category scheme='http://www.blogger.com/atom/ns#' term='Scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><title type='text'>Implicitly Concurrent `map'</title><content type='html'>In my first &lt;a href="http://voluntocracy.blogspot.com/2009/10/implicit-concurrency.html"&gt;Implicit Concurrency&lt;/a&gt; post I stated that&lt;br /&gt;&lt;blockquote&gt;The &lt;a href="http://people.csail.mit.edu/jaffer/Scheme"&gt;Scheme Reports&lt;/a&gt; mandate an unspecified-but-serial evaluation order for arguments to procedure-calls, &lt;code&gt;`let'&lt;/code&gt; bindings, &lt;code&gt;`letrec'&lt;/code&gt; bindings, &lt;code&gt;`do'&lt;/code&gt; bindings, and &lt;code&gt;`map'&lt;/code&gt;.&lt;br /&gt;&lt;/blockquote&gt;The only RnRS mention of concurrency appears in the description of &lt;a href="http://people.csail.mit.edu/jaffer/r5rs_6.html#SEC28"&gt;Procedure call&lt;/a&gt;:&lt;br /&gt;&lt;BLOCKQUOTE&gt;&lt;EM&gt;Note:&lt;/EM&gt; Although the order of evaluation is otherwise unspecified, the effect of any &lt;b&gt;concurrent&lt;/b&gt; evaluation of the operator and operand expressions is constrained to be consistent with some sequential order of evaluation. The order of evaluation may be chosen differently for each procedure call.&lt;br /&gt;&lt;/BLOCKQUOTE&gt;&lt;p&gt;Because &lt;code&gt;`do'&lt;/code&gt;, &lt;code&gt;`let'&lt;/code&gt;, and &lt;code&gt;`letrec'&lt;/code&gt; bindings are defined in terms of (&lt;code&gt;`lambda'&lt;/code&gt; and) procedure calls, this restriction applies to them as well.&lt;br /&gt;&lt;p&gt;But the Reports are silent as to the evaluation order for &lt;code&gt;`map'&lt;/code&gt;; so it shouldn't have been included in my list.&lt;br /&gt;&lt;p&gt;If the Implicitly Concurrent future is already here, why is it a secret?  Because misunderstanding of &lt;code&gt;`map'&lt;/code&gt; evaluation order is widespread; in &lt;a href="http://www.r6rs.org/r6rs-editors/2006-June/001395.html"&gt;[R6RS] Will `map' order remain unspecified?&lt;/a&gt;, W. Clinger writes:&lt;br /&gt;&lt;blockquote&gt;... expecting map to process its elements from left to right has been perhaps the most common order-of-evaluation bug in R5RS programs.&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;There is a deep connection between concurrent &lt;code&gt;`map'&lt;/code&gt; and the other implicit concurrencies.  If a metacircular-interpreter uses a concurrent &lt;code&gt;`map'&lt;/code&gt; to evaluate arguments to procedure calls, then that interpreter's procedure calls will also be concurrent.&lt;br /&gt;&lt;p&gt;Implicit concurrency can thus be viewed as a basic property of a computing platform.  A concurrently-repeatable metacircular-interpreter can be written without using explicit-concurrency primitives which is concurrent when run by a concurrent (implicitly concurrent) implementation and serial when run by a serial implementation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-2529191396475040052?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/2529191396475040052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=2529191396475040052' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/2529191396475040052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/2529191396475040052'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2009/11/implicit-concurrency.html' title='Implicitly Concurrent `map&apos;'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-1877257616276038376</id><published>2009-10-25T20:23:00.000-07:00</published><updated>2009-11-14T13:09:24.265-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><title type='text'>Implicit Concurrency</title><content type='html'>There has been a lot of concern over how to harness the speed potential of multi-core processors without a disruptive reinvention of software engineering.  Implicit concurrency is a solution.&lt;br /&gt;&lt;p&gt;The specifications of the algorithmic languages &lt;a href="http://en.wikipedia.org/wiki/C_(programming_language)"&gt;C&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/C%2B%2B"&gt;C++&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Objective_Caml"&gt;OCAML&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Scheme_(programming_language)"&gt;Scheme&lt;/a&gt; deliberately leave unspecified the order of evaluation of arguments to procedure-calls.  If coders are to write programs which display the same behavior when (compiled and) run on different platforms, an easily mastered discipline concerning side-effects of argument expressions must be practiced.&lt;br /&gt;&lt;p&gt;It turns out that this discipline is very similar to that needed in order to write programs which display the same behavior even with concurrent evaluation of arguments (and on different platforms).&lt;br /&gt;&lt;p&gt;Changing from unspecified-order-of-evaluation-of-arguments to concurrent-envaluation-of-arguments in these language specifications would enable them to be implicitly-concurrent:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;able to spawn concurrent subtasks at many points in programs,&lt;br /&gt;&lt;li&gt;produce the same result whether run in 1 core (or thread) or 1000,&lt;br /&gt;&lt;li&gt;involve no new language primitives, and&lt;br /&gt;&lt;li&gt;require no complicated code analysis.&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;&lt;h2&gt;Terminology&lt;/h2&gt;&lt;dl&gt;&lt;dt&gt;closed-expression&lt;br /&gt;&lt;dd&gt;Let the term closed-expression designate&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a Scheme expression and&lt;br /&gt;&lt;li&gt;all state accessible from the value of each free variable in the expression or free in any procedures called from the expression or procedures they call (this can include files).&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;&lt;dd&gt;After the closed-expression is evaluated, the resulting state (or output) is:   &lt;ul&gt;&lt;li&gt;the returned value or values,&lt;br /&gt;&lt;li&gt;all state accessible from the value of each free variable in the expression or free in any procedures called from the expression or procedures they call, and&lt;br /&gt;&lt;li&gt;files written by evaluating the expression.&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;&lt;dt&gt;singly-terminate&lt;br /&gt;&lt;dd&gt;Let the term singly-terminate designate the condition of the evaluation of a closed-expression that:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;returns once and only once and&lt;br /&gt;&lt;li&gt;does not let any continuations escape from the dynamic extent of evaluating the closed expression.&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;&lt;dt&gt;portably-repeatable&lt;br /&gt;&lt;dd&gt;Let the term portably-repeatable designate those closed-expressions which singly-terminate and produce identical output for any serial evaluation order allowed by the Scheme report.&lt;br /&gt;&lt;/dl&gt;&lt;p&gt;The Scheme Reports mandate an unspecified serial evaluation order for arguments to procedure-calls, &lt;code&gt;`let'&lt;/code&gt; bindings, &lt;code&gt;`letrec'&lt;/code&gt; bindings, &lt;code&gt;`do'&lt;/code&gt; bindings, and &lt;code&gt;`map'&lt;/code&gt;. &lt;p&gt;A caveat to portably-repeatable is the non-associativity of floating-point operations.  For the extent of this discussion, assume that &lt;code&gt;`+'&lt;/code&gt;, &lt;code&gt;`*'&lt;/code&gt;, &lt;code&gt;`-'&lt;/code&gt;, and &lt;code&gt;`/'&lt;/code&gt; with more than 2 arguments are left-associative. &lt;p&gt;&lt;dl&gt;&lt;dt&gt;concurrently-repeatable&lt;br /&gt;&lt;dd&gt;Let the term concurrently-repeatable designate those closed-expressions which singly-terminate and produce identical output for any concurrent evaluation order where the Scheme report mandates an unspecified serial evaluation order.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;dt&gt;Implicitly-Concurrent-Scheme&lt;br /&gt;&lt;dd&gt;Let Implicitly-Concurrent-Scheme (ICS) designate an implementation which allows concurrent evaluation anywhere the Scheme report mandates an unspecified serial evaluation order.&lt;br /&gt;&lt;/dl&gt;&lt;p&gt;&lt;h2&gt;Theorems&lt;/h2&gt;&lt;dl&gt;&lt;dt&gt;Theorem 1&lt;br /&gt;&lt;dd&gt;All singly-terminating purely functional closed-expressions (including procedures they call) are both portably-repeatable and concurrently-repeatable.&lt;br /&gt;&lt;/dl&gt;This is because purely functional (sub-)expressions have no side effects; hence they cannot effect the execution of other purely functional (sub-)expressions. &lt;p&gt;&lt;dl&gt;&lt;dt&gt;Theorem 2&lt;br /&gt;&lt;dd&gt;All concurrently-repeatable closed-expressions are portably-repeatable.&lt;br /&gt;&lt;/dl&gt;For a given closed-expression, its serial evaluation orders are a subset of its concurrent evaluation orders. &lt;p&gt;&lt;dl&gt;&lt;dt&gt;Theorem 3&lt;br /&gt;&lt;dd&gt;A single threaded, non-preemptive &lt;a href="http://people.csail.mit.edu/jaffer/Scheme"&gt;RnRS&lt;/a&gt; (Scheme) implementation is an ICS implementation.&lt;br /&gt;&lt;/dl&gt;This is because concurrently-repeatable implies portably-repeatable by Theorem 2.  &lt;p&gt;&lt;h2&gt;The Programmer Contract&lt;/h2&gt;The programmer who wants to write closed-expressions which have repeatable behavior across platforms must currently write portably-repeatable code (among other constraints). &lt;p&gt;There are relatively few portably-repeatable expressions which are not also concurrently-repeatable.  And it is avoiding these few expressions which represents the change of habit for coders.  The few expressions involve the potential for multiple threads to have side-effects on shared state. &lt;p&gt;Examples of portably-repeatable expressions which are not concurrently-repeatable are symmetric calls of a pseudo-random-number-generator having shared state: &lt;pre&gt;(begin&lt;br /&gt;  (require 'random)&lt;br /&gt;  (let ((rs (make-random-state "seed1")))&lt;br /&gt;    (+ (random 9 rs) (random 9 rs))))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Notice that the expressions: &lt;pre&gt;(- (random 9 rs) (random 9 rs))&lt;br /&gt;&lt;/pre&gt;and &lt;pre&gt;(+ (random 9 rs) (random 19 rs))&lt;br /&gt;&lt;/pre&gt;are not portably-repeatable; for asymmetrical functions (or asymmetrical argument expressions), the order of calls to &lt;code&gt;`random'&lt;/code&gt; causes different results to be returned. &lt;p&gt;A concurrently-repeatable version of the random sum can be written: &lt;pre&gt;(begin&lt;br /&gt;  (require 'random)&lt;br /&gt;  (let* ((rs (make-random-state "seed1"))&lt;br /&gt;         (rnd1 (random 9 rs)))&lt;br /&gt;    (+ rnd1 (random 9 rs))))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The &lt;a href="http://people.csail.mit.edu/jaffer/SLIB"&gt;SLIB&lt;/a&gt; &lt;a href="http://people.csail.mit.edu/jaffer/slib_5.html#SEC118"&gt;random&lt;/a&gt; module detects and signals an error if &lt;code&gt;`random'&lt;/code&gt; is called concurrently or reentrantly on the same random-state byte-array.  A concurrent implementation can thus sometimes catch concurrently-repeatable violations. &lt;p&gt;The Scheme Reports also leave the order of evaluation unspecified for &lt;code&gt;`map'&lt;/code&gt;.  Examples of portably-repeatable &lt;code&gt;`map'&lt;/code&gt; expressions which are not concurrently-repeatable have side-effecting (set!)  shared-state (cnt) within a &lt;code&gt;`map'&lt;/code&gt;ped procedure: &lt;pre&gt;(let ((cnt 0))&lt;br /&gt;  (let ((res (map&lt;br /&gt;              (lambda (x)&lt;br /&gt;                (if (negative? x) (set! cnt (+ 1 cnt)))&lt;br /&gt;                (* x x))&lt;br /&gt;              '(-1 2 -3 4 -5 6))))&lt;br /&gt;    (list res cnt)))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Such code can be made concurrently-repeatable by separating the functional and side-effecting parts:  &lt;pre&gt;(let ((cnt 0) (lst '(-1 2 -3 4 -5 6)))&lt;br /&gt;  (for-each (lambda (x)&lt;br /&gt;              (if (negative? x) (set! cnt (+ 1 cnt))))&lt;br /&gt;            lst)&lt;br /&gt;  (list (map&lt;br /&gt;         (lambda (x) (* x x))&lt;br /&gt;         lst)&lt;br /&gt;        cnt))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Or the non-functional part can be made functional: &lt;pre&gt;(let ((lst '(-1 2 -3 4 -5 6)))&lt;br /&gt;  (list (map (lambda (x) (* x x)) lst)&lt;br /&gt;        (apply + (map (lambda (x) (if (negative? x) 1 0))&lt;br /&gt;                      lst))))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Or the functional part can be accumulated in the serial &lt;code&gt;`for-each'&lt;/code&gt;.  This code is forced to run serially by the &lt;code&gt;`for-each'&lt;/code&gt;; so it will not gain a speed benefit from concurrent evaluation:  &lt;pre&gt;(let ((cnt 0)&lt;br /&gt;      (lst '(-1 2 -3 4 -5 6))&lt;br /&gt;      (nst '()))&lt;br /&gt;  (for-each (lambda (x)&lt;br /&gt;              (if (negative? x) (set! cnt (+ 1 cnt)))&lt;br /&gt;              (set! nst (cons (* x x) nst)))&lt;br /&gt;            lst)&lt;br /&gt;  (list (reverse nst) cnt))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;One could also write a serial &lt;code&gt;`map*'&lt;/code&gt; procedure to do the same. &lt;p&gt;&lt;h3&gt;Continuations&lt;/h3&gt;This expression is portably-repeatable but not concurrently-repeatable because it would return twice:  &lt;pre&gt;(call-with-current-continuation&lt;br /&gt; (lambda (return)&lt;br /&gt;   (/ (return 0) (return 0))))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;This expression is neither portably-repeatable nor concurrently-repeatable because whether it returns 0 or 1 depends on the order of evaluation of arguments: &lt;pre&gt;(call-with-current-continuation&lt;br /&gt; (lambda (return)&lt;br /&gt;   (/ (return 0) (return 1))))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;But escape continuations can be used in concurrently-repeatable ways: &lt;pre&gt;(define (careful-div n d)&lt;br /&gt;  (call-with-current-continuation&lt;br /&gt;   (lambda (return)&lt;br /&gt;     (/ n (if (zero? d) (return #f) d)))))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;h2&gt;The Implementation Contract&lt;/h2&gt;When encountering an expression &lt;code&gt;(list (u) (v))&lt;/code&gt;, a parallelizing RnRS implementation must commence an analysis of &lt;code&gt;u&lt;/code&gt; and &lt;code&gt;v&lt;/code&gt; and everything they call, possibly including other modules, to determine whether any side effects to shared state might depend on concurrent evaluation order. This is the same difficulty that any parallelizing &lt;a href="http://en.wikipedia.org/wiki/C_(programming_language)"&gt;C&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Fortran"&gt;Fortran&lt;/a&gt; compiler faces.  Such an analysis cannot be exhaustive because there is no guarantee that the analysis will terminate (&lt;a href="http://en.wikipedia.org/wiki/Halting_problem"&gt;Halting Problem&lt;/a&gt;). &lt;p&gt;When a parallelizing Implicitly-Concurrent-Scheme compiler &lt;em&gt;or interpreter&lt;/em&gt; encounters &lt;code&gt;(list&amp;nbsp;(u)&amp;nbsp;(v))&lt;/code&gt;, it immediately knows that it can delegate the computation of &lt;code&gt;(u)&lt;/code&gt; and &lt;code&gt;(v)&lt;/code&gt; to distinct threads.  The Programmer Contract to write concurrently-repeatable code insures that no side-effects to shared state will depend on concurrent evaluation order. &lt;p&gt;&lt;h3&gt;Exceptions&lt;/h3&gt;When an exception is raised in one thread evaluating an argument in concurrently-repeatable code, it does not effect the evaluation of the other arguments because its side-effects do not interact with the threads of the other arguments.  Whether the handler returns or not determines whether the procedure is applied to the result of those argument evaluations.  &lt;p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;Implicitly-Concurrent-Scheme is a minor modification to Scheme Report semantics which allows, but does not require, both interpreters and compilers to simply parallelize the execution of programs.  No new primitives are introduced.  In order to write ICS programs which produce the same output irrespective of concurrent evaluation order requires a regime very similar to the that required of RnRS programs to produce the same output irrespective of serial evaluation order.&lt;p&gt;&lt;h2&gt;Bibliography&lt;/h2&gt;&lt;dl&gt;&lt;dd&gt;[Feeley]&lt;dt&gt;Marc Feeley,&lt;br /&gt;&lt;a HREF="http://www.iro.umontreal.ca/~feeley/papers/futures.ps.gz"&gt;&lt;i&gt;An Efficient and General Implementation&lt;br /&gt;of Futures on Large Scale Shared-Memory Multiprocessors&lt;/I&gt;&lt;/A&gt;,&lt;br /&gt;PhD thesis, Brandeis University, April 1993, 213 pages.&lt;br /&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-1877257616276038376?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/1877257616276038376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=1877257616276038376' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1877257616276038376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1877257616276038376'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2009/10/implicit-concurrency.html' title='Implicit Concurrency'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-3853125405997578146</id><published>2009-10-25T09:09:00.001-07:00</published><updated>2009-10-25T09:43:15.893-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Climate change'/><title type='text'>Energy Revolution Rally at Minute Man National Historic Park</title><content type='html'>&lt;div style="text-align: left; padding: 3px;"&gt;&lt;a href="http://www.flickr.com/photos/350org/4040307651/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3492/4040307651_9f8ef1cb94.jpg" style="border: solid 2px #000000;" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 0.8em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/350org/4040307651/"&gt;Concord, MA United States Photo #3 Showing March to Minute Man Statue&lt;/a&gt;, originally uploaded by &lt;a href="http://www.flickr.com/people/350org/"&gt;350.org&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;p&gt;October 24, 2009.  Part of &lt;a href="http://350.org"&gt;350.org&lt;/a&gt;'s&lt;br /&gt;&lt;a href="http://www.350.org/actions"&gt;&lt;i&gt;International Day of Climate Action&lt;/i&gt;&lt;/a&gt;,&lt;br /&gt;the &lt;a href="http://bedfordminutemancompany.org/"&gt;Bedford Minuteman Company&lt;/a&gt; led the&lt;br /&gt;&lt;a href="http://www.350.org/o24/report/12204"&gt;&lt;i&gt;Energy Revolution Rally&lt;/i&gt;&lt;/a&gt; march at&lt;br /&gt;&lt;a href="http://www.nps.gov/mima"&gt;Minute Man National Historic Park&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-3853125405997578146?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/3853125405997578146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=3853125405997578146' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/3853125405997578146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/3853125405997578146'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2009/10/concord-ma-united-states-photo-3.html' title='Energy Revolution Rally at Minute Man National Historic Park'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3492/4040307651_9f8ef1cb94_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-6334489991502305827</id><published>2009-10-21T11:14:00.000-07:00</published><updated>2009-10-21T11:15:02.038-07:00</updated><title type='text'></title><content type='html'>&lt;a href='http://4.bp.blogspot.com/_35njvom8s9M/St9PpJN6FiI/AAAAAAAAA5I/8lbQrXXa2vM/s1600-h/IMG_2019.JPG'&gt;&lt;img src='http://4.bp.blogspot.com/_35njvom8s9M/St9PpJN6FiI/AAAAAAAAA5I/8lbQrXXa2vM/s320/IMG_2019.JPG' border='0' alt=''style='clear:both;float:left; margin:0px 10px 10px 0;' /&gt;&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Noticed these Tricyrtis blooming after our first snowfall.&lt;div style='clear:both; text-align:LEFT'&gt;&lt;a href='http://picasa.google.com/blogger/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' style='border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;' align='middle' border='0' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-6334489991502305827?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/6334489991502305827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=6334489991502305827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/6334489991502305827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/6334489991502305827'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2009/10/noticed-these-tricyrtis-blooming-after_21.html' title=''/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_35njvom8s9M/St9PpJN6FiI/AAAAAAAAA5I/8lbQrXXa2vM/s72-c/IMG_2019.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-5806616897584809280</id><published>2009-10-17T16:31:00.000-07:00</published><updated>2009-10-17T19:23:41.680-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Climate change'/><category scheme='http://www.blogger.com/atom/ns#' term='Science'/><title type='text'>Climate Change: Anthropogenesis Doesn't Matter</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Climate_change_denial"&gt;Climate change deniers&lt;/a&gt; express a lot of concern over whether climate change is caused by human activities or not.  Implicit in asking whether climate change is &lt;a href="http://en.wikipedia.org/wiki/Anthropogenic"&gt;anthropogenic&lt;/a&gt; is an assumption that if climate change isn't caused by humans, then nothing can or should be done to reverse it.&lt;br /&gt;&lt;br /&gt;That assumption is absurd; and only serves to derail discussion of how to combat climate change.  To see how absurd it is, consider the case of asteroids.  If an asteroid large enough to end life-as-we-know-it were discovered to be on a trajectory to impact the earth, it would not be anthropogenic.  Should we then not attempt to deflect it from catastrophe?&lt;br /&gt;&lt;br /&gt;The important question is: How can we slow or reverse climate change and the destruction of ocean reefs from increased atmospheric CO2?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-5806616897584809280?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/5806616897584809280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=5806616897584809280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/5806616897584809280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/5806616897584809280'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2009/10/climate-change-anthropogenesis-doesnt.html' title='Climate Change: Anthropogenesis Doesn&apos;t Matter'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-3802906771728308559</id><published>2009-10-12T12:42:00.000-07:00</published><updated>2009-11-01T10:29:18.957-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Space-filling curves'/><category scheme='http://www.blogger.com/atom/ns#' term='Mathematics'/><category scheme='http://www.blogger.com/atom/ns#' term='Biology'/><title type='text'>Biological Space-Filling Curves</title><content type='html'>My (Aubrey Jaffer) &lt;a href="http://people.csail.mit.edu/jaffer/Geometry/MDSFC"&gt;work on multidimensional space-filling curves&lt;/a&gt; is acknowledged in October 9th &lt;a href="http://www.sciencemag.org/"&gt;Science&lt;/a&gt;'s cover article: "&lt;a href="http://www.sciencemag.org/cgi/content/abstract/326/5950/289"&gt;Comprehensive Mapping of Long-Range Interactions Reveals Folding Principles of the Human Genome&lt;/a&gt;".  &lt;br /&gt;See &lt;a href="http://www.sciencemag.org/cgi/content/full/326/5950/289/DC1"&gt;supplemental-material link&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-3802906771728308559?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/3802906771728308559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=3802906771728308559' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/3802906771728308559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/3802906771728308559'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2009/10/my-aubrey-jaffer-work-on.html' title='Biological Space-Filling Curves'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-3972648515094708042</id><published>2009-10-07T10:36:00.000-07:00</published><updated>2011-08-12T13:58:57.397-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer Science'/><title type='text'>Search-paths considered harmful</title><content type='html'>It has been my experience that dynamic search-paths are disastrous for libraries on commercial and educational computer networks.  The search-paths at these sites seem to only grow; paths to newer versions are placed ahead of older versions.  It is not uncommon for half of the directories in a path to refer to non-existent directories or non-functioning host machines!  The timeouts from hosed or inaccessible networked-file-systems can balloon into minutes the startup time for programs.&lt;br /&gt;&lt;br /&gt;Furthermore, transient router outages can cause incompatible versions of libraries to be loaded which, in the Scheme or Lisp case, may not be noticed until the program has run for hours; but more likely will just cause a mysterious failure.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://people.csail.mit.edu/jaffer/SLIB"&gt;SLIB Scheme Library&lt;/a&gt;'s solution to this problem is to have an explicit command [(require 'new-catalog)], typically run after installations, write to a file an association list of features and resolved pathnames.  SLIB sessions read this file and thereafter have instantaneous latency to library paths.&lt;br /&gt;&lt;br /&gt;If the network can't reach a particular file, the session fails immediately or after the first timeout rather than conducting covert experiments on library version compatibility.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-3972648515094708042?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/3972648515094708042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=3972648515094708042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/3972648515094708042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/3972648515094708042'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2009/10/search-paths-considered-harmful.html' title='Search-paths considered harmful'/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-1633641221387543413</id><published>2009-08-26T08:11:00.000-07:00</published><updated>2009-11-01T10:36:41.183-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Phishing'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet Fraud'/><title type='text'></title><content type='html'>The fake Fidelity login page on &lt;a href="http://www.secureonline.fidelity.us.tc/"&gt;http://www.secureonline.fidelity.us.tc/&lt;/a&gt; was taken down yesterday.   It would be interesting to know what precipitated the change.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-1633641221387543413?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/1633641221387543413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=1633641221387543413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1633641221387543413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/1633641221387543413'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2009/08/fake-fidelity-login-page-on-httpwww.html' title=''/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6806118251241543344.post-4014954851319295548</id><published>2009-08-24T18:11:00.000-07:00</published><updated>2009-11-01T10:36:02.767-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Phishing'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet Fraud'/><title type='text'></title><content type='html'>"Interdots International" is phishing for Fidelity passwords through a subdomain of their's:&lt;br /&gt;&lt;a href="http://www.secureonline.fidelity.us.tc/"&gt;http://www.secureonline.fidelity.us.tc/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dic.academic.ru/dic.nsf/enwiki/2392662"&gt;http://dic.academic.ru/dic.nsf/enwiki/2392662&lt;/a&gt;&lt;br /&gt;says that this organization runs a diploma mill  named Concordia College and University.&lt;br /&gt;&lt;br /&gt;Interdots' spam manage to evade detection by both Symantec-BrightMail-Gateway and Google-Mail.&lt;br /&gt;&lt;br /&gt;Domain Name:               us.tc&lt;br /&gt;&lt;br /&gt;Registrant, Technical Contact, Admin. Contact&lt;br /&gt;Interdots International&lt;br /&gt;c/o Marius T Strasser, P.O. Box 51, Nea Michaniona  , GR-57004&lt;br /&gt;Greece&lt;br /&gt;E-mail:                  ms@interdots.com&lt;br /&gt;Phone:                   ++1-253-323-0927&lt;br /&gt;Fax:                     ++1-253-323-0927&lt;br /&gt;&lt;br /&gt;Billing Contact&lt;br /&gt;Juergen Riedel&lt;br /&gt;Postfach 131142, D-70069 Stuttgart&lt;br /&gt;Germany&lt;br /&gt;E-mail:                  info@citymedia.de&lt;br /&gt;Phone:                   ++49711-286-5799&lt;br /&gt;Fax:                     ++49711-286-8450&lt;br /&gt;&lt;br /&gt;Resource Records (2):&lt;br /&gt;ns      ns1.idnscan.net&lt;br /&gt;ns      ns6.idnscan.net&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6806118251241543344-4014954851319295548?l=voluntocracy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://voluntocracy.blogspot.com/feeds/4014954851319295548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6806118251241543344&amp;postID=4014954851319295548' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/4014954851319295548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6806118251241543344/posts/default/4014954851319295548'/><link rel='alternate' type='text/html' href='http://voluntocracy.blogspot.com/2009/08/interdots-international-phishing-for.html' title=''/><author><name>Aubrey Jaffer</name><uri>http://www.blogger.com/profile/14575029475024146146</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_35njvom8s9M/StVVFY-ehqI/AAAAAAAAA3w/n6TrADKRxaY/S220/myface-1.jpg'/></author><thr:total>0</thr:total></entry></feed>
