<?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-4170332600441687813</id><updated>2012-01-18T15:59:33.976-08:00</updated><category term='OOP'/><category term='education'/><category term='Vista'/><category term='HPC'/><category term='statistics'/><category term='Python float'/><category term='python'/><category term='science'/><title type='text'>Advances in Pencil Science</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>76</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-2996670871259450812</id><published>2012-01-18T15:58:00.000-08:00</published><updated>2012-01-18T15:59:33.988-08:00</updated><title type='text'>Environment variables in scripts</title><content type='html'>Nice tutorial &lt;a href="http://www.kingcomputerservices.com/unix_101/understanding_unix_shells_and_environment_variables.htm"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-2996670871259450812?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/2996670871259450812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=2996670871259450812' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2996670871259450812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2996670871259450812'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2012/01/environment-variables-in-scripts.html' title='Environment variables in scripts'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-1597018141404897903</id><published>2011-08-12T07:58:00.000-07:00</published><updated>2011-08-12T08:12:43.278-07:00</updated><title type='text'>Fixing Excel text exports in OS X</title><content type='html'>Excel exports .tsv and .csv with a broken linefeed character.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To fix: copy this file to "fixcel.py"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;# fixcel.py&lt;br /&gt;from sys import argv&lt;br /&gt;infnam, outfnam = argv[1:]&lt;br /&gt;inf = file(infnam)&lt;br /&gt;indata = inf.read()&lt;br /&gt;inf.close()&lt;br /&gt;outdata = ""&lt;br /&gt;for ch in indata:&lt;br /&gt;if ord(ch) == 13:&lt;br /&gt;  outdata += "\n"&lt;br /&gt;else:&lt;br /&gt;  outdata += ch&lt;br /&gt;outf = file(outfnam,"w")&lt;br /&gt;outf.write(outdata)&lt;br /&gt;outf.close()&lt;br /&gt;#&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then invoke with:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;python fixcel.py &lt;b&gt;oldfilename&lt;/b&gt; &lt;b&gt;newfilename&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-1597018141404897903?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/1597018141404897903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=1597018141404897903' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1597018141404897903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1597018141404897903'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2011/08/fixing-excel-text-exports-in-os-x.html' title='Fixing Excel text exports in OS X'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-4171381151163709768</id><published>2010-12-09T23:43:00.000-08:00</published><updated>2010-12-09T23:55:16.377-08:00</updated><title type='text'>Wordify</title><content type='html'>This code can count to a million in words. It could probably be refactored so it was shorter and could count to any number. If you were patient enough. &lt;br /&gt;&lt;br /&gt;The "-b" flag puts "and" in the places a Brit would put it. It's optional but preferred.&lt;br /&gt;I have random stopping points to increase the modest entertainment value of it running.&lt;br /&gt;&lt;br /&gt;Can you recursively get wordify up to the quintillions? How should the "-b" flag be handled?&lt;br /&gt;&lt;br /&gt;Can you do this in French?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from string import ascii_lowercase as alphabet&lt;br /&gt;from sys import argv&lt;br /&gt;&lt;br /&gt;units = [""] + "one two three four five six seven eight nine".split()&lt;br /&gt;teens =  "ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen".split()&lt;br /&gt;tenties = 2 * [""] + "twenty thirty forty fifty sixty seventy eighty ninety".split() &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def name(number,terminate = True,continued = False,brit=False):&lt;br /&gt;    assert type(number) == int&lt;br /&gt;    assert number &gt; 0 and number &lt; 1001&lt;br /&gt;    if number == 1000: return "one thousand"&lt;br /&gt;    hundreds,residual = divmod(number,100)&lt;br /&gt;    tens,ones = divmod(residual,10)&lt;br /&gt;    result = ""&lt;br /&gt;    if hundreds:&lt;br /&gt;        result += units[hundreds] + " hundred"&lt;br /&gt;    if residual and hundreds:&lt;br /&gt;        result += " "&lt;br /&gt;    if brit and residual and (hundreds or continued):&lt;br /&gt;        result += "and "&lt;br /&gt;    if (tens == 1):&lt;br /&gt;        result += teens[ones] &lt;br /&gt;        if terminate:&lt;br /&gt;            result += "."&lt;br /&gt;    else:&lt;br /&gt;        if tens:&lt;br /&gt;            result += tenties[tens]&lt;br /&gt;            if ones: result += "-"&lt;br /&gt;        if ones:&lt;br /&gt;            result += units[ones]&lt;br /&gt;        if terminate:&lt;br /&gt;            result += "."&lt;br /&gt;    return result&lt;br /&gt;&lt;br /&gt;def wordify(number,brit=False):&lt;br /&gt;    assert type(number) == int&lt;br /&gt;    assert number &gt; 0 and number &lt; 1000000&lt;br /&gt;    thousands,residual = divmod(number,1000)&lt;br /&gt;    result = ""&lt;br /&gt;    if thousands:&lt;br /&gt;        result = name(thousands,False,brit=brit) + " thousand"&lt;br /&gt;        if residual:&lt;br /&gt;            result += " "&lt;br /&gt;            result += name(residual,continued = True,brit=brit)&lt;br /&gt;        else:&lt;br /&gt;            result += "."&lt;br /&gt;    else:&lt;br /&gt;        result = name(number)&lt;br /&gt;    return result&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;&lt;br /&gt;    from time import sleep&lt;br /&gt;    from random import randint&lt;br /&gt;&lt;br /&gt;    brit = "-b" in argv&lt;br /&gt;    &lt;br /&gt;    sleeper = 30&lt;br /&gt;    for i in range(1,1000000):&lt;br /&gt;        if i == sleeper:&lt;br /&gt;            sleep(3)&lt;br /&gt;            sleeper += randint(3000,90000)&lt;br /&gt;        print wordify(i,brit=brit)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;output:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;one.&lt;br /&gt;two.&lt;br /&gt;three.&lt;br /&gt;four.&lt;br /&gt;five.&lt;br /&gt;six.&lt;br /&gt;seven.&lt;br /&gt;eight.&lt;br /&gt;nine.&lt;br /&gt;ten.&lt;br /&gt;eleven.&lt;br /&gt;twelve.&lt;br /&gt;...&lt;br /&gt;nine hundred and ninety-nine thousand nine hundred and ninety-six.&lt;br /&gt;nine hundred and ninety-nine thousand nine hundred and ninety-seven.&lt;br /&gt;nine hundred and ninety-nine thousand nine hundred and ninety-eight.&lt;br /&gt;nine hundred and ninety-nine thousand nine hundred and ninety-nine.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's as far as it goes so far. Go fix it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-4171381151163709768?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/4171381151163709768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=4171381151163709768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4171381151163709768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4171381151163709768'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/12/wordify.html' title='Wordify'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-8168087829365006460</id><published>2010-12-09T17:50:00.000-08:00</published><updated>2010-12-09T17:54:29.300-08:00</updated><title type='text'>Up to 11</title><content type='html'>I managed to confuse myself for hours on #11 trying to be elegant. But I really like this solution:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;grid = [[0]*23]*3 + [[int(x) for x in line.split()]+[0,0,0] for line in&lt;br /&gt;'''08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08&lt;br /&gt;49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00&lt;br /&gt;81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65&lt;br /&gt;52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91&lt;br /&gt;22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80&lt;br /&gt;24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50&lt;br /&gt;32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70&lt;br /&gt;67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21&lt;br /&gt;24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72&lt;br /&gt;21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95&lt;br /&gt;78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92&lt;br /&gt;16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57&lt;br /&gt;86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58&lt;br /&gt;19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40&lt;br /&gt;04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66&lt;br /&gt;88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69&lt;br /&gt;04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36&lt;br /&gt;20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16&lt;br /&gt;20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54&lt;br /&gt;01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48'''.split('\n')&lt;br /&gt;] + [[0]*23]*3&lt;br /&gt;&lt;br /&gt;import operator&lt;br /&gt;&lt;br /&gt;print max([reduce(operator.mul, [grid[y+n*d[0]][x+n*d[1]] for n in (0,1,2,3)])&lt;br /&gt;for x in xrange(0,20) for y in xrange(3,23)&lt;br /&gt;for d in ((0,1),(1,0),(1,1),(-1,1))]) &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The halo of zeros is very clever and completely works around what made mine confusing, and despite everything, inelegant:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;linelen = len(array[0])&lt;br /&gt;for line in array:&lt;br /&gt;    assert len(line) == linelen&lt;br /&gt;&lt;br /&gt;numlines = len(array)&lt;br /&gt;offset = 4&lt;br /&gt;&lt;br /&gt;directions = {&lt;br /&gt;              "row":(0,linelen-offset+1,numlines,(0,1)),&lt;br /&gt;              "column":(0,linelen,numlines-offset+1,(1,0)),&lt;br /&gt;              "slash":(offset-1,linelen-offset+1,numlines-offset+1,(-1,1)),&lt;br /&gt;              "backslash":(0,linelen-offset+1,numlines-offset+1,(1,1))&lt;br /&gt;             }&lt;br /&gt;&lt;br /&gt;maxprod = None&lt;br /&gt;valmax = 0&lt;br /&gt;&lt;br /&gt;for direction in directions.keys():&lt;br /&gt;    x0, xlen, yrg, delta = directions[direction]&lt;br /&gt;    vec0 = [(x0 + i * delta[0] ,i * delta[1]) for i in range(offset)]&lt;br /&gt;    for y in range(yrg):&lt;br /&gt;        vec1 = [(item[0]+y,item[1]) for item in vec0]&lt;br /&gt;        for x in range(xlen):&lt;br /&gt;            vec = [(item[0],item[1]+x) for item in vec1]&lt;br /&gt;            vals = [array[item[0]][item[1]] for item in vec]&lt;br /&gt;            prod = reduce(mul,vals,1)&lt;br /&gt;            if prod &gt; maxprod:&lt;br /&gt;                valmax = vals&lt;br /&gt;                maxprod = prod&lt;br /&gt;&lt;br /&gt;print valmax, maxprod&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-8168087829365006460?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/8168087829365006460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=8168087829365006460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/8168087829365006460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/8168087829365006460'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/12/up-to-11.html' title='Up to 11'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-2536457408153099914</id><published>2010-12-05T22:22:00.000-08:00</published><updated>2010-12-05T22:33:10.745-08:00</updated><title type='text'>Puzzle 5</title><content type='html'>Profiting from my overwrought example 3&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from bf7 import *&lt;br /&gt;from sys import argv&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    if len(argv) == 1:&lt;br /&gt;        upto = 10&lt;br /&gt;    else:&lt;br /&gt;        upto = int(argv[1]) &lt;br /&gt;    allprimes = primesupto(upto)&lt;br /&gt;&lt;br /&gt;    result = 1&lt;br /&gt;    for prime in allprimes:&lt;br /&gt;        factor = prime&lt;br /&gt;        while factor &lt; upto:&lt;br /&gt;            result *= prime&lt;br /&gt;            factor *= prime&lt;br /&gt;    print result&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For me it would have been less work to just write&lt;br /&gt;&lt;br /&gt;print 2 * 2 * 2 * 2 * 3 * 3 * 5 * 7 * 11 * 13 * 17 * 19&lt;br /&gt;&lt;br /&gt;Best solution, for those who can remember grade school:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;def gcd(a, b):&lt;br /&gt; while(b != 0):&lt;br /&gt;  a, b = b, a%b&lt;br /&gt; return a&lt;br /&gt; &lt;br /&gt;def lcm(a,b):&lt;br /&gt; return a * b / gcd(a, b)&lt;br /&gt; &lt;br /&gt;print reduce(lcm, range(2, 21))&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-2536457408153099914?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/2536457408153099914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=2536457408153099914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2536457408153099914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2536457408153099914'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/12/puzzle-5.html' title='Puzzle 5'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-993563839203736692</id><published>2010-12-05T21:48:00.000-08:00</published><updated>2010-12-05T21:56:27.354-08:00</updated><title type='text'>Puzzle 4</title><content type='html'>What's the largest palindrome number that is the product of two three digit numbers.&lt;br /&gt;&lt;br /&gt;This time I have one of the better solutions:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def nextpal(low,high,reversed=False):&lt;br /&gt;    assert low &lt; high&lt;br /&gt;&lt;br /&gt;    if reversed:&lt;br /&gt;        candidate = high&lt;br /&gt;        final = low&lt;br /&gt;        increment = -1&lt;br /&gt;    else:&lt;br /&gt;        candidate = low&lt;br /&gt;        final = high&lt;br /&gt;        increment = 1&lt;br /&gt;    while candidate != final:&lt;br /&gt;        if str(candidate) == str(candidate)[-1::-1]:&lt;br /&gt;            yield candidate&lt;br /&gt;        candidate += increment&lt;br /&gt;&lt;br /&gt;def getfactor(low,high,target):&lt;br /&gt;    for test in range(low,high):&lt;br /&gt;        if not target % test:&lt;br /&gt;            residual = target/test&lt;br /&gt;            if residual in range(low,high):&lt;br /&gt;                return test, residual&lt;br /&gt;    return None&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    from time import time&lt;br /&gt;    start = time()&lt;br /&gt;    pal = nextpal(10000,1000000, reversed=True)&lt;br /&gt;    while True:&lt;br /&gt;        target = pal.next()&lt;br /&gt;        result = getfactor(100,1000,target)&lt;br /&gt;        if result:&lt;br /&gt;            print target&lt;br /&gt;            print result&lt;br /&gt;            break&lt;br /&gt;    end = time()&lt;br /&gt;    print end - start&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Most started from the factors to see if they built palindromes. Much better to go the other way; far fewer tests (the 94th palindrome succeeded, so less than 9400 calculations. The cast to string for the palindrome test is easy, but is it efficient?&lt;br /&gt;&lt;br /&gt;The most interesting items on the discussion were the Pytho one-liner:&lt;br /&gt;&lt;br /&gt;max(map(lambda s: bool(s) and max(s) or 0, [(filter(lambda n: n == int(str(n)[::-1]), map(lambda n: i*n, range(999, 99, -1)))) for i in range(999, 99, -1)]))&lt;br /&gt;&lt;br /&gt;and the pen-and-paper solution&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;You can also do this with pen and paper. You have a number: &lt;br /&gt;&lt;br /&gt;(100a + 10b + c)(100d + 10e + f) &lt;br /&gt;&lt;br /&gt;Which is a palindrone. This factors out to: &lt;br /&gt;&lt;br /&gt;100cd + 10ce + cf + &lt;br /&gt;1000bd + 100be + 10bf + &lt;br /&gt;10000ad + 1000ae + 100af &lt;br /&gt;&lt;br /&gt;Assuming the first digit is 9, then cf must be equal to nine. &lt;br /&gt;Also, both a and d must then be equal to nine. The only ways &lt;br /&gt;to make the last digit of the product of two integers 9 would &lt;br /&gt;be if those integers were either of: &lt;br /&gt;&lt;br /&gt;1 and 9 &lt;br /&gt;3 and 3 &lt;br /&gt;7 and 7 &lt;br /&gt;&lt;br /&gt;So, both numbers must start with 9, end with either 1, 3, 7, &lt;br /&gt;or 9, and one of them must be divisible by 11. The only &lt;br /&gt;numbers divisible by 11 from 900 - 1000 are: &lt;br /&gt;&lt;br /&gt;902 &lt;br /&gt;913 &lt;br /&gt;924 &lt;br /&gt;935 &lt;br /&gt;946 &lt;br /&gt;957 &lt;br /&gt;968 &lt;br /&gt;979 &lt;br /&gt;990 &lt;br /&gt;&lt;br /&gt;You can discard all of those that do not end in either 1, 3, &lt;br /&gt;7, or 9, and you are left with: &lt;br /&gt;&lt;br /&gt;913 &lt;br /&gt;957 &lt;br /&gt;979 &lt;br /&gt;&lt;br /&gt;So now the presumed answer is either: &lt;br /&gt;&lt;br /&gt;(900 + 10 + 3)(900 + 10x + 3) &lt;br /&gt;(900 + 50 + 7)(900 + 10x + 7) &lt;br /&gt;(900 + 70 + 9)(900 + 10x + 1) &lt;br /&gt;&lt;br /&gt;Factoring all those out, you get: &lt;br /&gt;&lt;br /&gt;810000 + 9000x + 2700 + 9000 + 100x + 30 + 2700 + 30x + 9 &lt;br /&gt;824439 + 9130x &lt;br /&gt;&lt;br /&gt;Now, for the first digit 824439 + 9130x to be 9, x must be 9 &lt;br /&gt;(if x were 8, then 824439 + 9130x = 897479, and the first &lt;br /&gt;digit is 8). And so you have 913 * 993, which is the answer. &lt;br /&gt;You can factor the others out to see if they produce a bigger &lt;br /&gt;answer, which they don't.&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-993563839203736692?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/993563839203736692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=993563839203736692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/993563839203736692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/993563839203736692'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/12/puzzle-4.html' title='Puzzle 4'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-928226894436318839</id><published>2010-12-04T22:55:00.000-08:00</published><updated>2010-12-04T23:32:49.098-08:00</updated><title type='text'>Puzzle 3 without cheating</title><content type='html'>I am about 2800 times slower than the cheat I downloaded. But I get the right answer, and in a tolerable time (30 seconds). Pure brute forcing this seems like it would take much longer.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from sys import argv&lt;br /&gt;from math import sqrt&lt;br /&gt;from time import time&lt;br /&gt;&lt;br /&gt;# PRIME GENERATOR&lt;br /&gt;&lt;br /&gt;def nextprime():&lt;br /&gt;    """ generate next prime """&lt;br /&gt;&lt;br /&gt;    myprimes = [2]&lt;br /&gt;    candidate = 3&lt;br /&gt;    yield 2&lt;br /&gt;    while True:&lt;br /&gt;        factors = factorize(candidate,myprimes)&lt;br /&gt;        if len(factors.keys()) == 1:&lt;br /&gt;            myprimes.append(candidate)&lt;br /&gt;            yield candidate&lt;br /&gt;        candidate += 2&lt;br /&gt;&lt;br /&gt;def primesupto(upto):&lt;br /&gt;    """ collect primes from the generator"""&lt;br /&gt;&lt;br /&gt;    result = []&lt;br /&gt;    primes = nextprime()&lt;br /&gt;    p = None&lt;br /&gt;    while not p or p &lt; upto:&lt;br /&gt;        if p:&lt;br /&gt;            result.append(p)&lt;br /&gt;        p = primes.next()&lt;br /&gt;    return result&lt;br /&gt;&lt;br /&gt;def factorize(target,allprimes=None,verbose=False):&lt;br /&gt;    """ get factors of an integer&lt;br /&gt;&lt;br /&gt;    this works but is very slow if the primes aren't cached """&lt;br /&gt;&lt;br /&gt;    factors = {}&lt;br /&gt;    upto = int(sqrt(target))&lt;br /&gt;    residual = target&lt;br /&gt;    prime = nextprime()&lt;br /&gt;&lt;br /&gt;    if allprimes:&lt;br /&gt;        prime = allprimes.__iter__()&lt;br /&gt;&lt;br /&gt;    while True:  # get factors and multiplicities up to sqrt(N)&lt;br /&gt;        try:&lt;br /&gt;            factor = prime.next()&lt;br /&gt;        except StopIteration:&lt;br /&gt;            break&lt;br /&gt;        if factor &gt; upto:&lt;br /&gt;            break&lt;br /&gt;        while not residual % factor:&lt;br /&gt;            residual /= factor&lt;br /&gt;            factors[factor] = factors.get(factor,0) + 1           &lt;br /&gt;&lt;br /&gt;    if residual &gt; 1: # if anything is left it is the sole prime factor &gt; sqrt(N)&lt;br /&gt;        factors[residual] = 1&lt;br /&gt;&lt;br /&gt;    return factors&lt;br /&gt;   &lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    target = int(argv[1]) # get target from command line&lt;br /&gt;    upto = sqrt(target)&lt;br /&gt;    starttime = time()&lt;br /&gt;    allprimes = primesupto(upto)&lt;br /&gt;    print max(factorize(int(argv[1]),allprimes).keys())&lt;br /&gt;    endtime = time()&lt;br /&gt;    print endtime - starttime&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Update:&lt;br /&gt;&lt;br /&gt;Best answer, wow!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from time import time&lt;br /&gt;from sys import argv&lt;br /&gt;&lt;br /&gt;n = int(argv[1])&lt;br /&gt;d = 3&lt;br /&gt;&lt;br /&gt;starttime = time()&lt;br /&gt;while (d * d &lt; n):&lt;br /&gt;   if n % d == 0: n /= d&lt;br /&gt;   else: d += 2&lt;br /&gt;endtime = time()&lt;br /&gt;print n&lt;br /&gt;print endtime - startime&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Runs in 0.7 msec. I feel like a complete idiot now. Oh well, it was interesting anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-928226894436318839?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/928226894436318839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=928226894436318839' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/928226894436318839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/928226894436318839'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/12/puzzle-3-without-cheating.html' title='Puzzle 3 without cheating'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-9173824298303110511</id><published>2010-12-04T12:10:00.000-08:00</published><updated>2010-12-04T12:11:39.068-08:00</updated><title type='text'>Cheating, sorta</title><content type='html'>What is the largest prime factor of the number 600851475143 ?&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from os import system&lt;br /&gt;from os.path import isfile&lt;br /&gt;from sys import argv&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;  import numbthy&lt;br /&gt;except:&lt;br /&gt;  if not isfile("numbthy.py"): # don't mess with it if it's already there and broken&lt;br /&gt;     system("wget http://userpages.umbc.edu/~rcampbel/Computers/Python/lib/numb&lt;br /&gt;thy.py")&lt;br /&gt;  import numbthy&lt;br /&gt;&lt;br /&gt;f = numbthy.factors(int(argv[1]))&lt;br /&gt;if f: print f[-1]&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-9173824298303110511?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/9173824298303110511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=9173824298303110511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/9173824298303110511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/9173824298303110511'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/12/cheating-sorta.html' title='Cheating, sorta'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-2757237693883268079</id><published>2010-12-04T08:01:00.001-08:00</published><updated>2010-12-04T08:05:22.258-08:00</updated><title type='text'>Level 2</title><content type='html'>I'm mostly at level 2 &lt;a href="http://www.starling-software.com/employment/programmer-competency-matrix.html"&gt;in this chart&lt;/a&gt;, except for IDEs. I don't really use them. I like aquamacs for an editor but even there I'm not good at it. I'm also pretty lame at version control, never having had the opportunity to work closely with others; hence never having run into a merge problem in real life.&lt;br /&gt;&lt;br /&gt;I read some of the sorts of books he calls level 3.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-2757237693883268079?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/2757237693883268079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=2757237693883268079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2757237693883268079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2757237693883268079'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/12/level-2.html' title='Level 2'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-6074522956017652899</id><published>2010-12-03T13:58:00.001-08:00</published><updated>2010-12-03T15:06:37.906-08:00</updated><title type='text'>Number Two</title><content type='html'>Python shines on this one. Find the sum of all the even-valued terms in the Fibonacci sequence which do not exceed four million.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from itertools import ifilterfalse&lt;br /&gt;&lt;br /&gt;def fib(n1=1,n2=1,fmax=4000000):&lt;br /&gt;    "terminating fibonacci sequence"&lt;br /&gt;&lt;br /&gt;    assert 0 &lt; n1 &lt;= n2 &lt; fmax&lt;br /&gt;    l = [n2,n1]&lt;br /&gt;    while l:&lt;br /&gt;        if l[0] &lt; fmax/2:&lt;br /&gt;            l.append(sum(l))&lt;br /&gt;        yield l.pop(0)&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    print sum(ifilterfalse(lambda x: x % 2,fib()))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-6074522956017652899?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/6074522956017652899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=6074522956017652899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/6074522956017652899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/6074522956017652899'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/12/number-two.html' title='Number Two'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-6096857550252049700</id><published>2010-12-03T13:13:00.000-08:00</published><updated>2010-12-03T13:18:37.697-08:00</updated><title type='text'>Euler Project</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=1"&gt;prob 1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A one-liner.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; sum([i for i in range(10) if not (i%3 and i%5)])&lt;br /&gt;23&lt;br /&gt;&gt;&gt;&gt; sum([i for i in range(1000) if not (i%3 and i%5)])&lt;br /&gt;233168&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So it's surprisingly interesting:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; for n in range(1,9):&lt;br /&gt;...     print sum([i for i in range(10**n) if not (i%3 and i%5)])&lt;br /&gt;... &lt;br /&gt;23&lt;br /&gt;2318&lt;br /&gt;233168&lt;br /&gt;23331668&lt;br /&gt;2333316668&lt;br /&gt;233333166668&lt;br /&gt;23333331666668&lt;br /&gt;2333333316666668&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Can't even come up with a succinct notation for the theorem, never mind any idea how to prove it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-6096857550252049700?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/6096857550252049700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=6096857550252049700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/6096857550252049700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/6096857550252049700'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/12/euler-project.html' title='Euler Project'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-8512974084504167481</id><published>2010-11-30T13:08:00.000-08:00</published><updated>2010-11-30T13:09:34.617-08:00</updated><title type='text'>Moving notes to self</title><content type='html'>Notes to self or those interested in my daily pain will be moved to &lt;a href="http://aardvarknoplay.blogspot.com/"&gt;http://aardvarknoplay.blogspot.com/&lt;/a&gt; . Old notes being moved.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This blog will actually have content that others may find interesting.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-8512974084504167481?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/8512974084504167481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=8512974084504167481' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/8512974084504167481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/8512974084504167481'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/11/moving-notes-to-self.html' title='Moving notes to self'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-5552955690209089301</id><published>2010-10-21T20:43:00.000-07:00</published><updated>2010-10-21T21:32:23.923-07:00</updated><title type='text'>Some Key Papers in Climate Modeling History</title><content type='html'>A first pass at a greatest hits list; updates will not necessarily be noted as such. I had a request for key papers in the history of modeling so the emphasis leans that way. Nominations welcome.&lt;br /&gt;&lt;br /&gt;Charney, Fjortofft &amp;amp; von Neumann 1950: Numerical integration of the barotropic vorticity equation, Tellus 2:237-254&lt;br /&gt;&lt;br /&gt;Lorenz 1963: Deterministic Nonperiodic Flow J. Atmos. Sci 20:130-141&lt;br /&gt;&lt;br /&gt;Lorenz 1967: The nature and theory of the general circulation of the atmosphere. WMO. http://eapsweb.mit.edu/research/Lorenz/General_Circ_WMO_1967_Part1.pdf&lt;br /&gt;&lt;br /&gt;Manabe &amp;amp; Bryan 1969: Climate calculations with a combined ocean-atmosphere model.&lt;br /&gt;&lt;br /&gt;Bryan &amp;amp; Cox 1972: &lt;span style="font-size:100%;"&gt;&lt;a href="http://www.gfdl.noaa.gov/bibliography/related_files/kb7201.pdf" class="yC10"&gt;The circulation of the world &lt;b&gt;ocean&lt;/b&gt;: a numerical  study. Part I, a homogeneous model&lt;/a&gt; J Phys Oceanog&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Arakawa &amp;amp; Lamb 1977: Computational Design of the basic processes of the UCLA general circulation model. Methods in Computational Physics 17:173-265&lt;br /&gt;&lt;br /&gt;Charney et al 1979: Ad Hoc Study Group on Carbon Dioxide and Climate. http://www.atmos.ucla.edu/~brianpm/charneyreport.html&lt;br /&gt;&lt;br /&gt;Manabe &amp;amp; Stouffer 1988: Two stable equilibria of a coupled ocean-atmosphere model&lt;br /&gt;&lt;br /&gt;Ramanathan et al 1985: Trace gas trends and their potential role in climate change. J Geophys Res 90:5547-5566&lt;br /&gt;&lt;br /&gt;Cess et al 1990: Intercomparison and interpretation of climate feedback processes in seventeen atmospheric general circulation models&lt;br /&gt;&lt;br /&gt;Bryan 1991: Poleward heat transport in the ocean: a reviwe of a hierarchy of models of incerasing resolution. J Phys Oceanog 18:851-867&lt;br /&gt;&lt;br /&gt;Cubasch et al 1992: Time-dependent greenhouse warming computations with a coupled ocean-atmosphere model&lt;br /&gt;&lt;br /&gt;Hansen et al 1992: &lt;span style="font-size:100%;"&gt;&lt;a href="http://www.agu.org/pubs/crossref/1992/91GL02788.shtml" class="yC1D"&gt;Potential climate impact of Mount Pinatubo eruption&lt;/a&gt;&lt;/span&gt; GEOPHYSICAL RESEARCH LETTERS,                                 VOL. 19, NO. 2,                                  PP. 215-218, 1992&lt;br /&gt;doi:10.1029/91GL02788                   &lt;br /&gt;&lt;br /&gt;Hasselmann 1997: Multi-patterm fingerprint method for detection and  attribution of climate change. Climate Dynamics 13:601-612&lt;br /&gt;&lt;br /&gt;Hansen et al 1998: Climate Forings in the Industrial Era. PNAS&lt;br /&gt;&lt;br /&gt;Bengtsson 1999: From short-range barotropic modeling to extended-range global weather prediction. Tellus 51 A-B:13-23&lt;br /&gt;&lt;br /&gt;Randall 2000: &lt;span style="font-size:100%;"&gt;&lt;span id="btAsinTitle" style=""&gt;General  Circulation Model Development: Past, Present, and Future  (International Geophysics) &lt;span style="text-transform: capitalize; font-size: 16px;"&gt;[Hardcover]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hansen et al 2005: Earth's Energy Imbalance: Confirmation and Implications. Science.&lt;br /&gt;&lt;br /&gt;Hack et al 2006: Simulation of the Global Hydrological Cycle in the CCSM  Community  Atmosphere Model Version 3. J Clim Volume 19, Issue 11 (June 2006)&lt;br /&gt;&lt;br /&gt;Schmidt et al 2006: Present-Day Atmospheric Simulations Using GISS ModelE: Comparison to In  Situ, Satellite, and Reanalysis Data.  &lt;i&gt;J. Climate&lt;/i&gt;, &lt;b&gt;19&lt;/b&gt;,  153–192.         &lt;br /&gt;&lt;br /&gt;Rahmstorf et al 2007: Recent Climate Observations Compared to Predictions. Science 316:709 DOI: 10.1126/science.1136843&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-5552955690209089301?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/5552955690209089301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=5552955690209089301' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5552955690209089301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5552955690209089301'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/10/some-key-papers-in-climate-modeling.html' title='Some Key Papers in Climate Modeling History'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-2203188246927196664</id><published>2010-10-12T13:59:00.000-07:00</published><updated>2010-10-12T14:46:45.550-07:00</updated><title type='text'>More Adventures in Climate Analysis Installs</title><content type='html'>&lt;div&gt;So here I document getting Ferret to work on a Mac; getting it to run on the super is another problem. I assumed no privileges and more or less succeeded. However, the install instructions are (as is normal with scientist code) broken.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Here are the absurd installation instructions:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://ferret.pmel.noaa.gov/static/Downloads/mac_intel_downloads.html"&gt;http://ferret.pmel.noaa.gov/static/Downloads/mac_intel_downloads.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is basically just three useful links to the actual binaries under "Environment and Executable files"; ignore the rest of it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then proceed to &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://ferret.pmel.noaa.gov/static/Downloads/ferret_installation_and_update_guide_v600.html"&gt;http://ferret.pmel.noaa.gov/static/Downloads/ferret_installation_and_update_guide_v600.html&lt;br /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you don;t knwo about environment variables in bash, go study up on them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first step 1 should be &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Times; font-size: medium; "&gt;&lt;pre&gt;tar xf $GET_LOCATION/fer_environment.tar&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The second step 1 and step 2 [sic] work as noted. Step 3 should be&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Times; font-size: medium; "&gt;&lt;pre&gt;tar xf $GET_LOCATION/fer_dsets.tar&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;as the Mac ungzips behind your back. Your next step will have to be backwards, as the Finstall script expects the exectuables to be gzipped. So go back to your download directory and type&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: medium; "&gt;gzip fer_executables.tar&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: medium; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Also, you will have to find a place for an extra file in the middle of the next step. Be sensible, create a ~/.Ferret directory before doing the next step. Use that for your $SET_FER .&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now you can run the Finstall per instructions. But the script you ghet out will be a csh script not a bash script. The following edits worked for me:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;export FER_DIR=/Users/tobis/Ferret&lt;br /&gt;export FER_DSETS=/Users/tobis/FerSamp&lt;br /&gt;&lt;br /&gt;#   if ( $PATH !~ *ferret* ) then&lt;br /&gt;#       export PATH={$PATH}:$FER_DIR/bin&lt;br /&gt;#   else&lt;br /&gt;#        echo replacing ferret path&lt;br /&gt;#      export PATH=`echo $PATH | awk -F: '{for (i=1; i&lt;=NF; i++) {if ($i \!~ /ferret\/bin/) {printf "%s:",$i}}}'`&lt;br /&gt;#      export PATH={$PATH}$FER_DIR/bin&lt;br /&gt;#   endif&lt;br /&gt; &lt;br /&gt;# =========== Initially make no modifications below this line ===========&lt;br /&gt;&lt;br /&gt;#  Default Ferret document browser&lt;br /&gt;#   export FER_WEB_BROWSER="netscape -ncols 60"&lt;br /&gt;   export FER_EXTERNAL_FUNCTIONS="$FER_DIR/ext_func/libs"&lt;br /&gt;   export FER_GO=". $FER_DIR/go $FER_DIR/examples $FER_DIR/contrib"&lt;br /&gt;   export FER_DATA=". $FER_DSETS/data $FER_DIR/go $FER_DIR/examples $FER_DIR/contrib"&lt;br /&gt;   export FER_DESCR=". $FER_DSETS/descr"&lt;br /&gt;   export FER_GRIDS=". $FER_DSETS/grids"&lt;br /&gt;   export TMAP="$FER_DIR/fmt"&lt;br /&gt;   export PLOTFONTS="$FER_DIR/ppl/fonts"&lt;br /&gt;   export SPECTRA="$FER_DIR/ppl"         # for old ferret versions&lt;br /&gt;   export FER_PALETTE=". $FER_DIR/ppl"       # palette search list&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So basically, change all the setenvs to exports, put in the equal sign, comment out the if/else block. If you are better with bash scripts, the if/else thing looks harmless.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I did not uncomment the reference to netscape. I don;t know where to get a netscape for os X 10.6 anyway. Sigh.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt; This actually works!&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QNv9CPAjNvE/TLTXADt6ICI/AAAAAAAABNk/CfNC6Nf2fxY/s1600/Picture+2.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 281px;" src="http://1.bp.blogspot.com/_QNv9CPAjNvE/TLTXADt6ICI/AAAAAAAABNk/CfNC6Nf2fxY/s400/Picture+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5527279038688272418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Meanwhile Chas has bunches of hoops for me to jump through. Will keep you posted, if you exist.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-2203188246927196664?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/2203188246927196664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=2203188246927196664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2203188246927196664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2203188246927196664'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/10/more-adventures-in-climate-analysis.html' title='More Adventures in Climate Analysis Installs'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_QNv9CPAjNvE/TLTXADt6ICI/AAAAAAAABNk/CfNC6Nf2fxY/s72-c/Picture+2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-653349621221266233</id><published>2010-10-06T12:17:00.000-07:00</published><updated>2010-10-06T12:26:06.655-07:00</updated><title type='text'>PyNGL Even worse than CDAT?</title><content type='html'>Undecided as yet. More to follow. But plenty of the same signs of cluelessness.&lt;br /&gt;&lt;br /&gt;I am still hopeful that the interpolation routine I need will work. And the install is much more straightforward, there being suitable binaries for the machines I care about.&lt;br /&gt;&lt;br /&gt;But the test routine starts with an absolute path to a python installation at NCAR!&lt;br /&gt;&lt;br /&gt;And this is unpythonic, though perhaps this is a Fortran 77 constraint rearing its ugly head&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;&lt;br /&gt;import Ngl&lt;br /&gt;import Nio&lt;br /&gt;import numpy&lt;br /&gt;&lt;br /&gt;# create an array and make a netcdf file&lt;br /&gt;&lt;br /&gt;ff = Nio.open_file("foo.nc","c")&lt;br /&gt;ff.create_dimension("x",10)&lt;br /&gt;ff.create_dimension("y",10)&lt;br /&gt;&lt;br /&gt;ff.create_variable("u","f",("x","y"))&lt;br /&gt;&lt;br /&gt;z = numpy.zeros((10,10),"f")&lt;br /&gt;&lt;br /&gt;# ff.variables["u"] = z doesn't work&lt;br /&gt;&lt;br /&gt;ff.variables["u"].assign_value(z)&lt;br /&gt;&lt;br /&gt;# assignment is by value, as the name indicates&lt;br /&gt;&lt;br /&gt;z[3,3] = 3.3&lt;br /&gt;&lt;br /&gt;ff.variables["u"][4,4] = 4.4&lt;br /&gt;&lt;br /&gt;# but after assignment you can pick up a reference&lt;br /&gt;&lt;br /&gt;u = ff.variables["u"]&lt;br /&gt;&lt;br /&gt;u[2,2] = 2.2&lt;br /&gt;&lt;br /&gt;"""&lt;br /&gt;&gt;&gt;&gt; ff.variables["u"][:]&lt;br /&gt;array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],&lt;br /&gt;      [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],&lt;br /&gt;      [ 0.,  0.,  2.2,  0.,  0.,  0.,  0.,  0.,  0.,  0.],&lt;br /&gt;      [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],&lt;br /&gt;      [ 0.,  0.,  0.,  0.,  4.4,  0.,  0.,  0.,  0.,  0.],&lt;br /&gt;      [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],&lt;br /&gt;      [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],&lt;br /&gt;      [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],&lt;br /&gt;      [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],&lt;br /&gt;      [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]], dtype=float32)&lt;br /&gt;"""&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;ff.close()&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-653349621221266233?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/653349621221266233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=653349621221266233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/653349621221266233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/653349621221266233'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/10/pyngl-even-worse-than-cdat.html' title='PyNGL Even worse than CDAT?'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-2291024960851850520</id><published>2010-09-25T11:15:00.000-07:00</published><updated>2010-09-25T11:29:06.315-07:00</updated><title type='text'>Anthony Doerr</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tripadvisor.files.wordpress.com/2010/02/anthony-doerr.jpg?w=300&amp;amp;h=300"&gt;&lt;img style="float:right; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 300px; height: 300px;" src="http://tripadvisor.files.wordpress.com/2010/02/anthony-doerr.jpg?w=300&amp;amp;h=300" border="0" alt="" /&gt;&lt;/a&gt;Read &lt;a href="http://www.themorningnews.org/archives/opinions/planet_zoo.php"&gt;the whole thing&lt;/a&gt;. It starts&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;During my sophomore year, 1992, 1,500 scientists, including more than half the living Nobel laureates, admonished in their Warning to Humanity: “A great change in our stewardship of the earth and the life on it is required if vast human misery is to be avoided and our global home on this planet is not to be irretrievably mutilated.”&lt;br /&gt;&lt;br /&gt;So what have we done? Not much. From 1992 to 2007, global CO2 emissions from burning fossil fuels rose 38 percent. Emissions in 2008 rose a full 2 percent despite a global economic slump. Honeybees are dying by the billions1, amphibians by the millions, and shallow Caribbean reefs are mostly dead already.2 Our soil is disappearing faster than ever before, half of all mammals are in decline, and a recent climate change model predicts that the Arctic could have ice-free summers by 2013. Unchecked, carbon emissions from China alone will probably match the current global level by 2030.&lt;br /&gt;&lt;br /&gt;“&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;The god thou servest&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;,” Marlowe wrote in Dr. Faustus, almost four hundred years before the invention of internet shopping, “is &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;thine own appetite&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;.” Was he wrong? How significantly have you reduced your own emissions since you first heard the phrase “climate change?” By a tenth? A quarter? A half? That’s better than I’m doing. The shirt I’m wearing was shipped here from Thailand. The Twinkie I just ate had 37 ingredients in it. I biked to work through 91-degree heat this morning but back at my house the air conditioner is grinding away, keeping all three bedrooms a pleasant 74 degrees.&lt;br /&gt;&lt;br /&gt;My computer is on; my desk lamp is glowing. The vent on the wall is blowing a steady, soothing stream of cool air onto my shoes. &lt;/span&gt;&lt;/blockquote&gt;h/t Andrew Sullivan. Anthony Doerr, whom I had not heard of until today, lives in Idaho, writes "on Science" column for the Boston Globe, and is a 2010 Fellow of the John Simon Guggenheim Memorial Foundation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-2291024960851850520?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/2291024960851850520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=2291024960851850520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2291024960851850520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2291024960851850520'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/09/anthony-doerr.html' title='Anthony Doerr'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-6611974585608240168</id><published>2010-09-24T12:51:00.000-07:00</published><updated>2010-09-24T15:13:31.788-07:00</updated><title type='text'>Exploring NIO</title><content type='html'>The PyNIO install from binary went more or less without incident; I had to dig up a conformant numpy (1.5 is out but the binary required 1.4)&lt;br /&gt;&lt;br /&gt;I am deferring a PyNGL install until I figure out what PyNIO can do.&lt;br /&gt;&lt;br /&gt;So now I have py 2.5.1, numpy 1.4.1, Nio 1.4.0 and a doc.&lt;br /&gt;&lt;br /&gt;The main doc is &lt;a href="http://www.pyngl.ucar.edu/Nio.shtml"&gt;here&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Not hard for me to dig up a netcdf file from the CAM distribution; let's take a 2 D dataset from the land surface model. No idea what is in it.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-rwxr-x---  1 tobis G-25522 7671124 Oct 22  2009 clms_64x128_USGS_c030605.nc&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;seems to work! The data object has some attributes set by the data file.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; import numpy as np&lt;br /&gt;&gt;&gt;&gt; import Nio&lt;br /&gt;&gt;&gt;&gt; data = Nio.open_file("nctest.nc")&lt;br /&gt;&gt;&gt;&gt; data&lt;br /&gt;&lt;Nio.NioFile object at 0x6fc530&gt;&lt;br /&gt;&gt;&gt;&gt; dir(data)&lt;br /&gt;['Conventions', 'Glacier_raw_data_file_name', 'History_Log', 'Host', 'Inland_water_raw_data_file_name', 'Input_navy_oro_dataset', 'Lai_raw_data_file_name', 'Logname', 'Revision_Id', 'Run_mode', 'Soil_color_raw_data_file_name', 'Soil_texture_raw_data_file_name', 'Source', 'Urban_raw_data_file_name', 'Vegetation_type_raw_data_filename', 'Version', '__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'close', 'create_dimension', 'create_variable', 'set_option']&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;but how to get at the actual contents?&lt;br /&gt;&lt;br /&gt;Ah; the directory is incomplete. Apparently the extension module wasn't Pythonic. This can be patched.&lt;br /&gt;&lt;br /&gt;So we can get at dv = data.variables() yielding &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;['PCT_CLAY', 'LATIXY', 'LANDMASK', 'LANDFRAC_PFT', 'PCT_LAKE', 'LANDFRAC', 'NUMLON', 'LONGXY', 'MONTHLY_HEIGHT_BOT', 'PCT_WETLAND', 'MONTHLY_SAI', 'PCT_URBAN', 'PCT_SAND', 'MONTHLY_HEIGHT_TOP', 'PCT_PFT', 'MONTHLY_LAI', 'SOIL_COLOR', 'PCT_GLACIER', 'PFT']&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now, just printing (__str__) data tells us&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   dimensions:&lt;br /&gt;      lsmlon = 128&lt;br /&gt;      lsmlat = 64&lt;br /&gt;...&lt;br /&gt;   variables:&lt;br /&gt;...&lt;br /&gt;      float PCT_LAKE [ lsmlat, lsmlon ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;so dv['PCT_LAKE'] ought to be a 128 x 64 array&lt;br /&gt;&lt;br /&gt;but dv[2000,0] works. Apparently an overflow is treated as a [-1] index and an underflow as a [0] index. Not very reassuring.&lt;br /&gt;&lt;br /&gt;Exasperatingly, though PyNIO is available for py2.5 and numpy 1.4, PyNGL is not. Must get python 2.6... boring...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-6611974585608240168?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/6611974585608240168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=6611974585608240168' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/6611974585608240168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/6611974585608240168'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/09/exploring-nio.html' title='Exploring NIO'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-7102647823734192619</id><published>2010-09-21T13:11:00.000-07:00</published><updated>2010-09-21T14:58:57.584-07:00</updated><title type='text'>Install confusion</title><content type='html'>Trying to install PyNCL on a Red Hat machine without sudo priv's.&lt;br /&gt;&lt;br /&gt;1) Py2.7 from source. Builds fine. Runs fine.&lt;br /&gt;&lt;br /&gt;2) numpy from source using aforesaid python. atlas/blas instructions aren't too clear, proceed blindly ahead. build works fine.&lt;br /&gt;&lt;br /&gt;3) import numpy or import numarray fails:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;ImportError: Error importing numpy: you should not try to import numpy from&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        its source directory; please exit the numpy source tree, and relaunch&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        your python intepreter from there.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;very little info on Google about this. Try various versions of current working directory. Failure all the same.&lt;br /&gt;&lt;br /&gt;4) looks like this code:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if __NUMPY_SETUP__:&lt;br /&gt;    import sys as _sys&lt;br /&gt;    print &gt;&gt; _sys.stderr, 'Running from numpy source directory.'&lt;br /&gt;    del _sys&lt;br /&gt;else:&lt;br /&gt;    try:&lt;br /&gt;        from numpy.__config__ import show as show_config&lt;br /&gt;    except ImportError, e:&lt;br /&gt;        msg = """Error importing numpy: you should not try to import numpy from&lt;br /&gt;        its source directory; please exit the numpy source tree, and relaunch&lt;br /&gt;        your python intepreter from there."""&lt;br /&gt;        raise ImportError(msg)&lt;br /&gt;    from version import version as __version__&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; is getting invoked. Try setup command, but it tries to install in /usr/local/lib/python2.7&lt;br /&gt;&lt;br /&gt;5) How to tell setup where to put the numpy?&lt;br /&gt;&lt;br /&gt;setup.py install --help &lt;br /&gt;&lt;br /&gt;helps, yielding&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Options for 'install' command:&lt;br /&gt;  --prefix            installation prefix&lt;br /&gt;  --exec-prefix       (Unix only) prefix for platform-specific files&lt;br /&gt;  --home              (Unix only) home directory to install under&lt;br /&gt;  --install-base      base installation directory (instead of --prefix or --&lt;br /&gt;                      home)&lt;br /&gt;  --install-platbase  base installation directory for platform-specific files&lt;br /&gt;                      (instead of --exec-prefix or --home)&lt;br /&gt;  --root              install everything relative to this alternate root&lt;br /&gt;                      directory&lt;br /&gt;  --install-purelib   installation directory for pure Python module&lt;br /&gt;                      distributions&lt;br /&gt;  --install-platlib   installation directory for non-pure module distributions&lt;br /&gt;  --install-lib       installation directory for all module distributions&lt;br /&gt;                      (overrides --install-purelib and --install-platlib)&lt;br /&gt;  --install-headers   installation directory for C/C++ headers&lt;br /&gt;  --install-scripts   installation directory for Python scripts&lt;br /&gt;  --install-data      installation directory for data files&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It must be one of those!&lt;br /&gt;&lt;br /&gt;6) Used "--prefix". setup.py runs without complaint.&lt;br /&gt;&lt;br /&gt;Haha! New error. "{PATH}/multiarray.so: cannot open shared object file: No such file"&lt;br /&gt;&lt;br /&gt;but the file exists! Now what?&lt;br /&gt;&lt;br /&gt;7) Wait - no. I used the system python not the self-installed 2.7. It works! numpy is imported.&lt;br /&gt;&lt;br /&gt;8) Now get PyNCL? (ncl is already working on this machine)&lt;br /&gt;&lt;br /&gt;NO! Looks like I have to do the numpy thing again, because PyNGL recommends against the g77 compiler and requires gfortran. So my numpy, though working, is wrong.&lt;br /&gt;&lt;br /&gt;9) While I'm at it, no BLAS/ATLAS? etc?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-7102647823734192619?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/7102647823734192619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=7102647823734192619' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7102647823734192619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7102647823734192619'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/09/install-confusion.html' title='Install confusion'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-2573490589947929612</id><published>2010-08-11T20:49:00.000-07:00</published><updated>2010-08-11T21:12:16.799-07:00</updated><title type='text'>The Russia Thing</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;I am not sure how to take being definitely regarded as climate scientist by both &lt;a href="http://rogerpielkejr.blogspot.com/2010/07/honest-broker.html"&gt;Roger Pielke Jr&lt;/a&gt; (who is in and out of the Tobis-ooh-scary club) and &lt;a href="http://wonkroom.thinkprogress.org/2010/08/11/global-boiling-russia/"&gt;Brad Johnson&lt;/a&gt; (a Romm protege), but not quite so definitively by anyone commonly regarded as a climate scientist. I suppose I should accept it as better than nothing. But Johnson's topic is worth following up. And I really liked that Brad got an actual meteorologist to back me up:&lt;div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Like Dr. Tobis, Carver [Meteorologist Rob Carver, the Research and Development Scientist for Weather Underground] believes that manmade global warming has fundamentally altered weather patterns to produce the killer Russian heat wave. “Without contributions from anthropogenic climate change,” Carver said in an email interview with the Wonk Room, “I don’t think this event would have reached such extremes or even happened at all”:&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;I agree with Michael Tobis’s take at Only In It For the Gold that something systematic has changed to alter the global circulation and you’ll need a coupled atmosphere/ocean global model to understand what’s going on. My hunch is that a warming Arctic combined with sea-surface-temperature teleconnections altered the global circulation such that a blocking ridge formed over western Russia leading to the unprecedented drought/heat wave conditions. Without contributions from anthropogenic climate change, I don’t think this event would have reached such extremes or even happened at all. (You may quote me on that.)&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;Cool. Thanks for taking the heat, making a stronger claim than I did, Rob! And thanks for the work on this, Brad!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I want to explain my thinking in some detail on this, but I really don't have the time to do it justice right now. Of course it will be half-wittedly nitpicked and mocked to oblivion if I post it on a blog whether it's brilliant or foolish. I wonder if it rates a real paper somewhere. That would be a novelty...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But a short version occurs to me. Remember when I tried to explain that "global warming" and "anthropogenic climate change" don't mean exactly the same thing? Well, the fact that we now have situations like this one, and last year's in Australia, allows for making the point clear with some examples.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See, what we are worried about is not global warming. Global warming itself causes relatively little damage, at least at first. What we are worried about is climate change. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Anthropogenic global warming does not cause climate change. &lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Anthropogenic climate change causes global warming,. &lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Global warming (at the surface, just like global cooling in the stratosphere) is one of the more predictable symptoms of anthropogenic climate change. But if you change the forcing, you change the response. That's not a very deep scientific result, is it? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Anthropogenic climate change" - well that's a tedious mouthful, isn't it? Not in a sense, no,  not really. Not as tedious as what is happening this instant in Pakistan and in Russia, anyway. That's what abrupt climate change looks like.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-2573490589947929612?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/2573490589947929612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=2573490589947929612' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2573490589947929612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2573490589947929612'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/08/russia-thing.html' title='The Russia Thing'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-5535901643379217914</id><published>2010-08-10T12:47:00.000-07:00</published><updated>2010-08-10T14:17:00.577-07:00</updated><title type='text'></title><content type='html'>&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:arial;"&gt;Handy FIR filter inherits from list:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   class filter(list):&lt;br /&gt;&lt;br /&gt;   """real valued F I R filter with memory"""&lt;br /&gt;&lt;br /&gt;   def __init__(self, coeffs, data=None):&lt;br /&gt;            list.__init__([float(item) for item in coeffs])&lt;br /&gt;       if data:&lt;br /&gt;           assert len(data) == len(coeffs)&lt;br /&gt;           self.data =[float(datum) for datum in data]&lt;br /&gt;       else:&lt;br /&gt;           self.data = len(self) * [0.]&lt;br /&gt;&lt;br /&gt;   def __call__(self,value=0.):&lt;br /&gt;       return self.filter(value)&lt;br /&gt;&lt;br /&gt;   def output(self):&lt;br /&gt;       return sum(map(mul, self.coeffs, self.data))&lt;br /&gt;&lt;br /&gt;   def update(self,value):&lt;br /&gt;       self.pop(0)&lt;br /&gt;       self.append(value)&lt;br /&gt;&lt;br /&gt;   def filter(self, value=0.):&lt;br /&gt;       value = float(value)&lt;br /&gt;       self.update(value)&lt;br /&gt;       return self.output()&lt;br /&gt;&lt;br /&gt;   def innovate(self):&lt;br /&gt;       return self.filter(white())&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-5535901643379217914?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/5535901643379217914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=5535901643379217914' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5535901643379217914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5535901643379217914'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2010/08/handy-fir-filter-inherits-from-list.html' title=''/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-5190904322938593174</id><published>2009-11-03T19:08:00.000-08:00</published><updated>2009-11-03T19:09:26.717-08:00</updated><title type='text'>I'll just use Python</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_QNv9CPAjNvE/SvDwV9dgY9I/AAAAAAAAApw/YexNefC4qDo/s1600-h/Picture+18.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 207px;" src="http://2.bp.blogspot.com/_QNv9CPAjNvE/SvDwV9dgY9I/AAAAAAAAApw/YexNefC4qDo/s400/Picture+18.png" alt="" id="BLOGGER_PHOTO_ID_5400080213283464146" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-5190904322938593174?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/5190904322938593174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=5190904322938593174' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5190904322938593174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5190904322938593174'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2009/11/ill-just-use-python.html' title='I&apos;ll just use Python'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_QNv9CPAjNvE/SvDwV9dgY9I/AAAAAAAAApw/YexNefC4qDo/s72-c/Picture+18.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-7782740017754587006</id><published>2009-06-26T14:01:00.000-07:00</published><updated>2009-06-26T14:02:38.529-07:00</updated><title type='text'>Captchad</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QNv9CPAjNvE/SkU3YuT_lRI/AAAAAAAAAiY/me5BoIyri6w/s1600-h/Picture+37.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 350px; height: 161px;" src="http://1.bp.blogspot.com/_QNv9CPAjNvE/SkU3YuT_lRI/AAAAAAAAAiY/me5BoIyri6w/s400/Picture+37.png" alt="" id="BLOGGER_PHOTO_ID_5351744630087980306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-7782740017754587006?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/7782740017754587006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=7782740017754587006' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7782740017754587006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7782740017754587006'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2009/06/captchad.html' title='Captchad'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_QNv9CPAjNvE/SkU3YuT_lRI/AAAAAAAAAiY/me5BoIyri6w/s72-c/Picture+37.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-608286509380410760</id><published>2009-06-13T12:34:00.000-07:00</published><updated>2009-06-13T12:36:17.013-07:00</updated><title type='text'>Pair Programming</title><content type='html'>&lt;a href="http://misko.hevery.com/2009/06/12/what-pair-programing-is-not/"&gt;&lt;span style="font-weight:bold;"&gt;What Pair-Programing is Not&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="color: rgb(34, 34, 34);  line-height: 23px; font-size:14px;"&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; "&gt;-misko hevery&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; "&gt;Let me tell you about Arthur, the last developer which joined us for a month, and how productive he was. Arthur showed up on Monday at 9am. I sat down with him behind his computer and said, “Let’s get you up-to-speed.” I made sure that he was driving, and I was talking and we started installing all of the software which he needed to develop code. The compilers, the database the IDE, checking out the code from the repository and running it. The key here is that Arthur was doing all of the work and I was just telling him what to do. By noon, he was up and running, thanks to a very intensive hand-holding from me. We went to lunch and talked about the application, not in general terms but in specific terms which Arthur could translate to what he did few minutes ego.&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; "&gt;After lunch, I said let’s go and fix a bug. I picked a simple bug and for the most part again i was doing most of the talking but made sure that Arthur had the keyboard and understood what, and why he was doing things. By 3 pm we had a fix. We ran all of the tests, and submitted the code. We watched the build to make sure we did not break anything.&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; "&gt;This is pairing, and it is exhausting! By 3 pm I was beat and went home, but Arthur stayed to play some more with the code. Turns out he fixed another bug on his own before he went home. Not bad for first day. Now I could have fixed the bugs myself in 1 hour flat both of them, but than Arthur would not learn anything. I sacrificed my productivity to make Arthur productive in a single day. If I did not it would take Arthur weeks before he would figure out how to set everything up how things worked and enough courage to fix a bug. Yet that is exactly what most companies do. Think about the confidence Arthur had on day one working with us. He was up and ready and he fixed two bugs on day one. WOW!&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; "&gt;More importantly is what we did not do. We did not get distracted by checking email. How can you, you have a single monitor, and that means that Arthur would read my email. Arthur did not waste time looking for documentation which is poor or does not exist, he was spoon fed the knowledge in the most efficient way, and he did it all by himself, i was just talking, he was typing. It is amazing how much more focused you are when you have two people working on something.&lt;/p&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-608286509380410760?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/608286509380410760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=608286509380410760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/608286509380410760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/608286509380410760'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2009/06/pair-programming.html' title='Pair Programming'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-1424289545326043303</id><published>2009-04-14T09:40:00.000-07:00</published><updated>2009-04-14T09:56:51.196-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><title type='text'>Seeking help from Statistician</title><content type='html'>Suppose I have distinct samples of a cumulative density function at 0.01, 0.25, 0.5, 0.75, and 0.99 obtained from an interview. I can provide some constraint that the 0.01 point is not "too close" to the 0.25 point and similarly for the 0.99 and the 0.75 points.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I need to interpolate between the given points.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, of course there is not a unique interpolation, but I guess there is a maximum entropy interpolation that is in some sense closest to a Gaussian. I wonder how I would find out what it is.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Secondly, I would like to find distributions of the sum of two such distributions. I am imagining a Monte Carlo method would work, but if there is a closed form, so much the better. It needs to be reasonably computationally efficient and either available as a Python package or relatively easily programmed and tested. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thirdly, similarly for a product of two such distributions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If there is not a closed form, I need a way to take samples of the distribution from Python. It's not hard for me to construct a method that is crudely correct in the sense that the biases are unlikely to matter for the purposes at hand, but it seems someone ought to be able to tell me how to do better.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It would be nearly hopeless for a small traffic blog like this to get an answer by itself, but I wonder if Twitter isn't going to prove useful for scientists to answer questions of this sort. So I've tweeted a call for assistance and pointed to this posting. It will be very encouraging if I get a useful response; I have little hangups like this one all the time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-1424289545326043303?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/1424289545326043303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=1424289545326043303' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1424289545326043303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1424289545326043303'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2009/04/seeking-help-from-statistician.html' title='Seeking help from Statistician'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-7493857165586241008</id><published>2009-04-13T12:54:00.000-07:00</published><updated>2009-04-13T13:00:27.403-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python float'/><title type='text'>Python float input validation</title><content type='html'>If you put 'nan' in as a string, a cast to float will not raise an exception.&lt;br /&gt;&lt;br /&gt;I am not sure this is a good design, but the counterintuitive workaround is this.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To test if a Python float is not a number, see if it is equal to itself!&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;try:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;....val = float(raw_input("Air speed of an unladen swallow: "))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;except:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;....print "foo"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;if val != val&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;....print "foo also!"&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-7493857165586241008?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/7493857165586241008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=7493857165586241008' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7493857165586241008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7493857165586241008'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2009/04/python-float-input-validation.html' title='Python float input validation'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-485986299425790375</id><published>2009-04-02T22:25:00.000-07:00</published><updated>2009-04-02T22:38:35.683-07:00</updated><title type='text'>Turing Test Passed; Humanity Obsolete</title><content type='html'>@LizNeeley tweets: &lt;blockquote&gt;A reverse image search engine - upload a pic, find where it came from, modified versions. Still in beta, but incredible. &lt;a href="http://tineye.com"&gt;http://tineye.com&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;So I submitted this image, stolen &lt;a href="http://initforthegold.blogspot.com/2009/04/sustainable-science-journalism-toward.html"&gt;for my main blog&lt;/a&gt; from Tom the Dancing Bug &lt;a href="http://languagelog.ldc.upenn.edu/myl/llog/TDBNews.gif"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_QNv9CPAjNvE/SdWemUwrEtI/AAAAAAAAAdM/MmIGHEpcd_c/s1600-h/Picture+53.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 143px; height: 400px;" src="http://4.bp.blogspot.com/_QNv9CPAjNvE/SdWemUwrEtI/AAAAAAAAAdM/MmIGHEpcd_c/s400/Picture+53.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5320332916053185234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I wanted to see if tineye could find the original, but it outdid me, and came up with &lt;a href="http://languagelog.ldc.upenn.edu/myl/llog/TDBNews1.gif"&gt;this&lt;/a&gt; from&lt;br /&gt;&lt;a href="http://158.130.17.5/~myl/languagelog/archives/005250.html"&gt;here&lt;/a&gt;: a different clip from the same strip of the same size and shape!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://languagelog.ldc.upenn.edu/myl/llog/TDBNews1.gif"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 216px; height: 570px;" src="http://languagelog.ldc.upenn.edu/myl/llog/TDBNews1.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-485986299425790375?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/485986299425790375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=485986299425790375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/485986299425790375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/485986299425790375'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2009/04/turing-test-passed-humanity-obsolete.html' title='Turing Test Passed; Humanity Obsolete'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_QNv9CPAjNvE/SdWemUwrEtI/AAAAAAAAAdM/MmIGHEpcd_c/s72-c/Picture+53.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-1234164852081602008</id><published>2009-04-02T21:49:00.001-07:00</published><updated>2009-04-02T21:51:58.726-07:00</updated><title type='text'>Google chat bug: Majitao</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QNv9CPAjNvE/SdWVwx2CSiI/AAAAAAAAAdE/ceosel_3IpE/s1600-h/Picture+55.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 165px; height: 400px;" src="http://1.bp.blogspot.com/_QNv9CPAjNvE/SdWVwx2CSiI/AAAAAAAAAdE/ceosel_3IpE/s400/Picture+55.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5320323200054348322" /&gt;&lt;/a&gt; Who is Majitao?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-1234164852081602008?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/1234164852081602008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=1234164852081602008' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1234164852081602008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1234164852081602008'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2009/04/google-chat-bug-majitao.html' title='Google chat bug: Majitao'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_QNv9CPAjNvE/SdWVwx2CSiI/AAAAAAAAAdE/ceosel_3IpE/s72-c/Picture+55.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-898445238720879555</id><published>2009-03-05T07:40:00.001-08:00</published><updated>2009-03-05T07:40:46.583-08:00</updated><title type='text'>Buckminster Fuller Tweet</title><content type='html'>&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;When I am working on a problem, I never think about beauty but when I have finished, if the solution is not beautiful, I know it is wrong.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-898445238720879555?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/898445238720879555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=898445238720879555' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/898445238720879555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/898445238720879555'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2009/03/buckminster-fuller-tweet.html' title='Buckminster Fuller Tweet'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-1747802633113928271</id><published>2008-12-12T17:08:00.000-08:00</published><updated>2008-12-12T17:11:38.770-08:00</updated><title type='text'>Installing MySQL on OS X</title><content type='html'>It's actually not required to get started on Django, but I thought it would be a good idea to jump through the MySQL hoops early.&lt;br /&gt;&lt;br /&gt;It was a bit of an adventure:&lt;br /&gt;&lt;br /&gt;The MySql install instructions are broken for OS X. After you have&lt;br /&gt;downloaded the MySql package and installed it with the usual dance,&lt;br /&gt;you will probably encounter some instructions involving&lt;br /&gt;"groupadd".&lt;br /&gt;&lt;br /&gt;Various mortals seem to have gotten confused by this and&lt;br /&gt;run into various smug bastards being unhelpful. Ignore the smug bastards.&lt;br /&gt;&lt;br /&gt;===&lt;br /&gt;&lt;br /&gt;Instead, follow the instructions at&lt;br /&gt;&lt;a style="font-family: trebuchet ms;" href="http://www.macosxhints.com/article.php?story=20080128103022907"&gt;http://www.macosxhints.com/article.php?story=20080128103022907&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;However, the lines&lt;br /&gt;&lt;br /&gt;===&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;$ cd /Library/LaunchDaemons&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;$ sudo chown root com.mysql.mysqld&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;$ sudo chgrp wheel com.mysql.mysqld&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;$ sudo chmod 644 com.mysql.mysqld&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;===&lt;br /&gt;&lt;br /&gt;should read:&lt;br /&gt;&lt;br /&gt;===&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;$ cd /Library/LaunchDaemons&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;$ sudo chown root com.mysql.mysqld.plist&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;$ sudo chgrp wheel com.mysql.mysqld.plist&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;$ sudo chmod 644 com.mysql.mysqld.plist&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;===&lt;br /&gt;&lt;br /&gt;Otherwise the instructions are OK.&lt;br /&gt;&lt;br /&gt;Now it tells me to check with Console.app ... What is that?&lt;br /&gt;&lt;br /&gt;Wahoo! There it is in Utilities. I run it and it claims mysqld is running and&lt;br /&gt;ready for connections.&lt;br /&gt;&lt;br /&gt;===&lt;br /&gt;&lt;br /&gt;So now to find mysql; open a Terminal window.&lt;br /&gt;&lt;br /&gt;OK, now mysql isn't in my path yet, but I can invoke a mysql session&lt;br /&gt;with&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;/usr/local/mysql/bin/mysql&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;thus:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;/Guido:~ tobis$ &lt;b&gt;/usr/local/mysql/bin/mysql&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;Welcome to the MySQL monitor.  Commands end with ; or \g.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;Your MySQL connection id is 2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;Server version: 5.1.30 MySQL Community Server (GPL)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;Type 'help;' or '\h' for help. Type '\c' to clear the buffer.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;mysql&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;MySql is running! Type &lt;span style="font-family:courier new,monospace;"&gt;quit&lt;/span&gt; . This is enough of a victory for one day.&lt;br /&gt;&lt;br /&gt;===&lt;br /&gt;&lt;br /&gt;In future if you want to just type &lt;span style="font-family: courier new;"&gt;mysql&lt;/span&gt; instead of&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;/usr/local/mysql/bin/mysql&lt;/span&gt;, you need to update your path.&lt;br /&gt;&lt;br /&gt;Change to your home directory. Issue&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;touch .profile&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then edit &lt;span style="font-family: courier new;"&gt;.profile&lt;/span&gt;, appending the line&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;export PATH="$PATH:/usr/local/mysql/bin"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note this is a hidden file. See&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: trebuchet ms;" href="http://www.peachpit.com/articles/article.aspx?p=31442&amp;amp;seqNum=4"&gt;http://www.peachpit.com/articles/article.aspx?p=31442&amp;amp;seqNum=4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: trebuchet ms;" href="http://www.macworld.com/article/51830/2006/07/showallfinder.html"&gt;http://www.macworld.com/article/51830/2006/07/showallfinder.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;===&lt;br /&gt;&lt;br /&gt;In future if you don't want to burden your machine with mysql anymore,&lt;br /&gt;issue&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;launchctl unload com.mysql.mysqld.plist&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next step Django itself. I am expecting it to be a bit easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-1747802633113928271?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/1747802633113928271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=1747802633113928271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1747802633113928271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1747802633113928271'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/12/installing-mysql-on-os-x.html' title='Installing MySQL on OS X'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-3655431642901106086</id><published>2008-10-16T20:38:00.000-07:00</published><updated>2008-10-16T20:40:38.130-07:00</updated><title type='text'>Proper tarballs from aquamacs projects</title><content type='html'>Getting a bunch of dot underscore cruft in your tarballs?&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;export COPY_EXTENDED_ATTRIBUTES_DISABLE=true&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;see &lt;a href="http://www.litfuel.net/plush/?postid=147"&gt;comment by David Olinsky here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-3655431642901106086?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/3655431642901106086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=3655431642901106086' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/3655431642901106086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/3655431642901106086'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/10/proper-tarballs-from-aquamacs-projects.html' title='Proper tarballs from aquamacs projects'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-7864808548480538211</id><published>2008-10-16T12:52:00.000-07:00</published><updated>2008-10-16T13:14:03.681-07:00</updated><title type='text'>Python First</title><content type='html'>"But there is emerging consensus in the scripting community that Python is the right choice for freshman programming. Ruby would also be a defensible choice. Python and Ruby have the enviable properties that almost no one dislikes them, and almost everyone respects them. Both languages support a wide variety of programming styles and paradigms and satisfy practitioners and theoreticians equally. Both languages are carefully enough designed that 'correct' programming practices can be demonstrated and high standards of code quality can be enforced. The fact that Google stands by Python is an added motivation for undergraduate majors." -&lt;a href="http://lambda-the-ultimate.org/node/2941"&gt;Ronald Loui&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-7864808548480538211?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/7864808548480538211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=7864808548480538211' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7864808548480538211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7864808548480538211'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/10/python-first.html' title='Python First'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-1584587911237962531</id><published>2008-08-16T15:47:00.001-07:00</published><updated>2008-08-16T15:48:09.289-07:00</updated><title type='text'>How not to build a bad website</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QNv9CPAjNvE/SKdZFk1H9FI/AAAAAAAAAJk/kkO9TAJTP1c/s1600-h/Picture+3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_QNv9CPAjNvE/SKdZFk1H9FI/AAAAAAAAAJk/kkO9TAJTP1c/s400/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5235251044162204754" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-1584587911237962531?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/1584587911237962531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=1584587911237962531' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1584587911237962531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1584587911237962531'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/08/how-not-to-build-bad-website.html' title='How not to build a bad website'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_QNv9CPAjNvE/SKdZFk1H9FI/AAAAAAAAAJk/kkO9TAJTP1c/s72-c/Picture+3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-6077532686483324725</id><published>2008-07-28T20:22:00.000-07:00</published><updated>2008-07-28T20:24:35.651-07:00</updated><title type='text'>from xkcd 345</title><content type='html'>&lt;a href="http://xkcd.com/345/"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_QNv9CPAjNvE/SI6NMfNKjVI/AAAAAAAAAIk/PhbO8FOIiTg/s400/Picture+64.png" alt="" id="BLOGGER_PHOTO_ID_5228271463098387794" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-6077532686483324725?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/6077532686483324725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=6077532686483324725' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/6077532686483324725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/6077532686483324725'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/07/from-xkcd-345.html' title='from xkcd 345'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_QNv9CPAjNvE/SI6NMfNKjVI/AAAAAAAAAIk/PhbO8FOIiTg/s72-c/Picture+64.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-9092629903592926989</id><published>2008-07-24T09:13:00.000-07:00</published><updated>2008-07-24T09:16:14.984-07:00</updated><title type='text'>Reproducibility blog</title><content type='html'>John Cook has started a &lt;a href="http://reproducibleresearch.org/blog/"&gt;blog on reproducibility&lt;/a&gt; in science. H/T Greg Wilson.&lt;br /&gt;&lt;br /&gt;Salient comment: "Your result is not reproducible if you can reproduce it. Your result is reproducible if &lt;em&gt;someone else&lt;/em&gt; can reproduce it."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-9092629903592926989?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/9092629903592926989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=9092629903592926989' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/9092629903592926989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/9092629903592926989'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/07/reproducibility-blog.html' title='Reproducibility blog'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-2733201276388551073</id><published>2008-07-09T17:10:00.001-07:00</published><updated>2008-07-09T17:10:44.293-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><title type='text'>I hope this was a joke</title><content type='html'>but I &lt;a href="http://csis.pace.edu/%7Ebergin/patterns/ppoop.html"&gt;think it was serious&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-2733201276388551073?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/2733201276388551073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=2733201276388551073' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2733201276388551073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2733201276388551073'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/07/i-hope-this-was-joke.html' title='I hope this was a joke'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-349610816090272212</id><published>2008-06-30T15:21:00.000-07:00</published><updated>2008-06-30T15:26:07.291-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><title type='text'>J Wants a Mac (Vista flame)</title><content type='html'>MUD transcript:&lt;br /&gt;&lt;br /&gt;J wants another Mac.&lt;br /&gt;&lt;br /&gt;J bought a cheap laptop to last while he's living in corporate storage, it's VISTA!  Holy crap, I have the absolute lowest expectations possible about Windows, well desrved from experience, and somehow Vista blows away every shred of quality or clear thinking.  It's truly a self-caricature.  Every time you run a program it asks you if you want to run it.  Later it'll ask about getting more permissions to contniue to run!  Programs will die, and then another program runs to  "try to figure out why" the first crashed.  It's truly the most pathetic computing experience I've ever had.  OH!  And the network on the Vista box already hung once.  I was appalled.  I was restoring a backup from a PII-233MHz to this brand-new box and the best it could do was about 140KB/sec and then it hung....   My G4 Mac had no problem doing 4-6MB/sec to/from the Pentium2.&lt;br /&gt;&lt;br /&gt;J says, "And here's another absurdity: Vista is 32bit so it can't see all the  memory I bought.  M$ spent millions crippling a 64 bit OS."&lt;br /&gt;&lt;br /&gt;J says, "However, the laptop is great: 17", dual 2Gz Opteron, 4 USB, 1 FW, crappy graphics card, but here was the deal cincher: Two internal drive bays!  This box will become the new R***.com server.  I'm sure Linux will run 1000x better on this box than Vista."&lt;br /&gt;&lt;br /&gt;mt says, "Yes but Microsoft got the license fee anyway"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-349610816090272212?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/349610816090272212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=349610816090272212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/349610816090272212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/349610816090272212'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/06/j-wants-mac-vista-flame.html' title='J Wants a Mac (Vista flame)'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-1917069075139415399</id><published>2008-06-20T23:19:00.000-07:00</published><updated>2008-06-20T23:20:22.413-07:00</updated><title type='text'>client side matplotlib</title><content type='html'>&lt;a href="http://hackmap.blogspot.com/2008/06/pylab-matplotlib-imagemap.html"&gt;way cool&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-1917069075139415399?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/1917069075139415399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=1917069075139415399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1917069075139415399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1917069075139415399'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/06/client-side-matplotlib.html' title='client side matplotlib'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-5987728215116677495</id><published>2008-06-07T13:15:00.000-07:00</published><updated>2008-06-07T13:51:23.928-07:00</updated><title type='text'>App Engine OS X Confusion</title><content type='html'>Google AppEngine docs is inconsistent at this point.&lt;br /&gt;&lt;br /&gt;It offers a download of AppEngineLauncher for OS X rather than AppEngine. Installing that does NOT, per docs, put appcfg.py or dev_appserver.py in the path.&lt;br /&gt;&lt;br /&gt;It does create instances of those.&lt;br /&gt;&lt;br /&gt;Directly invoking dev_appserver.py works; modulo a warning in importing PIL; that seems OK.&lt;br /&gt;&lt;br /&gt;I see two instances of appcfg.py: in Applications/GoogleAppEngineLauncher.app//Contents/Resources :&lt;br /&gt;&lt;br /&gt;google_appengine/appcfg.py&lt;br /&gt;and&lt;br /&gt;GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/appcfg.py&lt;br /&gt;&lt;br /&gt;Neither works. They both say ImportError: No module named google. I have deployed test code effectively. I don't actually know what appcfg is supposed to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-5987728215116677495?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/5987728215116677495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=5987728215116677495' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5987728215116677495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5987728215116677495'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/06/app-engine-os-x-confusion.html' title='App Engine OS X Confusion'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-8907744822433115545</id><published>2008-06-04T11:10:00.000-07:00</published><updated>2008-06-04T11:11:59.142-07:00</updated><title type='text'>Controversy about Software in Higher Ed</title><content type='html'>&lt;a href="http://technology.newscientist.com/channel/tech/mg19726375.500-physics-tool-makes-students-miss-the-point.html"&gt;here&lt;/a&gt; and a &lt;a href="http://blog.wolfram.com/index.php?year=2008&amp;amp;monthnum=01&amp;amp;name=flipping-out-over-technology-in-education"&gt;reply here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-8907744822433115545?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/8907744822433115545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=8907744822433115545' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/8907744822433115545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/8907744822433115545'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/06/controversy-about-software-in-higher-ed.html' title='Controversy about Software in Higher Ed'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-5411731027675182865</id><published>2008-05-13T10:39:00.001-07:00</published><updated>2008-05-13T10:39:51.720-07:00</updated><title type='text'>The Secret Ingredient</title><content type='html'>&lt;a href="http://radian.org/notebook/wp-content/uploads/2008/05/guido2.jpg"&gt;http://radian.org/notebook/wp-content/uploads/2008/05/guido2.jpg&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-5411731027675182865?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/5411731027675182865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=5411731027675182865' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5411731027675182865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5411731027675182865'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/05/secret-ingredient.html' title='The Secret Ingredient'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-8596106740203106099</id><published>2008-05-12T10:47:00.000-07:00</published><updated>2008-05-12T11:00:15.011-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HPC'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='science'/><title type='text'>HPC Considered Harmful</title><content type='html'>I'm really looking forward to &lt;a href="http://pyre.third-bit.com/blog/greg-wilson"&gt;Greg Wilson's&lt;/a&gt; talk called "HPC Considered Harmful" at &lt;a href="http://www.tacc.utexas.edu/ta/ta_display.php?ta_id=100484"&gt;Scientific Software Days at TACC&lt;/a&gt;, for which I am a co-organizer. Also &lt;a href="http://center.spoke.com/info/p5wSJkT/EricJones"&gt;Eric Jones&lt;/a&gt; will be talking about "New Directions in Scientific Workflow" which sounds great too.&lt;br /&gt;&lt;br /&gt;I'm not sure what these guys will say, but I think &lt;a href="http://www.jamia.org/cgi/content/abstract/12/1/90"&gt;this&lt;/a&gt; (Carriero et al 2004) is relevant:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;The goal of [our] approach is not to reap the maximum efficiency benefits in making changes to a program. Rather the goal is to remove compute time as a rate-limiting step.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Anyway, come on down if you're in the &lt;a href="http://en.wikipedia.org/wiki/Texas"&gt;neighborhood&lt;/a&gt;!&lt;br /&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-8596106740203106099?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/8596106740203106099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=8596106740203106099' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/8596106740203106099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/8596106740203106099'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/05/hpc-considered-harmful.html' title='HPC Considered Harmful'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-6013365503710849347</id><published>2008-05-05T15:25:00.000-07:00</published><updated>2008-05-05T15:31:34.260-07:00</updated><title type='text'>Life in the Trenches, Generalized</title><content type='html'>A &lt;a href="http://freshmeat.net/articles/view/889/"&gt;really good description of the problem&lt;/a&gt; is here.&lt;br /&gt;&lt;br /&gt;It's only exacerbated when both the producers and the consumers of the software are scientists who don't think software principles are interesting and/or whose mentors don't believe in time for training on such principles. Invariably we are targetting weird platforms, too.&lt;br /&gt;&lt;br /&gt;I recently heard someone say that about 30% of professional programmers' time is spent on build issues. If scientists are as much as half as good as full-timers, that means they spend 60% of their time on build issues, but they also have to spend 50% of their time on reading and writing discipline-related stuff. That means we get negative 10% of our time for actual productive coding. If we're lucky.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-6013365503710849347?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/6013365503710849347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=6013365503710849347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/6013365503710849347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/6013365503710849347'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/05/life-in-trenches-generalized.html' title='Life in the Trenches, Generalized'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-292919860051427118</id><published>2008-04-21T22:26:00.000-07:00</published><updated>2008-04-21T22:51:13.149-07:00</updated><title type='text'>Sudden abstractions</title><content type='html'>&lt;div&gt;verbatim from "Young Archimedes" by Aldous Huxley, 1928&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(an English family spends a year in Italy and their young child befriends an older peasant boy)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;"Though fully two and a half years older than little Robin - and at that age thirty months are crammed with half a lifetime's experience - Guido took no undue advantage of his superior intelligence and strength. I have never seen a child more patient, tolerant and non-tyrannical. He never laughed at Robin for his clumsy efforts to imitate his own prodigious feats; he did not tease or bully, but helped his small companion when he was in difficulties and explained when he could not understand. In return, Robin adored him, regarded him as a model and perfect Big Boy, and slavishly imitated him in every way he could.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"These attempts of Robin's to imitate his companion were often exceedingly ludicrous. For by an obscure psychological law, words and actions in themselves quite serious become comic as soon as they are copied; and the more accurately, if the imitation is a deliberate parody, the funnier - for an overloaded imitation of someone we know does not make us laugh so much as one that is almost indistinguishably like the original. The bad imitation is only ludicrous when it is a piece of sincere and earnest flattery that does not quite come off. Robin's imitations were mostly of this kind. His heroic and unsuccessful attempts to perform the feats of strength and skill, which Guido could do with ease, were exquisitely comic. And his careful, long-drawn imitations of Guido's habits and mannerisms were no less amusing. Most ludicrous of all, because most earnestly undertaken and most incongruous in the imitator, were Robin's impersonations of Guido in a pensive mood. Guido was a thoughtful child given to brooding and sudden abstractions. One would find him sitting in a corner by himself, chin in hand, elbow on knee, plunged, to all appearances in the profoundest meditation."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(Guido is discovered to have a gift for mathematics.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"This child, I thought, has had the fortune to be born at a time when he will be able to make good use of his capacities. He will find the most elaborate analytical methods lying readily to his hand; he will have a prodigious experience behind him. Suppose he had been born while Stonehenge was building; he might have spent a lifetime discovering the rudiments, guessing darkly where he might have had a chance of proving. Born at the time of the Norman Conquest, he would have had to wrestle with all the preliminary difficulties created by an inadequate symbolism; it would have taken him long years, for example, to learn the art of dividing MMMCCCCLXXXVIII by MCMXIX. In five years, nowadays, he will learn what it took generations of Men to discover."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(Alas the story ends sadly for the fictitious young Guido, while happily for all of us in real life, the analogy breaks down. Clearly Guido should have contrived to be born not just in the modern age but also in Holland...)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-292919860051427118?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/292919860051427118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=292919860051427118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/292919860051427118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/292919860051427118'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/04/sudden-abstractions.html' title='Sudden abstractions'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-8597828873425592451</id><published>2008-04-21T10:53:00.000-07:00</published><updated>2008-04-21T10:56:48.361-07:00</updated><title type='text'>Now let me think a minute, son</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_QNv9CPAjNvE/SAzVLdIsvAI/AAAAAAAAAF8/y8KM5wweW1k/s1600-h/Picture+12.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_QNv9CPAjNvE/SAzVLdIsvAI/AAAAAAAAAF8/y8KM5wweW1k/s400/Picture+12.png" alt="" id="BLOGGER_PHOTO_ID_5191758863227730946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ah, yes, that can be easily done...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-8597828873425592451?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/8597828873425592451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=8597828873425592451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/8597828873425592451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/8597828873425592451'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/04/now-let-me-think-minute-son.html' title='Now let me think a minute, son'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_QNv9CPAjNvE/SAzVLdIsvAI/AAAAAAAAAF8/y8KM5wweW1k/s72-c/Picture+12.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-4214081145654697138</id><published>2008-03-30T19:27:00.000-07:00</published><updated>2008-03-30T19:32:15.180-07:00</updated><title type='text'>More Python and Climate</title><content type='html'>Apparently my rants got linked by &lt;a href="http://gravityloss.wordpress.com/2008/01/02/climategooglecom/"&gt;GravityLoss,&lt;/a&gt; who understands that I am saying something about Python and about modern methodologies, but apparently isn't sure exactly what.&lt;br /&gt;&lt;br /&gt;Here's my reply:&lt;br /&gt;&lt;br /&gt;Hi and thanks for the links.&lt;br /&gt;&lt;br /&gt;Make no mistake, I am a Python fanboy. I really doubt it's possible to do much better than Python at our present level of understanding of how to control computers.&lt;br /&gt;&lt;br /&gt;As Paul Graham explains, any assertion that a more advanced technology Y is better than technology X tends to fall on deaf ears on users of technology X, because what they think is doable is defined by technology X. It is perfectly possible to get no advantage from Y because it is always possible to do X-like things with it.&lt;br /&gt;&lt;br /&gt;I am proposing to do somewhat different things with Y. I am not the greatest expert on Y, but I do see things to do relevant things with Y that are not entirely X-like.&lt;br /&gt;&lt;br /&gt;I would like to have software managers more experienced than myself involved. Google are the folk with the disposable wealth and the farsighted motivation as well as some of the relevant skills. I sort of wish they'd do what I want to do rather than leaving me scrambling to do it. I retain enough hubris to suggest that if they tried they'd do well to get me on the team. Realistically I probably will not have their help nor the help of an experienced software manager, though any pitching in from JM or JM would be most welcome.&lt;br /&gt;&lt;br /&gt;There's nothing magic about Google or Python that aren't summed up in Clarke's Law: any sufficiently advanced technology is indistinguishable from magic. The sad thing is that much of the academy, including climate science, is far enough behind the cutting edge of what is possible that comparable productivity would look magical.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-4214081145654697138?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/4214081145654697138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=4214081145654697138' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4214081145654697138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4214081145654697138'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/03/more-python-and-climate.html' title='More Python and Climate'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-2386223212501841065</id><published>2008-03-21T13:37:00.001-07:00</published><updated>2008-04-21T23:01:40.676-07:00</updated><title type='text'>The elegance of Fortran</title><content type='html'>You know, the point of OOP is to SAVE work. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; Yes, the following is the most trivial and trite and pointless possible example of OOP.  I am not showing you code that is interesting. I am just comparing it with bolted-on OOP. Have a look &lt;a href="http://www.sesp.cse.clrc.ac.uk/Publications/oo_fortran/node23.html#app_polymorphism"&gt;at the Fortran equivalent&lt;/a&gt;. It's completely equivalent, note. &lt;br /&gt;&lt;br /&gt;The "polymorphism" section form the Fortran is expressed in Python as an arbitrarily small amount of whitespace. And you thought whitespace was a drawback of Python!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;def vectorsum(vec1,vec2):&lt;br /&gt;...return map(sum,zip(vec1,vec2))&lt;br /&gt;&lt;br /&gt;class Circle(object):&lt;br /&gt;...def __init__(self,center,radius):&lt;br /&gt;    ......self.center = center&lt;br /&gt;    ......self.radius = radius&lt;br /&gt;&lt;br /&gt;...def __str__(self):&lt;br /&gt;    ......return "circle of radius %s at %s" % (self.radius, self.center)&lt;br /&gt;&lt;br /&gt;...def move(self,translation):&lt;br /&gt;    ......assert len(translation) == len(self.center)&lt;br /&gt;    ......self.center = vectorsum(self.center, translation)&lt;br /&gt;&lt;br /&gt;class Square(Circle):&lt;br /&gt;...""" note: can inherit constructor for circle; treat radius as length"""&lt;br /&gt;...def __str__(self):&lt;br /&gt;   ......s = self.radius&lt;br /&gt;   ......shifts = ((0,0),(0,s),(s,0),(s,s))&lt;br /&gt;   ......corners = tuple([vectorsum(self.center,shift) for shift in shifts])&lt;br /&gt;   ......return "square at points %s %s %s %s" % corners&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-2386223212501841065?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/2386223212501841065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=2386223212501841065' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2386223212501841065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2386223212501841065'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/03/elegance-of-fortran.html' title='The elegance of Fortran'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-4112225235695629911</id><published>2008-03-15T07:55:00.000-07:00</published><updated>2008-03-15T08:03:14.194-07:00</updated><title type='text'>PyCon snippets</title><content type='html'>Stuff to look into:&lt;br /&gt;&lt;br /&gt;iPy1: a spawned interpreter on every CPU&lt;br /&gt;&lt;br /&gt;MPI4py: the winner for fine-grained parallelism&lt;br /&gt;&lt;br /&gt;distributed NumPy array: Brian Granger&lt;br /&gt;&lt;br /&gt;"it's like a beginner trying to make a souffle; you WILL get an egg dish"&lt;br /&gt;&lt;br /&gt;stats.bayes.mvs&lt;br /&gt;&lt;br /&gt;new buffer type in Py 3, Travis O in charge, imports NumPy arrays; PEP 3118&lt;br /&gt;&lt;br /&gt;struct module&lt;br /&gt;&lt;br /&gt;Amazon's elastic cloud; Pete Skomorock's ElastiWulf&lt;br /&gt;&lt;br /&gt;Trestle&lt;br /&gt;&lt;br /&gt;noonhat.com ; saturdayhouse.prg&lt;br /&gt;&lt;br /&gt;pyxpcomext.com&lt;br /&gt;&lt;br /&gt;freebase&lt;br /&gt;&lt;br /&gt;argparse&lt;br /&gt;&lt;br /&gt;orbited&lt;br /&gt;&lt;br /&gt;math instruction in APL&lt;br /&gt;&lt;br /&gt;if you want to start a conversation, ask a question&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-4112225235695629911?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/4112225235695629911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=4112225235695629911' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4112225235695629911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4112225235695629911'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/03/pycon-snippets.html' title='PyCon snippets'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-1994821695874025756</id><published>2008-02-15T09:01:00.000-08:00</published><updated>2008-02-15T09:26:31.669-08:00</updated><title type='text'>Insufficient, Inaccurate and Inconsistent</title><content type='html'>The data I mean...&lt;br /&gt;&lt;br /&gt;The job of the geophysicist, I was told yesterday at a seminar given by Mrinal Sen, is essentially impossible. It is, given data that is insufficient, inaccurate and inconsistent to come up with a useful model.&lt;br /&gt;&lt;br /&gt;Interestingly, it is unlikely that the skeptics' squad will make much of this admission, since the utility of the models Sen is specifically interested in is whether they correctly inform placement of oil well drilling efforts.&lt;br /&gt;&lt;br /&gt;Nevertheless wells do get drilled. In the past it was a matter of some combination of analysis and intuition. Nowadays, statistics works in there as well.&lt;br /&gt;&lt;br /&gt;Does climatology partake of these fundamental problems? Not as much as seismology, really; our observations are relatively accurate and consistent compared to seismic data. They are far from sufficient for long time scale processes, and the formalism of use of paleodata still leaves much to be desired.&lt;br /&gt;&lt;br /&gt;Nevertheless, the future will happen, and we will do something about it. The question at hand for climate modelers and their customers is to what extent the models ought to affect what we do.&lt;br /&gt;&lt;br /&gt;Computational geosciences and computational biological sciences are very different from computational engineering in flavor. In engineering (aside from civil and architectural, which partakes slightly of our problems) the system is entirely controlled and hence the tradeoffs between model expense and model accuracy are well understood.  By contrast, our problem is to establish the right model based on observational data and theory.&lt;br /&gt;&lt;br /&gt;This is called "inverse modeling" in some circles. I dislike the name and regret the loss of the appropriate term "cybernetics" to Hollywood and to some rather ill-defined corners of computer science. I propose, therefore, to call what some computational sciences do "meta-modeling", wherein the model itself (and the nature of its relationship to observation and theory) is construed as a legitimate object of study.&lt;br /&gt;&lt;br /&gt;It is interesting how well-established this modality of thought is in mineral exploration (where there is, after all, a bottom line to take care of) and how controversial it remains in climate science. I have some thoughts as to why this might be. Some of the problems are directly a consequence of the unfairness of the unfair criticisms to which we have been subjected; this makes a fair assessment of fair crticisms fraught with peril. Others emerge from the history of the field and the social structures in which the work is performed.&lt;br /&gt;&lt;br /&gt;It seems obvious to me that if the computational resources applied to climate go up several orders of magnitude, the correct approach to this is not, or at the very least not solely,  to build a small number of immensely complex modeling platforms which use all the available computational power. Rather, it is to apply the (expensive but powerful) inverse modeling methodology to explore the model space of simpler models; to improve the expressiveness of model description languages; and to use these tools to build a much larger and more formal ensemble of climate modeling tools.&lt;br /&gt;&lt;br /&gt;I also have a question whether the most policy-relevant models and the most science-relevant models are necessarily the same. I suspect otherwise. Climate modelers are so defended against the accusation of heuristics that they fail to apply the heuristics that might apply in an applied science effort.&lt;br /&gt;&lt;br /&gt;Sen presented an interesting taxonomy of inverse methods at his talk. Much more to follow on this subject, hopefully.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-1994821695874025756?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/1994821695874025756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=1994821695874025756' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1994821695874025756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1994821695874025756'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/02/insufficient-inaccurate-and.html' title='Insufficient, Inaccurate and Inconsistent'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-1489936262887438809</id><published>2008-02-12T09:40:00.001-08:00</published><updated>2008-02-12T09:54:01.737-08:00</updated><title type='text'>Computational Silence</title><content type='html'>Still not sure whether to take Mr. Hughes seriously, even though he echoes some of my points. His latest &lt;a href="http://danhughes.auditblogs.com/2008/02/11/radiative-equilibrium-models-and-the-weather-temperature/#comments"&gt;looks pretty confused at first reading&lt;/a&gt; but it's far from my expertise. Maybe Eli will have a look.&lt;br /&gt;&lt;br /&gt;That all said, I am not one who says all is right with computational climatology.&lt;br /&gt;&lt;br /&gt;My friend JL sends along an article by (not captain) James Quirk that does a good job outlining the quandary and some of the efforts toward a solution. Climate science is particularly backward in adopting these measures. There's a misperception that all GCMs solve the same problem that is understandable in the public but hard to account for within the field.&lt;br /&gt;&lt;br /&gt;The article is called "&lt;a href="http://www.springerlink.com/content/t73q6574726k4777/fulltext.pdf"&gt;Computational Science: Same Old Silence, Same Old Mistakes&lt;/a&gt;". It appears in a volume on AMR. It is behind a Springer firewall, so if you can't get the PDF note that &lt;a href="http://books.google.com/books?id=R4YFoTP3l6cC&amp;amp;pg=PA3&amp;amp;lpg=PA3&amp;amp;dq=Quirk+Same+Old+Mistakes&amp;amp;source=web&amp;amp;ots=qHx32YuWoB&amp;amp;sig=NVjmjDe2g7xASC1ZZPx3qNgvOow#PPA3,M1"&gt;Google will display a scan of it&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;(Remember, rationally, the&lt;a href="http://initforthegold.blogspot.com/2008/01/climate-models-best-hope-of-policy.html"&gt; less we trust the models the more severe our policy constraints &lt;/a&gt;on modifying the system should be.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-1489936262887438809?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/1489936262887438809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=1489936262887438809' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1489936262887438809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1489936262887438809'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/02/computational-silence.html' title='Computational Silence'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-804356874618131813</id><published>2008-02-12T09:19:00.001-08:00</published><updated>2008-02-12T09:22:01.813-08:00</updated><title type='text'>Why Pencil Science?</title><content type='html'>This blog has, at least for now, wandered from its original intent, but its original explanation of purpose is worth saving. I do think computer science is for everybody, not just middle school kids but even climatologists...&lt;br /&gt;&lt;blockquote&gt;This is a blog about the nuts and bolts of computer literacy from a&lt;br /&gt;Pythonic perspective.&lt;br /&gt;&lt;br /&gt;I would like not merely to defend the position that computer&lt;br /&gt;programming is "for everybody" (including children, intelligent&lt;br /&gt;adults, and scientists) but also to examine the proposition that&lt;br /&gt;Python is the appropriate vehicle for such a de-professionalization of&lt;br /&gt;programming.&lt;br /&gt;&lt;br /&gt;Of course, "computer science is not about computers" but about&lt;br /&gt;formally expressing processes using symbols. The misnomer is&lt;br /&gt;consequential in how most people think about the question of the role&lt;br /&gt;of programming in education.&lt;br /&gt;&lt;br /&gt;We don't teach children how to write because we expect them all to be&lt;br /&gt;professional writers. Professional writers are not opposed to literacy&lt;br /&gt;on the grounds that they will lose readership. We do not call the&lt;br /&gt;ability to write "pencil science".&lt;br /&gt;&lt;br /&gt;Is writing (pencil science) for everybody? That wasn't clear a&lt;br /&gt;thousand years ago. Can "computer science" be for everybody too?&lt;/blockquote&gt;I'll be reorganizing my online presence soon. Still thinking about what to do...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-804356874618131813?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/804356874618131813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=804356874618131813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/804356874618131813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/804356874618131813'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/02/why-pencil-science.html' title='Why Pencil Science?'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-8029732904704300640</id><published>2008-02-07T17:00:00.000-08:00</published><updated>2008-02-08T10:38:54.874-08:00</updated><title type='text'>Bad month index=36; help, you prawns!</title><content type='html'>Recall we are trying to get a sensitivity to 2xCO2; the public thinks of this as the primary use case.&lt;br /&gt;&lt;br /&gt;Most of what was hanging me up for the past week was building a 6Mb one-time data file (containing climatological mixed layer depth, clamped at 200m; the magic number is somewhat arbitrary and hard-wired, but we suppose others have put thought into it.) It would have been nice if I could just download the file. It turned out I needed a c compiler compatible with the Fortran compiler that built netcdf. The magic word was "icc", specifically&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;setenv CC=icc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once that was done, it turned out I had some other data file to dig up. I had trouble tracking down my ncar UID/password (as if this data needed to be kept under wraps for some reason). Then I found that the URL specified in the README was incorrect! Eventually tracked the file down with Google. Built (huzzah) the heat flux boundary condition. Thought I was done.&lt;br /&gt;&lt;br /&gt;Today I tried to submit the job. Well, still a use case I;ve never run. I was hung up for some time on the error messsage "BNDDYI: Bad month index=36" which is not mentioned in CAM documentation but &lt;a style="font-weight: bold;" href="http://www.cgd.ucar.edu/cms/ccm3/ccm3lsm_doc/ccm3_doc/UG-124.html"&gt;is mentioned in the CCM3.6 documentation&lt;/a&gt;! (an ancestor)&lt;br /&gt;&lt;br /&gt;It seems the month number should be a number between 1 and 12 (reasonable). No idea where the number 36 came from. I look into my data file and see the following for dates:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; time = 116.5, 215, 316.5, 416, 516.5, 616, 716.5, 816.5, 916, 1016.5, 1116, &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;1216.5 ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are twelve of them as needed, but...&lt;br /&gt;&lt;br /&gt;Those are indeed months in a peculiar sense. Consider it a puzzle, and here is your clue:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        double time(time) ;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                time:units = "day as %m%d.%f" ;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                time:axis = "T" ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Go figure. No clue where the 36 comes from. Charles advises, though, that I should not specify a start and end date for a slab run. So I make no effort to surgically fix the month numbers and remove the start and end date, specifying a duration instead. (Because I specify in days rather than seconds, I use a negative number...)&lt;br /&gt;&lt;br /&gt;The 36 BNDDYI message goes away! &lt;span style="font-weight: bold;"&gt;Apparently the error "month number is 36" really means "you can't specify dates on a slab run". &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The model gets considerably further now. It starts to run the first time step and then proffers this droll message a few times&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; sublimate away all sea ice&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; something is probably seriously wrong&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; ice state at dh stop nstep =            0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;amid some other unexpected output, and then aborts.&lt;br /&gt;&lt;br /&gt;Three weeks and counting. We wanted a result by next Monday and this will take 48 hours to run. Groan.&lt;br /&gt;&lt;br /&gt;Somebody else has come to this pass, describing it as "&lt;a href="http://forum.cgd.ucar.edu/showthread.php?t=313"&gt;display the seriously error&lt;/a&gt;". Note the useful assistance provided by the community. There's also something in Chinese &lt;a href="http://64.233.179.104/translate_c?hl=en&amp;amp;sl=zh-CN&amp;amp;u=http://bbs.lasg.ac.cn/cgi-bin/forum/post.cgi%3Faction%3Dcopy1%26forum%3D11%26topic%3D1872%26postno%3D1&amp;amp;prev=/search%3Fq%3DCAM%2B%2522something%2Bis%2Bprobably%2Bseriously%2Bwrong%2522%26hl%3Den%26client%3Dfirefox-a%26rls%3Dorg.mozilla:en-US:official%26hs%3DGMc"&gt;that Google translates&lt;/a&gt; as follows:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="" onmouseover="_tipon(this)" onmouseout="_tipoff()"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;help you prawns, the slab ocean model CAM operations serious mistake!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;-=-=-=-=-=&gt; Turn CCM and CAM counterparts all know, by adding a simple ocean model (slab ocean model) running CAM, but regardless CAM3.0, or CAM3.1, there are the same mistakes can not continue to run, the Daxia Please help!&lt;/blockquote&gt;&lt;span style="color: rgb(192, 192, 192);"&gt;Any prawns out there have any advice for me?&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; Running at last! The last hurdle was knowing that you have to replace the file&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;cami_0000-09-01_64x128_L26_c030918.nc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;with the file&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;cami_0000-01-01_64x128_T42_L26_SOM_c030918.nc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Unlike the mixed layer depths, this is actually distributed in the initial conditions dataset. I am also using a topography file that differes from the standard one. Not sure why, this is based on lore and not knowledge. It's called&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;topo-from-cami_0000-01-01_64x128_T42_L26_SOM_c030918.nc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I don't know its provenance, but possibly the name is correct. If that's the case, though, it isn't clear why there are two different files at all. Some totally undocumented use case perhaps?&lt;br /&gt;&lt;br /&gt;This is actually consistent with the message from "seriously message" guy. It is not documented as part of the procedure for the use case in the documents. There is a tiny clue in the redme for defineqflux:&lt;br /&gt;&lt;blockquote style="font-family: verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Another executable available (but hopefully unnecessary) in the definesomic&lt;br /&gt;module is (also) called definesomic.  It adds necessary SOM fields to an&lt;br /&gt;initial dataset if they are not already there.&lt;/span&gt;&lt;/blockquote&gt;If there are fields missing from the initial conditions, you'd think something better than "something is seriously wrong" and lots of numerical output would be possible.&lt;br /&gt;&lt;br /&gt;Not sure how much further to investigate.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-8029732904704300640?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/8029732904704300640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=8029732904704300640' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/8029732904704300640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/8029732904704300640'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/02/bad-month-index36.html' title='Bad month index=36; help, you prawns!'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-7327272999608856413</id><published>2008-01-29T09:10:00.000-08:00</published><updated>2008-02-01T12:58:23.598-08:00</updated><title type='text'>My Deep Naivetee</title><content type='html'>I've made a couple of comments on Bryan's blog early this morning. One is a continuation of my &lt;a href="http://home.badc.rl.ac.uk/lawrence/blog/2008/01/23/using_more_computer_power%2C_revisited."&gt;usual ranting&lt;/a&gt;, and another is an expression of confusion about &lt;a href="http://www.blogger.com/http://www.blogger.com/img/gl.link.gif/home.badc.rl.ac.uk/lawrence/blog/2008/01/22/whither_service_descriptions"&gt;what web services have to do with anything&lt;/a&gt; scientific coders care about.&lt;br /&gt;&lt;br /&gt;Meanwhile I am amused to see &lt;a href="http://danhughes.auditblogs.com/2008/01/07/another-nasagiss-modele-code-fragment/"&gt;my position described as "deeply naive"&lt;/a&gt; in a blog by Dan Hughes that I haven't spotted before. It seems worth following for the in crowd.&lt;br /&gt;&lt;br /&gt;I don't, actually, think a ground-up rewrite would be easy, and I have some ideas for a less ambitious approach to prove the pudding for a higher level abstraction approach. We'll see what NSF says about it.&lt;br /&gt;&lt;br /&gt;However, I think the tenacious attachment to the code which Dan himself goes so far as to describe as "very olde, very poorly constructed, undocumented, and yet very actively used" (much further than I would go) is damned peculiar. It seems to imply that what we are doing doesn't matter. Well, if it doesn't matter we should quit, and if it does matter we should bite the bullet and write something clean and maintainable and (dare I say it) even literate.&lt;br /&gt;&lt;br /&gt;In the end this matter is too important for anything less than maximal transparency. It completely baffles me that this goal is so thoroughly outside the field of vision of practitioners. I think it's fundamental.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: Whoops. I mistook what Dan Hughes was about. He isn't attached to the code.  He doesn't work with the codes, he just snipes at them from a distance. He's an "auditor". Likely, he doesn't want to believe that climate modeling is feasible, or at least is playing to an audience that thinks like that. One can hope he does not reach the &lt;a href="http://initforthegold.blogspot.com/2008/01/climate-models-best-hope-of-policy.html"&gt;illogical conclusion&lt;/a&gt; that climate protection is not a useful goal of policy pending the substantial improvement of such models.&lt;br /&gt;&lt;br /&gt;Let me make it very clear from observing real productive climate scientists that extant models are useful tools for science, and that the scientists are well aware of their imperfections and flaws.&lt;br /&gt;&lt;br /&gt;This doesn't mean they/we should be immune from criticism, nor that we have a clear sense of how useful the extant models are for projection. I have a lot doubts on that score, but I take the rational risk-weighted response of being more worried about our collective future, rather than less so, as a consequence.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Further Update&lt;/span&gt;: That said, the discussions on Hughes blog are not without value. I found &lt;a href="http://danhughes.auditblogs.com/2006/12/11/a-giss-modele-code-fragment/"&gt;this one&lt;/a&gt; especially interesting.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Further Update: &lt;/span&gt;While it might appear that there is no intent by Hughes to provide a constructive alternative (see comment #6 to &lt;a href="http://danhughes.auditblogs.com/2008/01/07/another-nasagiss-modele-code-fragment/"&gt;this thread&lt;/a&gt;) he does in fact offer us up a strawman &lt;a href="http://danhughes.auditblogs.com/files/2007/02/vandvandsqapost.pdf"&gt;proposal for an alternative approach&lt;/a&gt; here (linked from #7 in the same thread). His server is slow and unreliable, but it's there on occasion. Reading...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-7327272999608856413?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/7327272999608856413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=7327272999608856413' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7327272999608856413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7327272999608856413'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/01/my-deep-naivetee.html' title='My Deep Naivetee'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-3667078176579370992</id><published>2008-01-28T10:52:00.000-08:00</published><updated>2008-01-28T11:42:08.219-08:00</updated><title type='text'>Life in the trenches III</title><content type='html'>One of my ensembles has died. The run dropped an error file as follows (excerpt):&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;print_memusage iam  47 stepon after dynpkg. -1 in the next line means unavailable&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;print_memusage: size, rss, share, text, datastack=   52301   22403    4114     806       0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;print_memusage iam  13 stepon after dynpkg. -1 in the next line means unavailable&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;print_memusage: size, rss, share, text, datastack=   52441   22616    4121     806       0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;print_memusage iam  36 stepon after dynpkg. -1 in the next line means unavailable&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;print_memusage: size, rss, share, text, datastack=   52135   24788    5987     806       0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[0] [MPI Abort by user] Aborting Program!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;done.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/opt/lsf/bin/ibrun: line 6:   545 Killed                  pam -g 1 mvapich_wrapper $*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[0] [MPI Abort by user] Aborting Program!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;done.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/opt/lsf/bin/ibrun: line 6: 13870 Killed                  pam -g 1 mvapich_wrapper $*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[0] [MPI Abort by user] Aborting Program!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;done.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/opt/lsf/bin/ibrun: line 6:  3813 Killed                  pam -g 1 mvapich_wrapper $*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[0] [MPI Abort by user] Aborting Program!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;done.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;The error file is 1132 lines long. Python would give me more legible information.&lt;br /&gt;&lt;br /&gt;I am simply going to hope it has something to do with Lonestar's I/O problems. I need to rerun the exact case, of course.&lt;br /&gt;&lt;br /&gt;The ensemble controller somehow knew something was awry. It wasn't written by a very seasoned programmer and I'm eager to rewrite it but the time never shows up. Fortunately this time it appears to have done the right thing.&lt;br /&gt;&lt;br /&gt;Meanwhile&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Charles has convinced me that he really has something going with his current proposal so I am trying to help firm up the text (for practical purposes, on my own time)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I still have yet to get sensible output from defineqflux, or understand how to build it for that matter (see Trenches II)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I need to back up my expired files from Chicago&lt;/li&gt;&lt;li&gt;I need to document and version control my December work&lt;/li&gt;&lt;li&gt;I need to finish building the NCAR diagnostic toolkit now that NCL works&lt;/li&gt;&lt;li&gt;round up speakers for scientific software day&lt;br /&gt;&lt;/li&gt;&lt;li&gt;somehow we need a local MPI install; yow!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;eventually we need a CCSM build on a TACC platform, but don't hold your breath&lt;/li&gt;&lt;/ul&gt;This is on halftime! I'm not even supposed to be in on Mondays!&lt;br /&gt;&lt;br /&gt;Will I ever write a line of my own code again?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update: &lt;/span&gt;The error file says nothing whatsoever. Successful runs have the same errors, up to and not including the Abort messages, where instead they contain 64 lines consisting of "0".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-3667078176579370992?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/3667078176579370992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=3667078176579370992' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/3667078176579370992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/3667078176579370992'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/01/life-in-trenches-iii.html' title='Life in the trenches III'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-7405574070599648086</id><published>2008-01-25T12:36:00.000-08:00</published><updated>2008-01-25T12:53:09.529-08:00</updated><title type='text'>Why Python?</title><content type='html'>Other people have other reasons, but mine is succinctly summarized by &lt;a href="http://www.prescod.net/"&gt;Paul Prescod&lt;/a&gt; in his article &lt;a href="http://www.prescod.net/python/IsPythonLisp.html"&gt;On the Relationship between Python and Lisp&lt;/a&gt;. Here's the core of the argument:&lt;br /&gt;&lt;blockquote  style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Paul Graham says that a language designed for "the masses" is actually being designed for "dufuses". My observation is that some of the smartest people on the planet are dufuses when it comes to programming, (or in some cases just dynamic programming languages) and I am pleased to share a language (and code!) with them.&lt;br /&gt;&lt;br /&gt;I usually spend a big chunk of my day in Python. But most professional programmers will not be able to do that until Python is a dominant language. In the meantime they must switch back and forth between Python and the language of their day-job. Python is designed to make that easy. During the day they can pound out accounting code and at night switch to hacking distributed object oriented file systems. Every intuititively named function name makes it that much easier to "swap" Python back into your brain. After we have been away from a language for a while, we are all dufuses, and every choice made in favor of the duffers actually benefits even high-end programmers.&lt;br /&gt;&lt;br /&gt;I get paid to share my code with "dufuses" known as domain experts. Using Python, I typically do not have to wrap my code up as a COM object for their use in VB. I do not have to code in a crappy language designed only for non-experts. They do not have to learn a hard language designed only for experts. We can talk the same language. They can read and sometimes maintain my code if they need to.&lt;br /&gt;&lt;br /&gt;From a purely altruistic point of view, it feels good to me to know that I am writing code (especially open source code) that can become a lesson for a high school student or other programming beginner. I like to give programming classes to the marketing departments at the companies where I work.&lt;br /&gt;&lt;br /&gt;Even hard-core geeks get a certain aesthetic pleasure out of using something that feels minimal and simple because most of the complexity has been hidden away or removed.&lt;/span&gt;&lt;/blockquote&gt;Code is a communication medium. The machine is not the only reader. Python is the only language explicitly designed with both beginners and experts in mind. This has direct benefits for the transition from beginner to expert, and it also has direct benefits for development collaboration among groups with distinct expertise.&lt;br /&gt;&lt;br /&gt;Here is an example. I have never taken a compiler course and I still consider code compilation to be deep magic, though not as much as I did before Python began boosting my sophistication. Nevertheless, I can understand and appreciate the following.&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;pre&gt;# romanNumerals.py&lt;br /&gt;#&lt;br /&gt;# Copyright (c) 2006, Paul McGuire&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;from pyparsing import *&lt;br /&gt;&lt;br /&gt;def romanNumeralLiteral(numeralString, value):&lt;br /&gt;return Literal(numeralString).setParseAction(replaceWith(value))&lt;br /&gt;&lt;br /&gt;one         = romanNumeralLiteral("I",1)&lt;br /&gt;four        = romanNumeralLiteral("IV",4)&lt;br /&gt;five        = romanNumeralLiteral("V",5)&lt;br /&gt;nine        = romanNumeralLiteral("IX",9)&lt;br /&gt;ten         = romanNumeralLiteral("X",10)&lt;br /&gt;forty       = romanNumeralLiteral("XL",40)&lt;br /&gt;fifty       = romanNumeralLiteral("L",50)&lt;br /&gt;ninety      = romanNumeralLiteral("XC",90)&lt;br /&gt;onehundred  = romanNumeralLiteral("C",100)&lt;br /&gt;fourhundred = romanNumeralLiteral("CD",400)&lt;br /&gt;fivehundred = romanNumeralLiteral("D",500)&lt;br /&gt;ninehundred = romanNumeralLiteral("CM",900)&lt;br /&gt;onethousand = romanNumeralLiteral("M",1000)&lt;br /&gt;&lt;br /&gt;numeral = ( onethousand | ninehundred | fivehundred | fourhundred |&lt;br /&gt;       onehundred | ninety | fifty | forty | ten | nine | five |&lt;br /&gt;       four | one ).leaveWhitespace()&lt;br /&gt;&lt;br /&gt;romanNumeral = OneOrMore(numeral).setParseAction( lambda s,l,t : sum(t) )&lt;br /&gt;&lt;br /&gt;print romanNumeral.parseString("XLII") # prints "42"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Try doing that in a dozen or so lines of C++ or Java, mate, so that a random reader could get half a clue as to what was happening! Yes of course the "import" statement hides a great deal of magic, but &lt;a href="http://xkcd.com/353/"&gt;that's the whole point&lt;/a&gt;, see?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-7405574070599648086?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/7405574070599648086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=7405574070599648086' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7405574070599648086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7405574070599648086'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/01/why-python.html' title='Why Python?'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-1921327496895651273</id><published>2008-01-23T11:34:00.000-08:00</published><updated>2008-01-31T12:54:07.231-08:00</updated><title type='text'>Life in the Trenches: Part II</title><content type='html'>This story is probably more illustrative (than is Part I) of some of our productivity sinks:&lt;br /&gt;&lt;br /&gt;We have a modified set of &lt;a href="http://www.ccsm.ucar.edu/models/atm-cam/"&gt;CAM&lt;/a&gt; parameters that demonstrably improves climate fidelity, and are looking to establish its CO2 doubling sensitivity. This is an atmosphere-only model with six of its magic numbers tweaked by our (UTIG's, i.e., Sen, Stoffa and Jackson's) smart ensemble search algorithm. Our suspicion is that we will see a sensitivity closer to 3 C (increasingly regarded as the most likely value) rather than NCAR's 2.4 C.&lt;br /&gt;&lt;br /&gt;Now, CO2 sensitivity is a very common use case, perhaps the most famous of all. However, rather than a data ocean it requires an interactive ocean in order to make any sense.&lt;br /&gt;&lt;br /&gt;This use case is so common it &lt;a href="http://www.ccsm.ucar.edu/models/atm-cam/docs/usersguide/node15.html#SECTION00632000000000000000"&gt;merits a section in the User Guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You will note that the description of what is going on is strikingly terse. If you haven't hung around climate modelers you will not be able to parse it at all, I'll wager.&lt;br /&gt;&lt;br /&gt;So note if you can or take my word if you must that step 1 seems more or less model independent, though admittedly it is resolution dependent. However, since CAM only supports a few resoilutions, it's unclear why I should have to jump through the hoops.&lt;br /&gt;&lt;br /&gt;Nevertheless, deep within the CAM file hierarchy you do find the directory in question with a perfectly fine Makefile to build  &lt;span style="font-family:courier new;"&gt;definemldlxl&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;definemldbdy&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;defineqflux&lt;/span&gt;, which in my case naturally doesn't work.&lt;br /&gt;&lt;br /&gt;You sort of have to know to tell Lonestar &lt;span style="font-family:courier new;"&gt;module load netcdf&lt;/span&gt; and then env to get the netcdf paths from the environment, which you can then use to create the environment variables the NCAR buld file expects. None of this is documented anywhere, and this is enough to get through the compile phase but still no joy at link time.&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;/opt/apps/netcdf/netcdf-3.6.1/lib/libnetcdf.a(attr.o): In function `dup_NC_attrarrayV':&lt;br /&gt;/home/build/rpms/BUILD/netcdf-3.6.1/src/libsrc/attr.c:199: undefined reference to `_intel_fast_memset'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Scratching my head on this one. Maybe someone at TACC can help; will file a ticket and see what happens.&lt;br /&gt;&lt;br /&gt;Meanwhile, we have tracked down an executable for the last one in a directory of a worker who has left and his data file for the first phase; we are hoping that is good enough. Note, though, that the docs do not say what fields need to be in the output of the file you pass to defineqflux. It turns out that the ones we normally save aren't the right ones.&lt;br /&gt;&lt;br /&gt;No problem, you say. This is a runtime variable ('namelist' variable in fortranese) and I won't have to rebuild the whole model for that, will I? I'll just add the missing fields (rummage through the source code to find them... rummage, rummage...) and Bob will be my uncle.&lt;br /&gt;&lt;br /&gt;Well actually this would have cost me two days, except that Lonestar lost two days to a panic and I was off Monday, so it cost me a whole week. You see, if you do a restart run, (i.e., a continuation of a prior experiment) the fortran will happily ingest your list of output variables and ignore them (without any message to that effect) in favor of the list you used in the spinup run. No, to have your namelist read and actually used, you have to to a "branch" run rather than a "restart" run, which requires significantly different set of namelist parameters that is essentially ill-documented. In fact if you try to do this based on the CAM manual, you will not find sufficient information. The clew, as Sherlock Holmes would say, is &lt;a href="http://www.ccsm.ucar.edu/models/atm-cam/docs/usersguide/node46.html"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;This appendix describes a small subset of the namelist   variables recognized by CLM 3.0.  For more information, please see   the   &lt;a name="tex2html23" href="http://www.cgd.ucar.edu/tss/clm/distribution/clm3.0/UsersGuide/UsersGuide/UsersGuide.html"&gt;CLM User's Guide&lt;/a&gt;.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Aha; well that does help. After a while you understand that the namelist contains &lt;span style="font-style: italic;"&gt;two (!)&lt;/span&gt; definitions of NREVSN (the restart file name) in "branch" mode (the namelist apparently can have multiple namespaces, though Fortran jargin calls them some other thing most likely), whereas in "restart" mode it suffices to use the default values for REST_PFILE which is a small text file containing what in the other case is the &lt;span style="font-style: italic;"&gt;value&lt;/span&gt; of NREVSN.&lt;br /&gt;&lt;br /&gt;So by close of business today we should be able to get the flux file we need to actually run the SOM version of CAM, the building of which was another story but it's in the past so I won't bother you with it.&lt;br /&gt;&lt;br /&gt;Update: Still haven't pursued the build question.&lt;br /&gt;&lt;br /&gt;After rerunning the spinup, the run of &lt;span style="font-family:courier new;"&gt;defineqflux&lt;/span&gt; fails, but later in the process, with the message:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; nc_put_vara_double -1 failure: Variable not found.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So another 12 hours spinup run needed, once I figure out what it needs. This is a good example of a bad error message. In a real language it would not be too much trouble to report which variable wasn't found and where. In a reasonable document the requisiste fields would be listed. If I were more competent I'd have done a better job perusing the source. 0 for 3.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update 1/28: &lt;/span&gt;Used default outputs and set it running on Friday. Trioed to run defineqflux today with the same error. I don't think it's a matter of which fields I use. Perhaps the version of defineqflux which I have is defective. Still don't really know how to build it so though it is only modestly complicated C code, I can't debug it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...&lt;br /&gt;Using SST mid-months 8 and 10 to compute QFLUX mid-month 9&lt;br /&gt;dayfact=62&lt;br /&gt;Using SST mid-months 9 and 11 to compute QFLUX mid-month 10&lt;br /&gt;dayfact=60&lt;br /&gt;Using SST mid-months 10 and 0 to compute QFLUX mid-month 11&lt;br /&gt;dayfact=62&lt;br /&gt;nc_put_vara_double -1 failure: Variable not found&lt;br /&gt;Abort&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update 1/29:&lt;/span&gt; I have managed to build against a NetCDF library that I myself built from scratch. Still trying to resolve the error, but at least I can put some tracers in the code now.&lt;br /&gt;&lt;br /&gt;Meanwhile, a ticket is pending at TACC for how to build against their library.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update 1/31:&lt;/span&gt; Still no joy. Looks very much as if I need the other pieces of the tool chain. But they require the fortran as well as the C libraries. Linking against TACC's library fails as I reported some time ago. My own build of Fortran NetCDF yields&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;vcc works; but missing link magic for f77 I/O.     -            NO fort. None of gcc, cc or vcc generate required names.    - f2c    : Use #define    f2cFortran, or cc -Df2cFortran                 - NAG f90: Use #define NAGf90Fortran, or cc -DNAGf90Fortran              - Absoft UNIX F77: Use #define AbsoftUNIXFortran or cc -DAbsoftUNIXFortran     - Absoft Pro Fortran: Use #define AbsoftProFortran     - Portland Group Fortran: Use #define pgiFortran     - PathScale Fortran: Use #define PATHSCALE_COMPILER"&lt;br /&gt;make[3]: *** [fort-attio.lo] Error 1&lt;br /&gt;make[3]: Leaving directory `/home/utexas/ig/tobis/CAMYA/cam1/models/atm/cam/tools/defineqflux/NCDF/netcdf-3.6.2/fortran'&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;so here I sit helpless. Two weeks since starting to try to run a standard use case and I am set back to trying to build system-supported libraries. TACC has been episodically helpful but is presently silent.&lt;br /&gt;&lt;br /&gt;I am going to try from the beginning on a UTIG machine next.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-1921327496895651273?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/1921327496895651273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=1921327496895651273' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1921327496895651273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1921327496895651273'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/01/life-in-trenches-part-ii.html' title='Life in the Trenches: Part II'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-4604317896896680777</id><published>2008-01-23T09:31:00.000-08:00</published><updated>2008-01-23T11:33:26.208-08:00</updated><title type='text'>The Cybernetic Perspective</title><content type='html'>In the original sense, &lt;span style="font-style: italic;"&gt;"cybernetics"&lt;/span&gt; means optimal use of information in decisionmaking.&lt;br /&gt;&lt;br /&gt;It emerges that to develop a statistics of information requires a change of perspective from the simple one where developing the model is informed by the system under study to one where the model and the system under study are two components of a larger system. The Wiener filter and its descendant the Kalman filter are the best known examples of this approach but it is more general.&lt;br /&gt;&lt;br /&gt;I believe this use of the word "model" is not entirely coincident with the software engineering sense as in "model-driven development" though it does mesh more or less well with "Model-View-Controller". In our world the View is relatively trivial and usually done offline as postprocessing; it's the utter absence of the Controller that troubles me.&lt;br /&gt;&lt;br /&gt;(&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; That last is really a stretch on second thought. Probably more sellable is the idea that the M in MVC corresponds to system state (variables) and the C corresponds to executable code (statements). In the end the word "model" is just as much a source of confusion as ever.)&lt;br /&gt;&lt;br /&gt;Anyway I think the cybernetic perspective has value in getting climate modeling unstuck.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-4604317896896680777?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/4604317896896680777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=4604317896896680777' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4604317896896680777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4604317896896680777'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/01/cybernetic-perspective.html' title='The Cybernetic Perspective'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-4361495078378368979</id><published>2008-01-22T20:00:00.001-08:00</published><updated>2008-01-22T20:01:04.198-08:00</updated><title type='text'>Quote of the Day</title><content type='html'>Chris McAvoy on the ChiPy list:&lt;br /&gt;&lt;blockquote&gt;I don't know for sure, but from a "Zen of Python" perspective, when I&lt;br /&gt;can't do something with Python it usually ends up that what I'm trying&lt;br /&gt;to do shouldn't be done.&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-4361495078378368979?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/4361495078378368979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=4361495078378368979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4361495078378368979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4361495078378368979'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/01/quote-of-day.html' title='Quote of the Day'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-435917061538964446</id><published>2008-01-22T09:22:00.000-08:00</published><updated>2008-01-25T12:35:33.233-08:00</updated><title type='text'>Life in the Climate Trenches: Part 1</title><content type='html'>I've got not one but two build problems going on. If the rest of my life weren't going well I'd be awfully depressed. I really hate wasting time on this sort of mundane frustration.&lt;br /&gt;&lt;br /&gt;Lonestar (the supercomputer) is offline for alternate Tuesday maintenance, so for today I will share build Probleme Numero Un with you. I welcome any skill transfer that can help untangle all this; comments welcome. Rather than polluting the blogspace with innumerable followups I will just provide updates to this entry.&lt;br /&gt;&lt;br /&gt;Tomorrow I'll start documenting Probleme Numero Deux: running a standard CAM use case.&lt;br /&gt;&lt;br /&gt;It may be that we'll more be documenting my own ignorance than any fundamental problem with the software from some point of view; that will be a learning experience just the same.&lt;br /&gt;&lt;br /&gt;You may object that this isn't the sort of thing you want your tax dollars paying PhD's to fumble around with; in that case I would be in agreement with you. In the private sector this would clearly be a systems task and not a scientist task. So I appeal to your mercy as a lousy admin and a potentially productive scientist, albeit of a somewhat eccentirc stripe. The sooner I get these things done the sooner I can be a scientist.&lt;br /&gt;&lt;br /&gt;OK, here's the scoop (unix/posix skills required to make any sense out of this):&lt;br /&gt;&lt;br /&gt;To participate in NCAR CAM development we need to use their &lt;a href="http://www.cgd.ucar.edu/cms/mstevens/diagnostics/index.html"&gt;diagnostic package&lt;/a&gt; which in turn &lt;a href="http://www.ncl.ucar.edu/"&gt;depends on NCL&lt;/a&gt;. Having a legitimate connection to a US research institution, I have long since jumped through the hoops and am registered on the &lt;a href="http://www.earthsystemgrid.org/"&gt;Earth System Grid&lt;/a&gt;. So I download the package and all its dependencies.&lt;br /&gt;&lt;br /&gt;OK, so the UTIG disk systems are all cross-mounted and so, though I have root on the climate research machine I don't have write privileges on &lt;span style="font-family:courier new;"&gt;/usr&lt;/span&gt; . Our excellent systems folk have set it up so that climate users just define &lt;span style="font-family:courier new;"&gt;$CLIMATE&lt;/span&gt; in their &lt;span style="font-family:courier new;"&gt;.cshrc&lt;/span&gt; which will invoke anything I put (or conceivably somebody else puts) into &lt;span style="font-family:courier new;"&gt;/usr/local/climate&lt;/span&gt; so all I have to do that is nonstandard is insert "climate/" into the path; I make my own &lt;span style="font-family:courier new;"&gt;../bin ../lib ../man&lt;/span&gt; in there; everyone interested in climate ends up with it in their path, nobody else has their namespace messed up, a very nice approach.&lt;br /&gt;&lt;br /&gt;Alas, the &lt;a href="http://www.ncl.ucar.edu/Download/build_from_src.shtml"&gt;lengthy but very clear build instructions&lt;/a&gt; do not work (this is standard practice with NCAR products alas; apparently they lack the skills and/or funding to actually make their products portable, though the build instructions are usually very hopeful.) In the present case the snag occurs even before I get to NCAR's stuff.&lt;br /&gt;&lt;br /&gt;NetCDF is already available. I have acquired and build jpeglib and zlib as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cd jpeg-6b&lt;br /&gt;make clean&lt;br /&gt;./configure --prefix=/usr/local/climate&lt;br /&gt;make&lt;br /&gt;make install&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;which puts five executables into&lt;span style="font-family:courier new;"&gt; /usr/local/climate/bin&lt;/span&gt; and&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cd zlib-1.2.3&lt;br /&gt;make clean&lt;br /&gt;./configure --prefix=/usr/local/climate&lt;br /&gt;make&lt;br /&gt;make install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;which puts a library into &lt;span style="font-family:courier new;"&gt;/usr/local/climate/lib&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My current snag is building HDF-4, which in the configure phase always stops at:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;checking zlib.h usability... yes&lt;br /&gt;checking zlib.h presence... yes&lt;br /&gt;checking for zlib.h... yes&lt;br /&gt;checking for compress2 in -lz... yes&lt;br /&gt;checking jpeglib.h usability... no&lt;br /&gt;checking jpeglib.h presence... no&lt;br /&gt;checking for jpeglib.h... no&lt;br /&gt;checking for jpeg_start_decompress in -ljpeg... no&lt;br /&gt;configure: error: couldn't find jpeg library&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;I have tried various combinations here. What seems to me ought to work is&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;./configure --prefix=/usr/local/climate --with-zlib=/usr/local/climate \&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;--with-jpeg=/usr/local/climate --disable-netcdf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;but it seems to ignore the prefix altogether. I change &lt;span style="font-family:courier new;"&gt;--with-zlib&lt;/span&gt; to point to a totally bogus address, and yet it finds the zlib stuff anyway. It seems to be ignoring the flags I am setting.&lt;br /&gt;&lt;br /&gt;Working hypothesis: I am building jpeg wrong, and some system setting is overriding my value of &lt;span style="font-family:courier new;"&gt;--with-zlib&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A less satisfying but easier solution could come from downloading binaries. At this point I simply have to swallow my pride and ask which if any of the binaries listed here might work.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_QNv9CPAjNvE/R5ZKn9N-8EI/AAAAAAAAAEo/EptcWsgv3cQ/s1600-h/Picture+15.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://bp1.blogger.com/_QNv9CPAjNvE/R5ZKn9N-8EI/AAAAAAAAAEo/EptcWsgv3cQ/s400/Picture+15.png" alt="" id="BLOGGER_PHOTO_ID_5158392473508048962" border="0" /&gt;&lt;/a&gt;Advice would be even more welcome than sympathy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update 1/24&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;UTIG support advised option 4, which worked more or less smoothly.&lt;br /&gt;&lt;br /&gt;Also, from UTIG support:&lt;br /&gt;&lt;br /&gt;Oh I didn't see you had your own (up a directory). The command you&lt;br /&gt;were looking for would be&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;./configure --prefix=/usr/local/climate \&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;--with-zlib=/usr/local/climate/NCLc3/zlib-1.2.3 \&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;--with-jpeg=/usr/local/climate/NCLc3/jpeg-6b --disable-netcdf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And I'm idiotically proud of this script, my first conditional in a shell script in a long time:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;set hn = `hostname`&lt;br /&gt;if ($hn == 'foo.whatever.utexas.edu') then&lt;br /&gt;   echo "climate paths added"&lt;br /&gt;   setenv NCARG_ROOT /usr/local/climate/NCLBin/&lt;br /&gt;   set path = ( /usr/local/climate/NCLBin/bin/ $path )&lt;br /&gt;endif&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So there's finally a happy ending on this one. TACC is still having hardware or configuration problems with Lonestar which is preventing any progress on the other front.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-435917061538964446?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/435917061538964446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=435917061538964446' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/435917061538964446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/435917061538964446'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/01/life-in-climate-trenches-part-1.html' title='Life in the Climate Trenches: Part 1'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_QNv9CPAjNvE/R5ZKn9N-8EI/AAAAAAAAAEo/EptcWsgv3cQ/s72-c/Picture+15.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-4634628501065150729</id><published>2008-01-15T07:55:00.000-08:00</published><updated>2008-01-17T08:02:25.659-08:00</updated><title type='text'>Language of Choice</title><content type='html'>Presumably everyone knows that &lt;a href="http://www.tiobe.com/tpci.htm"&gt;Python is on the rise with a bullet&lt;/a&gt;. Of course, now that Python is sexy it will probably attract some weaker programmers, diluting its reputation. Such are the costs of great beauty. Right now, though, the upswing seems to be near its maximum rate.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://developers.slashdot.org/article.pl?sid=08/01/09/1819221"&gt;the Slashdot article discussing this&lt;/a&gt; I saw a ref to a lexicon definition the concept of &lt;a href="http://www.catb.org/jargon/html/L/languages-of-choice.html"&gt;Language of Choice&lt;/a&gt; in the &lt;a href="http://www.catb.org/jargon/html/"&gt;Jargon File&lt;/a&gt;. FORTRAN is dismissed as a niche language for scientists, but nothing better is proposed.&lt;br /&gt;&lt;br /&gt;So what &lt;b&gt;should&lt;/b&gt; the language of choice be for high performance numerical computing?&lt;br /&gt;&lt;br /&gt;There are teams working on replacements (Fortress, Chapel, some IBM thing with a forgettable name), but I think much of the high performance work of the future can be done in Python with a code generation strategy. I'm not sure what the target language ought to be for the code generation. Would there be advantages to Fortress or Chapel for this? For contemporary purposes even F77 would work (as I said in the &lt;a href="http://portal.acm.org/citation.cfm?id=1079893"&gt;PyNSol&lt;/a&gt; &lt;a href="http://www.elsevier.com/wps/product/cws_home/710027"&gt;papers&lt;/a&gt;) but to be honest the F77 target is almost a stunt, just to make a point. I don't expect it would be useful in the long run.&lt;br /&gt;&lt;br /&gt;I am currently thinking most of the system should be agnostic as to the target language. If done right, multiple targets can be supported in an architecture-dependent bottom layer. Even Verilog is a candidate. ( &lt;a href="http://www.fortranstatement.com/cgi-bin/petition.pl"&gt;F90 and onward are not&lt;/a&gt;. I'd sooner use &lt;a href="http://www.muppetlabs.com/%7Ebreadbox/bf/"&gt;BF&lt;/a&gt; or &lt;a href="http://compsoc.dur.ac.uk/whitespace/"&gt;Whitespace&lt;/a&gt;. )&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update: &lt;/span&gt;&lt;a href="http://home.badc.rl.ac.uk/lawrence/blog/2008/01/16/why_is_climate_modelling_stuck%3F"&gt;Bryan Lawrence has a nice summary&lt;/a&gt; of the issues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-4634628501065150729?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/4634628501065150729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=4634628501065150729' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4634628501065150729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4634628501065150729'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/01/language-of-choice.html' title='Language of Choice'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-1128020500829055929</id><published>2008-01-14T20:00:00.000-08:00</published><updated>2008-01-14T20:10:52.823-08:00</updated><title type='text'>Do NCAR or GISS Ask for This?</title><content type='html'>This crossed my path on a CS mailing list I follow. The context is about whether students need more software engineering or more computer science. It's a bit harsh on us older types but it certainly is an interesting list. I post it so scientific computing types can consider what they may or may not be missing. I should also note that there are practicing scientific coders for whom I have great respect who would find this list ludicrous.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;As a software engineer in the industry and as a person who hires developers I have to say that 2 out of every 3 interviews I take from people with a CS or MS in computer science I do not hire because they are completely inadequate as software engineers. More often than not, they do not know about or have distaste for one or more of the following:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Design Patterns&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Agile engineering / programming&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Extreme Programming&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Test Driven Development&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Composition vs. Inheritance&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;We also give a programming test as a part of the interview process, it is mathematically / algorithmically moderate in challenge and most interviewees (80%) can solve the problem, but only 15-20% solve it with good programming practices and maybe 5-10% write unit tests. Actually, if an interviewee who has good engineering, but does not solve the problem is more appealing than someone who solves the problem.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;I do recall from my undergraduate program at Purdue that we did have a "Software Engineering" class that did try to drive home the points I mentioned, but I have to say that it did not go far enough.&lt;br /&gt;&lt;br /&gt;I would never diminish CS courses, mathematics, or general studies programs ever. I would say that anyone who only takes their CS and never masters the engineering principles either through other course work (several hours worth) or through an internship does not stand much of a chance getting hired at the company I work for.&lt;br /&gt;&lt;br /&gt;In the end, I would say that if I knew 6 years ago what I knew now, I would have gone for the software engineering program and tried for a dual major in CS if I had the bandwidth.&lt;/span&gt;&lt;/blockquote&gt;For what it's worth I believe that design patterns in practice are overstressed, and that the list isn't especially elegant or complete. That said I also have the impression that these ideas are only very dimly perceived in the climate modeling centers and a great deal of benefit could be gained from them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-1128020500829055929?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/1128020500829055929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=1128020500829055929' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1128020500829055929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1128020500829055929'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/01/do-ncar-or-giss-ask-for-this.html' title='Do NCAR or GISS Ask for This?'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-6324802486016314016</id><published>2008-01-10T23:33:00.000-08:00</published><updated>2008-01-14T20:11:32.649-08:00</updated><title type='text'>Progress</title><content type='html'>OLPC is a great achievement if only for this story:&lt;br /&gt;&lt;blockquote&gt;"&lt;a href="http://hardware.slashdot.org/article.pl?sid=08/01/11/0154229&amp;amp;from=rss"&gt;Microsoft struggles to port Windows to a device originally conceived to run Linux&lt;/a&gt;."&lt;/blockquote&gt;Still waiting on mine...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-6324802486016314016?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/6324802486016314016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=6324802486016314016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/6324802486016314016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/6324802486016314016'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2008/01/progress.html' title='Progress'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-3957666863939048053</id><published>2007-12-26T08:23:00.000-08:00</published><updated>2007-12-27T09:29:25.117-08:00</updated><title type='text'>Why is Climate Modeling Stuck?</title><content type='html'>I believe that &lt;b&gt;progress in climate modeling has been relatively limited since the first successes in linking atmosphere and ocean models without flux corrections&lt;/b&gt;. (That's about a decade now, long enough to start being cause for concern.) One idea is that tighter codesign  of components such as atmosphere and ocean models in the first place would help, and there's something to be said for that, but I don't think that's the core issue.&lt;br /&gt;&lt;br /&gt;I suggest that there is a deeper issue based on workflow presumptions. The &lt;b&gt;relationship between the computer science community and the application science community&lt;/b&gt; is key. I suggest that the relationship &lt;b&gt;is ill-understood and consequently the field is underproductive&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;The relationship between the software development practitioners and the domain scientists is misconstrued by both sides, and both are limited by past experience. Success in such fields as weather modeling and tide prediction provide a context which inappropriately dominates thinking, planning and execution.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Operational codes are the wrong model because scientists do not modify operational codes.&lt;/b&gt; Commercial codes are also the wrong model because bankers, CFOs and COOs do not modify operational codes. The primary purpose of scientific codes as opposed to operational codes is to enable science, that is, free experimentation and testing of hypotheses.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Modifiability by non-expert programmers should be and sadly is not treated as a crucial design constraint.&lt;/b&gt; The application scientist is an expert on physics, perhaps on certain branches of mathematics such as statistics and dynamics, but is typically a journeyman programmer. In general the scientist does not find the abstractions of computer science intrinsically interesting and considers the program to be an expensive and balky laboratory tool.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Being presented with codes that are not designed for modification greatly limits scientific productivity.&lt;/b&gt; Some scientists have enormous energy for the task (or the assistance of relatively unambitious and unmarketable Fortran-ready assistants) and take on the task with energy and panache, but the sad fact is that they have little idea of what to do or how to do it. This is hardly their fault; they are modifying opaque and unwelcoming bodies of code. Under the daunting circumstances these modifications have the flavor of "one-offs", scripts intended to perform a single calculation, and treated as done more or less when the result "looks reasonable".  The key abstractions of computer science and even its key goals are ignored, just as if you were writing a five-liner to, say, flatten a directory tree with some systematic renaming. "Hmm, looks right. OK, next issue."&lt;br /&gt;&lt;br /&gt;This, while scientific coding has much to learn from the commercial sector, the key use case is rather atypical. &lt;b&gt;The key is in providing an abstraction layer useful to the journeyman programmer, while providing all the verification, validation, replicability, version control and process management the user needs, whether the user knows it or not.&lt;/b&gt; As these services become discovered and understood, the value of these abstractions will be revealed, and the power of the entire enterprise will resume its forward progress.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;It's my opinion that Python provides not only a platform for this strategy but also an example of it.&lt;/b&gt; When a novice Python programmer invokes "a = b + c", a surprisingly large number of things potentially happen. An arithmetic addition is commonly but  not inevitably among the consequences and the intentions. The additional machinery is not in the way of the young novice counting apples but is available to the programmer extending the addition operator to support user defined classes.&lt;br /&gt;&lt;br /&gt;Consider why Matlab is so widely preferred over the much more elegant and powerful Mathematica platform by application scientists. This is because the scientists are not interested in abstractions in their own right; they are interested in the systems they study. Software is seen as a tool to investigate the systems and not as a topic of intrinsic interest. Matlab is (arguably incorrectly) perceived as better than Mathematica because it exposes only abstractions that map naturally onto the application scientist's worldview.&lt;br /&gt;&lt;br /&gt;Alas, the application scientist's worldview is largely (see Marshall McLuhan) formed by the tools with which the scientist is most familiar. The key to progress is the Pythonic way, which is to provide great abstraction power &lt;span style="font-weight:bold;"&gt;without having it get in the way&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt;. Scientists learn mathematical abstractions as necessary to understand the phenomena of interest. Computer science properly construed is a branch of mathematics (and not a branch of trade-school mechanics thankyouverymuch) and scientists will take to the more relevant of its abstractions as they become available and their utility becomes clear.&lt;br /&gt;&lt;br /&gt;Maybe starting from a blank slate we can get moving again toward a system that can actually make useful regional climate prognoses. It is time we took on the serious task of determining the extent to which such a thing is possible. I also think the strategies I have hinted at here have broad applicability in other sciences. &lt;br /&gt;&lt;br /&gt;I am trying to work through enough details of how to extend this Python mojo to scientific programming to make a credible proposal. I think I have enough to work with, but I'll have to treat the details as a trade secret for now. Meanwhile I would welcome comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-3957666863939048053?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/3957666863939048053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=3957666863939048053' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/3957666863939048053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/3957666863939048053'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/12/why-is-climate-modeling-stuck.html' title='Why is Climate Modeling Stuck?'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-2359709367512079187</id><published>2007-11-12T14:52:00.000-08:00</published><updated>2007-11-12T14:55:48.191-08:00</updated><title type='text'>Fake Steve on OLPC</title><content type='html'>Fake Steve Jobs has some brutal (but sort of funny) articles about OLPC. &lt;a href="http://fakesteve.blogspot.com/2007/09/100-laptop-now-200-and-delayed-again.html"&gt;Check this one&lt;/a&gt;, or google &lt;a href="http://fakesteve.blogspot.com"&gt;the site&lt;/a&gt; for "Negroponte".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-2359709367512079187?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/2359709367512079187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=2359709367512079187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2359709367512079187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2359709367512079187'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/11/fake-steve-on-olpc.html' title='Fake Steve on OLPC'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-4464282060284498861</id><published>2007-11-12T14:44:00.000-08:00</published><updated>2007-11-12T14:46:23.479-08:00</updated><title type='text'>GOGO gone?</title><content type='html'>I don't quite get this "limited time only" "give one get one" thing the OLPC people are running.&lt;br /&gt;&lt;br /&gt;It's being spun as if I were giving the one I get to a child. But that is silly.&lt;br /&gt;&lt;br /&gt;The child's interest will be piqued by the community aspect, and if there will be no XO systems for sale, it will be impossible to build the community. It's almost as if Bell had decided to start the phone system in Ougadougou (a real place with a real OLPC initiative, actually, but I like the name)  and had financed it by selling telephones in America. &lt;br /&gt;&lt;br /&gt;You know, one telephone isn't worth much. You need at least two.&lt;br /&gt;&lt;br /&gt;So in practice it will almost certainly be "give two get two" program, with adult hobbyists buying. Or did I miss something?&lt;br /&gt;&lt;br /&gt;Will there be a commercial XO product in the marketplace? If not, why not?&lt;br /&gt;&lt;br /&gt;Is the platform stable enough to start thinking about end user apps? I don't realistically have the time to do systems work, but I'm very interested in what runs on it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-4464282060284498861?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/4464282060284498861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=4464282060284498861' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4464282060284498861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4464282060284498861'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/11/gogo-gone.html' title='GOGO gone?'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-1387646961322046320</id><published>2007-08-03T14:36:00.000-07:00</published><updated>2007-08-03T14:38:54.860-07:00</updated><title type='text'>Alan Perlis Quote</title><content type='html'>From Dethe Elza's sig:&lt;br /&gt;&lt;blockquote  style="font-family:verdana;"&gt;&lt;span style="font-size:100%;"&gt;"It goes against the grain of modern education to teach children to program. What fun is there in making plans, acquiring discipline in organizing thoughts, devoting attention to detail and learning to be self-critical?"&lt;br /&gt;&lt;br /&gt;--Alan Perlis&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-1387646961322046320?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/1387646961322046320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=1387646961322046320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1387646961322046320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1387646961322046320'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/08/quote.html' title='Alan Perlis Quote'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-1079839875900356507</id><published>2007-05-23T12:14:00.000-07:00</published><updated>2007-11-12T14:57:28.553-08:00</updated><title type='text'>Article is Out</title><content type='html'>Not really makin a huge splash, but for what it is worth look for the spring 2007 edition of &lt;a href="pyjournal.cgpublisher.com/"&gt;the Python Papers&lt;/a&gt;. See pages 8 and following.&lt;br /&gt;&lt;br /&gt;In an email Duke Crawford offers the following links to an open source language drill program:&lt;br /&gt;&lt;br /&gt;http://www.olpcnews.com/content/ \&lt;br /&gt;&lt;blockquote&gt;localization/learning_language.html&lt;/blockquote&gt;&lt;br /&gt;http://sourceforge.net/projects/twexter&lt;br /&gt;http://wiki.laptop.org/go/WiXi&lt;br /&gt;http://wixi.cc/hello_world&lt;br /&gt;http://twext.cc/go/18 &lt;br /&gt;&lt;br /&gt;Is anybody else out there?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-1079839875900356507?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/1079839875900356507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=1079839875900356507' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1079839875900356507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1079839875900356507'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/05/article-is-out.html' title='Article is Out'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-1109222640727091035</id><published>2007-05-10T11:54:00.000-07:00</published><updated>2007-05-10T13:19:06.088-07:00</updated><title type='text'>Laptop backlash</title><content type='html'>Get it &lt;a href="http://www.nytimes.com/2007/05/04/education/04laptop.html?_r=1&amp;oref=slogin"&gt;while it's live&lt;/a&gt;: the NY Times reports “Seeing No Progress, Some Schools Drop Laptops”.&lt;br /&gt;&lt;br /&gt;Responses &lt;a href="http://pastie.caboo.se/60303"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;a snippet:&lt;br /&gt;&lt;br /&gt;==&gt;&lt;br /&gt;So the Liverpool Central School District, just outside Syracuse, has&lt;br /&gt;decided to phase out laptops starting this fall, joining a handful of&lt;br /&gt;other schools around the country that adopted one-to-one computing&lt;br /&gt;programs and are now abandoning them as educationally empty — and&lt;br /&gt;worse.&lt;br /&gt;&lt;br /&gt;Many of these districts had sought to prepare their students for a&lt;br /&gt;technology-driven world and close the so-called digital divide between&lt;br /&gt;students who had computers at home and those who did not.&lt;br /&gt;&lt;br /&gt;"After seven years, there was literally no evidence it had any impact&lt;br /&gt;on student achievement — none," said Mark Lawson, the school board&lt;br /&gt;president here in Liverpool, one of the first districts in New York&lt;br /&gt;State to experiment with putting technology directly into students'&lt;br /&gt;hands. "The teachers were telling us when there's a one-to-one&lt;br /&gt;relationship between the student and the laptop, the box gets in the&lt;br /&gt;way. It's a distraction to the educational process."&lt;br /&gt;&lt;==&lt;br /&gt;&lt;br /&gt;It's not surprising, really, but the timing is not good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-1109222640727091035?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/1109222640727091035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=1109222640727091035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1109222640727091035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/1109222640727091035'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/05/laptop-backlash.html' title='Laptop backlash'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-4570033329418546281</id><published>2007-05-10T11:49:00.000-07:00</published><updated>2007-05-10T11:50:00.132-07:00</updated><title type='text'>FInal Version of Article</title><content type='html'>The 3rd instance of the Python Papers will be coming out May 28.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-4570033329418546281?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/4570033329418546281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=4570033329418546281' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4570033329418546281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4570033329418546281'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/05/final-version-of-article.html' title='FInal Version of Article'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-4019437279781921512</id><published>2007-04-16T17:26:00.000-07:00</published><updated>2007-04-16T17:29:19.420-07:00</updated><title type='text'>Edu-Python: Python's Killer App?</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;DRAFT of an ARTICLE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;IS EDUCATION PYTHON'S KILLER APP?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;SALIENT QUOTATIONS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;"Should the computer program the kid, or should the kid program the computer?"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;                   - Seymour Papert&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;"We want to explore the notion that virtually everybody can obtain some level of computer programming skills in school, just as they can learn how to read and write."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;                     - Guido van Rossum&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;"Python makes too much sense as a learning language to not ultimately have an effect in the education arena."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;                    - Arthur Siegel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;"If schools won't accept classes that have Python in them, then it doesn't matter how much better Python is than BASIC, the classes cannot be taught."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;                     - Dean Nevins&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;PYTHON IN EDUCATION&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;If learning is about information, then surely learning will change somewhat under the influence of pervasive information technology. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;This is an exciting time for those of us who believe that software development in general, and Python in particular, has a role in general education. Three of the four keynotes at PyCon '07 revolved around the idea of computing as a medium for education and/or communication. Adele Goldberg talked about the frustrations of getting carefully designed computational curriculum into the public school systems. Robert "rOml" Lefkowitz talked about code as a communication medium. Finally, on a more practical note, Ivan Krstic discussed the very exciting prospects of the One Laptop Per Child project, whose modest goal is to make computing available to all children everywhere.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;These discussions gave a boost to the quiet world of educational Python. It seems like a good time to take stock of the entire educational programming landscape and Python's role in it. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;COMPUTER LITERACY&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;In the early days of computing, it became apparent that computers would become ubiquitous and part of daily life. At that time, we had little idea what shape they would take in a generation.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;I recall an episode of the futuristic TV news program "The Twentyfirst Century", hosted by the renowned Walter Cronkite, that discussed the implications of home computers. A professor's family had a massive mechanical teletype (a terminal that used a typewriter mechanism rather than a CRT or LCD display) in their home. The demonstartion application was, as I recall, changing the proportions in a recipe so that it served seven rather than four. I am sure it was a great tangle of Lisp under the hood and no great pleasure to use, but it appeared that if you perservered a recasting of your recipe with all the quantities multiplied by 7/4 and converted to standard cooking units loudly clanked out onto the fanfold paper. At the time, the 21st century was promoted in the media to be an almost flawless utopia, but even so one had the sense that both Cronkite and the professor's wife were struggling to express any enthusiasm for the concept of home computing.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;If you think about what "computer literacy" means today in high schools, trade schools, and nontechnical programs in university, though, you'll see that it amounts to recipe scaling writ large. Mass market software presents complex and often counterintuitive user interfaces, and the skill of navigating through each of them is valued and promoted. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;PROGRAMMING FOR CHILDREN&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Of course, we do need to be able to cope with applications. Still, there have always been two visions of computing, one as a world in which there is a very sharp distinction between producers and consumers of software, and another where the continuum is blurred. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;The alternative vision of computer literacy was formed by the early users of computers. In those days, there were no "applications". Being a computer user amounted to being a programmer. Many of us felt that the skills we learned  by wrestling with the structure and logic of a program would be applicable to many aspects of life. We felt that the advantages we were getting could be democratized. In this view, "computer literacy" was about coding, not about being able to push a mouse around and click on things effectively. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;This view is succinctly summarized by Georgia Tech Professor Mark Guzdial's comment on a blog page: "computing FOR learning (as opposed to learning ABOUT computing".[1]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Seymour Papert (with Willy Feurzig) developed Logo[2], the original "learning language in the late 1960's. The ideas of Logo were explicitly based on developmental psychology[3].  Papert not only claimed that remarkably young children (fourth graders, about 9 years old) could be exposed to the ideas of programming, he was successful in demonstrating this. Many subsequent teaching environments have been based on Logo, and especially on the observation that "turtle graphics" were a uniquely compelling development target for novices) the basic idea has not been as successful as Papert envisioned. (It's interesting to contemplate the fact that it was less expensive to construct a mechanical turtle than a graphic display in those days!)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Alan Kay is another key figure in the computing for learning movement. His 1971 "Dynabook" paper[4]  is a remarkable exposition of the possibilities of computing from a time long before anyone actually had so muchas a portable display. Kay and Papert are still with us as I write (although, unfortunately, Papert was seriously injured recently), and among their recent efforts, along with Nicholas Negroponte, is the One Laptop Per Child initiative[5], where Python plays a key role, and which largely revives the Dynabook idea.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;COMPUTING FOR NOVICES&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Despite the strong advocacy of the likes of Papert and Kay, there is no consensus on whether most people can and should learn a modest amount of programming, nor what age is best to start. Still, we can agree that *some* people will become programmers, and they have to start with *some* language. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Among the most famous quotations attribute to the great computer scientist Edsger Dijkstra are critiques of teaching computer science with inappropriate languages, notably that "The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offense"  and "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration." Many people have taken DIjkstra's advice to heart, and designed languages intended to expose young adult students to good practice and good theory from the beginning. Pascal and Smalltalk are probably the most successful examples. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Another effort in this direction was the ABC programming language project of Geerts, Meertens and Pemberton at Centrum voor Wiskunde en Informatica in Holland. They list advantages of ABC in comparison to Pascal as 1) small, intuitive syntax 2) maps well onto design principles 3) terseness 4) support for refinement 5) no declarative statements and 6) interactive [5]. Along with these good ideas the CWI group had the inspiration to put the young Guido van Rossum on staff, and it is here that the Python story begins.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;While much of the history of the Python community remains an oral history, we do have the following quote from Guido: "Over six years ago, in December 1989, I was looking for a 'hobby' programming project that would keep me occupied during the week around Christmas. My office ... would be closed, but I had a home computer, and not much else on my hands. I decided to write an interpreter for the new scripting language I had been thinking about lately: a descendant of ABC that would appeal to Unix/C hackers." [6] Python, then, is a combination of a well designed learning language and a practical scripting language.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;COMPUTER PROGRAMMING FOR EVERBODY&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Once Python had attained a certain momentum, Guido van Rossum under the auspices of the Corporation for National Research Initiatives applied for and received a small grant to support a project called Computer Programming for Everybody of CP4E, to investigate democratizing programming. The project was funded for a single year, half the anticipated duration, through DARPA. Guido and much of the core development team moved into the for-profit sector at aboutr that time as well. The proposal [7] lists broad objectives of developing high school and college curriculum, developing tools, and developing a user community, as well as many subcomponents of these objectives.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;The motivation section is in the intellectual lienage of Papert and Kay:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;===&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;If we are successful, non-experts will be able use their computers and other intelligent devices much more effectively, reducing their level of frustration and increasing their productivity and work satisfaction. (New leisure possibilities will undoubtedly ensue as well!) Computer users will be                         able to solve their own computer problems more often, reducing the need for technical support.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Even if most users do not program regularly, a familiarity with programming and the structure of software will make them more effective users of computers. For example, when something goes wrong, they will be able to make a better mental model of the likely failure, which will allow them to fix or work around the problem. They will also be able to assess better when they can make the changes themselves and when they will need the services of an expert. They will be more able to converse with experts, since they will now share more of a common language. An analogy is obtaining basic literacy in automotive maintenance: you know enough to check your oil and add a few quarts if necessary, but you also know that you shouldn't try to change your own brakes. When the mechanic says "your rotors are warped and you need new pads," you understand what he is talking about.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;If this effort is successful, there could be many millions, eventually billions of computer programmers, at various levels of proficiency. The effects this will have on the state of the art of software development is hard to imagine. The nature of software will change to accommodate the needs of these programmers, allowing customization through source code modifications--and &lt;/span&gt;&lt;span style="font-family: verdana;" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;personalizations&lt;/span&gt;&lt;span style="font-family: verdana;"&gt; will be plentiful.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;&lt;===&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;The funded CP4E project's principal achievement, was developing the IDLE system. This is not to be minimized, as IDLE remains the development platform of choice for beginners in many contexts. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Still, it must be admitted that many of the goals of CP4E remain unfulfilled to this day. The SIG that was centered on the project, while hosting many fascinating discussions, lost focus. Until recently, a fairly large number of fairly small projects were developed in and around the cluster of ideas that motivated CP4E and the edu-sig. Efforts to create a directory and a repository for this work have so far failed to reach critical mass. There appears to be a cat-herding problem, with each enthusiast having his or her own individual goals.  That said, a great deal of fascinating work has been and continues to be happening, and quite a few young people have been exposed to Python as their first programming language and environment. Perhaps even more importantly, the mission of CP4E, and Python's role in it, has been an active goal for quite a few people in the intevening seven years.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;The sidebar attemps, and surely fails, to be an exhaustive list of Python related education projects. It includes projects where Python is or has been used to develop a domain specific learning language or learning tools, or where Python is used as the language of discourse in teaching programming, or in using programming to teach other topics. It is limited to resources aimed at novice programmers who are not necessarily going to become technical or computing professionals.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;WHY PYTHON?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Pulling together these Python as a First Language/CP4E experiences, formalizing them, and making a case for them in educational settings, remains somewhat&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;elusive. If we accept Dijkstra's admonitions that a first computing language is important to the inetllectual development of the student, it seems to those of us who appreciate Python for what it is. It's arguably our responsibility to get beyond "we like it because it is good" for the non-Python audience.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;The Python community knows what it likes and is amazingly verbose and articulate in discussing this or that programming construct, but we have never been particularly adept at explaining our vision to those who have not experienced it. In researching this article, I made some effort to get Python First enthusiasts to explain the basis of their enthusiasm in the context of the novice programmer.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;===&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;MORE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;===&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;AUDIENCES AND OBSTACLES&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;In discussing the future of Python as a first language, we need to distinguish between several populations of novices:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;    1) a child working with a parent or other adult&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;    2) a child working alone&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;    3) a child studying a formal course in school&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;    4) a college student studying a formal course&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;    5) an adult seeking to achieve some personal software goal&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;These audiences have distinct constraints and distinct objectives. It seems clear that, except for very young children, foe whom a limited environment such as eToys or Alice may be of great value for more than a few weeks, Python is clearly a viable choice. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Python's competitive position is weakest in the second and third categories, for quite distinct reasons. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;In the case of a purely self-motivated child, the child's immediate objective is to do something cool on a web page and email the URL to friends and family. Python is, of course, a very powerful weapon in the hands of the experienced programmer, especially in combination with the vast alphabet soup of frameworks and libraries available. Unlike the core language, though, this power does not scale down to simple applications. Most mass market ISPs do not support Python CGIs, and certainly don't support the likes of Twisted or mod-Python. Also, the libraries and frameworks, though powerful, are conceptually inaccessible to the novice. To the extent that frameworks like Django are easy to use, they probably move far away from Dijkstra' concepts of a pedagogically useful language, and at the extreme Zope/Plone is more of a bureaucracy than a development platform. Compare this with the ease of use and remarkably complete and accessible documentation of PHP, or the zero barrier to entry of Javascript, and we lose the budding web program to pedagogically less valuable languages. Perhaps we needn't worry about the self-motivated young programmer, though. Through their enthusiasm they will learn the limitations of their platform, and eventually move to Python or a similar language. As a youth I programmed in uglier things than PHP and yet lived to tell the tale.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;More of an issue is the school. Adele Goldberg's PyCon keynote was largely a lament about trying to work within the US public school systems. She is giving up on it as a primary goal of her efforts, for a sad litany of reasons. Although her root causes were familiar to me (too much politics, too much fear, no room for experimentation), despite her sad tale she missed a couple of points that are relevant to adding a computing language to the curriculum that would not agitate the good Dr. Dijkstra. First of all, computing (except for advanced placement) is considered a vocational pursuit, not an intellectual one! This madness is endemic; Jeff Elkner's diligent pursual of all that is Pythonic within a public school system in Virginia all occurs in the context of a vocational track. Python is considered in competition with VBasic in this context. For college-bound students, Java has become the language of choice as a conseqeunce of the structure of the Advanced Placement examinations. (Everyone seems to agree that this is a pedagogical imporvement over C++, which presumably was as baffling to the teachers as the students.) The consequence is that despite the enormous scale of the school system, which would allow for rigorous experimentation and improvement, most schools are stuck teaching Java and VBasic.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;In the home or the college, these constraints are not operative. Python First continues to gain momentum in these settings.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;ENTER OLPC&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Amid all of this mixture of success and frustration, a new five hundred pound gorilla has entered the room. The One Laptop Per Child[] initiative has promise of reviving the original vision of CP4E.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;+++&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;The project's origins go back more than four decades to the early days of computing, when most machines were still the size of small dinosaurs, and almost no one dreamed they would ever be suitable for children. But pioneering thinkers like Seymour &lt;/span&gt;&lt;span style="font-family: verdana;" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Papert&lt;/span&gt;&lt;span style="font-family: verdana;"&gt; disagreed sharply, and over time led the long march from radical theory to reality proving the immense power of the personal computer as a learning tool for children.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;&lt;===&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt; Even better, much of the system, and specifically the operating system GUI (called Sugar)[] will be based in Python. Some clever architecture will even allow the child to play with the code! (Of course Python is available.) The very large scale and funding of this initiative promise to provide new focus to the &lt;/span&gt;&lt;span style="font-family: verdana;" class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;CP&lt;/span&gt;&lt;span style="font-family: verdana;"&gt;4E community. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;OLPC&lt;/span&gt;&lt;span style="font-family: verdana;"&gt; does an end run around the school bureaucracies of developed countries. In less developed countries, bureaucratic and political obstacles may also be less developed. It provides a Python-friendly platform with massive distribution among children who have not seen code. It promises to enhance the prominence of Python and allow much larger scales of experimentation &lt;/span&gt;&lt;span style="font-family: verdana;" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;wioth&lt;/span&gt;&lt;span style="font-family: verdana;"&gt; pedagogic ideas, all the while being perceived as great fun. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;It might not be in time to save the world, but we can hope for that too.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-4019437279781921512?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/4019437279781921512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=4019437279781921512' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4019437279781921512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/4019437279781921512'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/04/edu-python-pythons-killer-app.html' title='Edu-Python: Python&apos;s Killer App?'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-2187890770303540393</id><published>2007-04-11T12:45:00.000-07:00</published><updated>2007-04-23T18:48:40.175-07:00</updated><title type='text'>Python-First Educational Resources</title><content type='html'>&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;OLPC and SUGAR&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;a href="http://wiki.laptop.org/go/OLPC_Human_Interface_Guidelines"&gt;OLPC Interface Guidelines&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://youtube.com/watch?v=DwzCsOFxT-U"&gt;OLPC/Sugar demo&lt;/a&gt;&lt;span&gt;&lt;span&gt; (video)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;a href="http://wiki.laptop.org/go/Sugar"&gt;Sugar&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;OTHER PYTHON SOFTWARE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;a href="http://childsplay.sourceforge.net/dev.php"&gt;Childsplay&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/crunchy/"&gt;Crunchy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www2.blogger.com/Guido%20van%20Robot"&gt;Guido van Robot&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www2.blogger.com/sourceforge.net/projects/patapata"&gt;PataPata&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pylogo.org/"&gt;PyLogo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www2.blogger.com/rur-ple.sourceforge.net/"&gt;RUR-PLE&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;PROGRAMMING FOR THE VERY YOUNG&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.alice.org/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;a href="http://www.alice.org/"&gt;Alice&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;a href="http://www.youtube.com/watch?v=MShr7ZHsOfI"&gt;OLPC-Squeak demo&lt;/a&gt; (video)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.squeakland.org/"&gt;Squeak&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;VIDEO&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;a href="http://www.ibiblio.org/pub/multimedia/video/obp/IntroducingPython.mpg"&gt;Introducing Python&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.4dsolutions.net/ocn/cp4e.html"&gt;Various, Especially Python-in-Mathematics Videos &lt;/a&gt;- Urner&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span&gt;&lt;br /&gt;PRESENTATIONS&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;a href="http://www.educause.edu/content.asp?page_id=666&amp;ID=COM9802&amp;amp;bhcp=1"&gt;The computer revolution hasn't happened yet&lt;/a&gt; - Kay 1998&lt;br /&gt;&lt;a href="http://webpages.cs.luc.edu/%7Emt/Python-First/Py1.html"&gt;&lt;br /&gt;My presentation to the Austin Python User Group last week&lt;/a&gt; - Tobis 2007&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span&gt;&lt;br /&gt;PAPERS&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;a href="http://www2.blogger.com/www.media.mit.edu/publications/bttj/Paper11Pages96-112.pdf"&gt;Models of Growth&lt;/a&gt; - Cavallo 2004&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.python.org/workshops/2000-01/proceedings/papers/elkner/pyYHS.html"&gt;Using Python in a High School Computer Science Program &lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;  - Elkner 2000&lt;br /&gt;&lt;br /&gt;&lt;a href="www.mprove.de/diplom/gui/Kay72a.pdf"&gt;A Personal Computer for Children of All Ages&lt;/a&gt; - Kay 1972&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.python.org/files/miller-dissertation.pdf"&gt;Promoting Computer Literacy Through Programming Python&lt;/a&gt; - Miller 2004 (dissertation)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www1.chapman.edu/%7Eradenski/research/papers/python-iticse06.pdf"&gt;Python First: A Lab-Based Digital Introduction to Computer Science&lt;/a&gt; - Radenski 2006&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;a href="http://www.python.org/doc/essays/cp4e.html"&gt;CP4E&lt;/a&gt; - van Rossum 1999&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;a href="http://www.pentangle.net/python/report.pdf"&gt;Teaching Scientific Programming Using Python&lt;/a&gt; - Williams (master's thesis)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;WIKIS, BLOGS, ARTICLES etc.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;a href="http://c2.com/cgi/wiki?ComputerProgrammingForEverybody"&gt;C2 Wiki: Computer Programming for Everybody&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.windley.com/archives/2006/02/alan_kay_the_10.shtml"&gt;Alan Kay and OLPC - Windley 2006&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.oreilly.com/pub/a/oreilly/frank/elkner_0300.html"&gt;Interview with Jeff Elkner&lt;/a&gt; - Willison 2000&lt;br /&gt;&lt;br /&gt;&lt;a href="http://spectrum.ieee.org/print/4985"&gt;OLPC&lt;/a&gt; - IEEE 2007&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;PORTALS&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;a href="http://www.python.org/community/sigs/current/edu-sig/"&gt;python.org edu-sig&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.python.org/moin/BeginnersGuide/NonProgrammers"&gt;python.org beginners' resources&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ibiblio.org/obp/pyBiblio/"&gt;Python Bibliotheca &lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;br /&gt;ONLINE BOOKS&lt;/span&gt; and COURSES&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;a href="http://eric_rollins.home.mindspring.com/introProgramming/"&gt;An Introduction to Programming &lt;/a&gt;- Rollins&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;a href="http://osl.iu.edu/%7Elums/swc/"&gt;Software carpentry&lt;/a&gt; - Williams&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.ibiblio.org/obp/thinkCS/python/english2e/html"&gt; How to Think Like a Computer Scientist: Learning with Python&lt;/a&gt; Downey, Elkner and Meyers, 2004; also &lt;a href="http://www2.blogger.com/greenteapress.com/thinkpython/"&gt;available in book format&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.livewires.org.uk/python/"&gt;&lt;span style="font-size:100%;"&gt;The LiveWires Python Course&lt;/span&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;PYTHON FIRST TEXTBOOKS&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="sans"&gt;&lt;a href="http://www.amazon.com/Learn-Program-Using-Python-Self-Starters/dp/0201709384/ref=pd_bbs_8/103-6355689-1543059?ie=UTF8&amp;s=books&amp;amp;qid=1176765148&amp;sr=8-8"&gt;Learn to Program Using Python&lt;/a&gt; - &lt;/span&gt;&lt;span&gt;&lt;span&gt;Gauld 2001&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://vig.prenhall.com/catalog/academic/product/0,1144,0136150314,00.html"&gt;Object-Oriented Programming in Python&lt;/a&gt;&lt;span&gt;&lt;span&gt; - Goldwasser and Letscher 2007 (to appear)&lt;br /&gt;&lt;a href="http://www.amazon.com/Introduction-Computing-Programming-Multimedia-Approach/dp/0131176552/ref=sr_1_1/103-6355689-1543059?ie=UTF8&amp;amp;s=books&amp;qid=1176872036&amp;amp;sr=8-1"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.amazon.com/Introduction-Computing-Programming-Multimedia-Approach/dp/0131176552/ref=sr_1_1/103-6355689-1543059?ie=UTF8&amp;s=books&amp;amp;qid=1176872036&amp;sr=8-1"&gt;&lt;span class="sans"&gt;Introduction to Computing and Programming in Python, A Multimedia Approach&lt;/span&gt;&lt;/a&gt; - Guzdial 2004&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="sans"&gt;&lt;a href="http://www.amazon.com/Beginning-Python-Novice-Professional/dp/159059519X/ref=pd_bbs_3/103-6355689-1543059?ie=UTF8&amp;amp;s=books&amp;qid=1176765209&amp;amp;sr=1-3"&gt;Beginning Python: From Novice to Professional&lt;/a&gt; - &lt;/span&gt;&lt;span&gt;&lt;span&gt;Hetland 2005&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="sans"&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Python-Programming-Introduction-Computer-Science/dp/1887902996/ref=sr_1_8/103-6355689-1543059?ie=UTF8&amp;s=books&amp;amp;qid=1176765209&amp;sr=1-8"&gt;Python Programming: An Introduction to Computer Science&lt;/a&gt; - &lt;/span&gt;&lt;span&gt;&lt;span&gt;Zelle 2003&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-2187890770303540393?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2187890770303540393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/2187890770303540393'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/04/python-first-educational-resources.html' title='Python-First Educational Resources'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-7862395394170137465</id><published>2007-03-26T13:56:00.001-07:00</published><updated>2007-03-26T13:56:55.016-07:00</updated><title type='text'>I: Pedagogical Advantages of Python</title><content type='html'>What experience do you have teaching coding to beginners using Python as the target language? Using other languages? Especially welcome are comparison/contrast of teaching with language X vs teaching with Python from a pedagogical point of view.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-7862395394170137465?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/7862395394170137465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=7862395394170137465' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7862395394170137465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/7862395394170137465'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/03/i-pedagogical-advantages-of-python.html' title='I: Pedagogical Advantages of Python'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-3422048195261983699</id><published>2007-03-26T13:54:00.000-07:00</published><updated>2007-03-26T13:55:50.600-07:00</updated><title type='text'>II: Pythonic Teaching Tools</title><content type='html'>What experience do you have using Pythonic tools (environments, libraries) as part of your teaching environment, regardless of the language that the students are learning? What advantages does python present you as an educational tool developer and/or deployer?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-3422048195261983699?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/3422048195261983699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=3422048195261983699' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/3422048195261983699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/3422048195261983699'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/03/ii-pythonic-teaching-tools.html' title='II: Pythonic Teaching Tools'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-5028361491833685873</id><published>2007-03-26T13:53:00.000-07:00</published><updated>2007-03-26T13:54:31.350-07:00</updated><title type='text'>III: Attractiveness of Competing First Languages</title><content type='html'>What advantages do other languages have over Python in increasing the attractiveness of the language to self-directed learners? e.g., JavaScript's universal accessibility, PHP's ease of use and extensive documentation. Can these disadvantages be overcome, and if so, how so and how quickly?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-5028361491833685873?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/5028361491833685873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=5028361491833685873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5028361491833685873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5028361491833685873'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/03/iii-attractiveness-of-competing-first.html' title='III: Attractiveness of Competing First Languages'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-763397485108351434</id><published>2007-03-26T13:52:00.000-07:00</published><updated>2007-03-26T13:53:27.700-07:00</updated><title type='text'>IV: Institutional Competition</title><content type='html'>What advantages do other languages have over Python in their attractiveness to educational institutions? e.g., Java being the language of the Advanced Placement Test in the US, VBasic being perceived as the appropriate medium for vocational preparation.  Can these disadvantages be overcome, and if so, how so and how quickly?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-763397485108351434?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/763397485108351434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=763397485108351434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/763397485108351434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/763397485108351434'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/03/iv-institutional-competition.html' title='IV: Institutional Competition'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-5713654627115976742</id><published>2007-03-26T13:50:00.000-07:00</published><updated>2007-03-26T13:51:41.071-07:00</updated><title type='text'>V: Pythonic tools</title><content type='html'>What existing libraries, tools and resources should the instructor proposing to use Python in education be aware of? What are the most important Pythonic libraries, tools, and resources are under development?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-5713654627115976742?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/5713654627115976742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=5713654627115976742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5713654627115976742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/5713654627115976742'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/03/v-pythonic-tools.html' title='V: Pythonic tools'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4170332600441687813.post-3068127462598545645</id><published>2007-03-26T12:48:00.000-07:00</published><updated>2007-03-26T13:03:51.772-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Why Pencil Science?</title><content type='html'>This is a blog about the nuts and bolts of computer literacy from a Pythonic perspective.&lt;br /&gt;&lt;br /&gt;I would like not merely to defend the position that computer programming is "for everybody" but also to examine the proposition that Python is the appropriate vehicle for it.&lt;br /&gt;&lt;br /&gt;Of course, "computer science is not about computers" but about formally expressing processes using symbols. The misnomer is consequential in how most people think about the question of the role of programming in education.&lt;br /&gt;&lt;br /&gt;We don't teach children how to write because we expect them all to be professional writers. Professional writers are not opposed to literacy on the grounds that they will lose readership. We do not call the ability to write "pencil science".&lt;br /&gt;&lt;br /&gt;Perhaps we should start, though. Maybe it would make the absurdity of how we misrepresent beginning software education as a vocational track more clear.&lt;br /&gt;&lt;br /&gt;I am focusing my explorations on an opportunity to write an article for the Python Papers in the very near future. I'd like to use this blog, at least at first, as a gathering place for ideas from others. If you have anything you'd like to add, read on.&lt;br /&gt;&lt;br /&gt;Many thanks&lt;br /&gt;Michael Tobis&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4170332600441687813-3068127462598545645?l=pencilscience.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pencilscience.blogspot.com/feeds/3068127462598545645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4170332600441687813&amp;postID=3068127462598545645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/3068127462598545645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4170332600441687813/posts/default/3068127462598545645'/><link rel='alternate' type='text/html' href='http://pencilscience.blogspot.com/2007/03/why-pencil-science.html' title='Why Pencil Science?'/><author><name>Michael Tobis</name><uri>http://www.blogger.com/profile/08229460438349093944</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://mtobis.googlepages.com/newhat.jpg/newhat-medium.jpg'/></author><thr:total>0</thr:total></entry></feed>
