<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title>Gary Robinson's Rants</title>
    
    <link rel="alternate" type="text/html" href="http://www.garyrobinson.net/" />
    <link rel="service.post" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716" title="Gary Robinson's Rants" /> 
    <id>tag:typepad.com,2003:weblog-9716</id>
    <updated>2012-04-27T20:27:10Z</updated>
    <subtitle>Rants on Python, the digital music business, politics, and other assorted random stuff.               </subtitle>
    <generator uri="http://www.typepad.com/">TypePad</generator>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/GaryRobinsonsRants" /><feedburner:info uri="garyrobinsonsrants" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
        <title>If you get stuck trying to Empty Trash in OS X</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/6PRFRAoFnEA/if-you-get-stuck-trying-to-empty-trash-in-os-x.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef016304db6a0d970d" title="If you get stuck trying to Empty Trash in OS X" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2012/04/if-you-get-stuck-trying-to-empty-trash-in-os-x.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef016304db6a0d970d</id>
        <published>2012-04-27T16:27:10-04:00</published>
        <updated>2012-04-27T20:27:10Z</updated>
        <summary>A few times, I've had a problem where the progress bar would stop progressing when I tried to empty the OS X Trash. Even going into the Terminal and trying to delete the files via sudo rm causes that command...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>A few times, I've had a problem where the progress bar would stop progressing when I tried to empty the OS X Trash. Even going into the Terminal and trying to delete the files via  <span style="font-family: Courier;"><span style="font-size: 12px;">sudo rm </span></span> causes that command to just sit there, making no progress. Rebooting the computer doesn't help. (And, just to be even more fun, the computer may not even allow itself to be rebooted without restarting the Finder first.)</p>
<p>Every time this has happened that I can recall, the problem has been with the "ownership" of some files in the Trash.</p>
<p>Luckily, there's a very easy solution. Go to the Terminal, and enter:</p>
<blockquote>
<p><span style="font-family: Courier;"><span style="font-size: 12px;">sudo chown -R xxxxx ~/.Trash/*</span></span></p>
</blockquote>
<p>(replacing xxxxx with your usual OS X "short" login name.) You'll have to enter an admin password.</p>
<p>After that, you should be able to Empty Trash from the Finder as usual with no problems.</p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/6PRFRAoFnEA" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2012/04/if-you-get-stuck-trying-to-empty-trash-in-os-x.html</feedburner:origLink></entry>
    <entry>
        <title>Thanks</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/ic9Uy53pUuI/thanks.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef0168e9daaf99970c" title="Thanks" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2012/04/thanks.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef0168e9daaf99970c</id>
        <published>2012-04-09T12:52:38-04:00</published>
        <updated>2012-04-09T17:27:33Z</updated>
        <summary>Please allow me to take a brief moment here to give me deepest, most heartfelt thanks to Maine-based periodontist Dr. Laura Reidy and her husband, dentist Dr. Jonathan Tozer, and one of their staff – whose name I am very...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p style="margin: 0.0px 0.0px 12.0px 0.0px; font: 12.0px Helvetica;">Please allow me to take a brief moment here to give me deepest, most heartfelt thanks to Maine-based periodontist <a href="http://neperioassoc.com/"><span style="text-decoration: underline; color: #1a37ef;">Dr. Laura Reidy</span></a> and her husband, dentist <a href="http://www.drjohntozer.com/"><span style="text-decoration: underline; color: #1a37ef;">Dr. Jonathan Tozer</span></a>, and one of their staff – whose name I am very sorry to say I have forgotten, but which I will find out and post here – who detected the cancer early enough to probably save my life. (This staff member noted the first signs of cancer in a regular cleaning session; she alerted Dr. Tozer, who alerted Dr. Reidy.)</p>
<p style="margin: 0.0px 0.0px 12.0px 0.0px; font: 12.0px Helvetica;">In particular, Dr. Reidy did something -- twice -- that I will be eternally grateful for. At first, it looked like it might be cancer, so she sent me to a cancer surgeon, who took biopsies and came to the conclusion that it wasn't.</p>
<p style="margin: 0.0px 0.0px 12.0px 0.0px; font: 12.0px Helvetica;">Although Dr. Reidy is not a cancer surgeon, she looked at my mouth and would not let the matter rest with the surgeon's judgement. She took another biopsy herself, sent it off to be examined, and it came back positive. Her pro-active approach, skill at collecting usable biopsy, and courage to question the surgeon's conclusion, may well have saved my life, because the cancer was caught before there was lymph node involvement. As noted in my previous post, the difference is a 68% vs. 17% five-year survival rate for <a href="http://www.merckmanuals.com/professional/ear_nose_and_throat_disorders/tumors_of_the_head_and_neck/oral_squamous_cell_carcinoma.html">the type of cancer</a> I had.</p>
<p style="margin: 0.0px 0.0px 12.0px 0.0px; font: 12.0px Helvetica;">I then went to another cancer surgeon, and had surgery which removed some of my palate and upper teeth.</p>
<p style="margin: 0.0px 0.0px 12.0px 0.0px; font: 12.0px Helvetica;">A year after my first surgery, my surgeon thought a spot on the edge of the surgical area looked a little suspicious, and did a "spot biopsy." It came back negative and he didn't pursue it. But when I saw Dr. Reidy two months later, she saw the same suspicious area and was again unwilling to assume that the surgeon's biopsy was correct. Her instincts told her it was still worrisome. She took another biopsy, and it came back positive. So, she may have saved my life not once, but twice, after she and her husband (and that assistant) identified it as possibly being cancer in the first place.</p>
<p style="margin: 0.0px 0.0px 12.0px 0.0px; font: 12.0px Helvetica;">I went to yet another surgeon, the excellent <a href="http://doctors.dana-farber.org/directory/profile.asp?pict_id=0000522">Dr. Charles Norris</a> in Boston, who did more surgery in the same area. And this time, the cancer does indeed appear to be gone -- at least there's been no sign of it in more than five years, and the prognosis is therefore good.</p>
<p style="margin: 0.0px 0.0px 12.0px 0.0px; font: 12.0px Helvetica;">So, my deepest, most sincere thanks to all those who helped me. There is no way I can express my gratitude enough.</p>
<p style="margin: 0.0px 0.0px 12.0px 0.0px; font: 12.0px Helvetica;"> </p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/ic9Uy53pUuI" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2012/04/thanks.html</feedburner:origLink></entry>
    <entry>
        <title>Update</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/ioAqC-deqPU/update.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef016303e4c849970d" title="Update" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2012/04/update.html" thr:count="3" thr:when="2012-04-10T14:00:50Z" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef016303e4c849970d</id>
        <published>2012-04-09T12:31:58-04:00</published>
        <updated>2012-04-09T19:42:22Z</updated>
        <summary>I have resigned from Emergent Discovery, LLC. I'm the main founder of the company (although I wasn't the CEO), so it is a sad thing. But I finally came to feel I'd be happier doing something else, and that my...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>I have resigned from <a href="http://www.emergentdiscovery.com/">Emergent Discovery, LLC</a>. I'm the main founder of the company (although I wasn't the CEO), so it is a sad thing. But I finally came to feel I'd be happier doing something else, and that my family would be happier too if I didn't come home as frustrated as I'd been.</p>
<p>Actually, I will go so far as to say that Steve Jobs' death had something to do with it. In his <a href="http://news.stanford.edu/news/2005/june15/jobs-061505.html">Stanford commencement address</a> he said:</p>
<blockquote>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.25em; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; vertical-align: baseline; line-height: 1.5em; padding: 0px; border: 0px initial initial;">When I was 17, I read a quote that went something like: "If you live each day as if it was your last, someday you'll most certainly be right." It made an impression on me, and since then, for the past 33 years, I have looked in the mirror every morning and asked myself: "If today were the last day of my life, would I want to do what I am about to do today?" And whenever the answer has been "No" for too many days in a row, I know I need to change something.</p>
</blockquote>
<p>After Jobs died, I watched that address, which I hadn't seen before. And I noticed that he'd been moved by something he'd happened to see, and that it had, perhaps, been an influence toward changing his life. And I thought, why shouldn't the same happen with me? The fact is that when I looked in the mirror and asked myself the same question Jobs asked himself, the answer would have been "No." For too many days in a row.</p>
<p>The fact is, life is very short. I probably have a more visceral sense of that fact than some people do because I've had cancer. I never talked about it on this blog, but my voice here, moving forward, will be more personal than it was in my Emergent period. This cancer, <a href="http://www.merckmanuals.com/professional/ear_nose_and_throat_disorders/tumors_of_the_head_and_neck/oral_squamous_cell_carcinoma.html">oral squamous carcinoma</a>, led me to undergo two major surgeries. The upper part of my mouth is largely replaced by a prosthesis (I do have five upper teeth left, which the prosthesis attaches to).</p>
<p>One article says:</p>
<blockquote>
<p>For carcinoma of the palate and tonsillar area, 5-yr survival is 68% if patients are treated before lymph node involvement but only 17% after involvement.</p>
</blockquote>
<p>The cancer was caught earlier enough that I had no lymph node involvement. But I was highly conscious of the fact that I might die. A year after the first surgery, which removed a good part of my palate, the cancer came back. That, obviously, was quite scary. I had a second surgery, continuing to work hard for Emergent all that time except for basic surgical recovery periods.</p>
<p>Since then there has been no sign of cancer for more than five years.</p>
<p>But, I don't take life for granted. Anything can happen; cancer can return, and there are certainly many other ways of exiting the stage! Life is simply too short and precious to waste a minute of it.</p>
<p>I was therefore primed to hear the combined message of Steve Jobs' speech and, not many years later, his death. And it became one of the catalysts (there were others) leading to a long period of trying to work out what could change so that I would feel differently about working at Emergent. In the end, for a number of reasons, the best answer seemed to be: I should resign.</p>
<p>I don't think it's the time to go into a detailed post-mortem. I wish Emergent well, and I'm moving on. At this point, I'm much more interested in the future.</p>
<p>I'll probably be posting more to this blog, and I'll certainly use it to talk about my next project. I haven't decided yet what that will be. I'm researching and considering various, very diverse options now.</p>
<p>But I do know that <a href="http://news.ycombinator.com/item?id=77246">I won't have a cofounder</a>. In fact, I'm going to try to get a web services or mobile app off the ground without even an employee.</p>
<p>The technology is vastly better than it used to be. Cloud services like Heroku eliminate many of the technical and hardware barriers.</p>
<p>Virality can lessen the need for traditional marketing expertise, though that can will occur if and only if you have the right idea at exactly the right time, and build a good-enough, attractive-enough embodiment of it. Of course, you can create and test a series of <a href="http://en.wikipedia.org/wiki/Minimum_viable_product">minimum viable products</a> representing different ideas strategies, which gives you a few shots at coming up with the idea. But it's still a Very Hard Thing To Do. On the other hand, if you can achieve it, you can build a business with precious little marketing expenditure.</p>
<p>That's what I'm going to try to do. Build the technology myself, leveraging "<a href="http://aws.amazon.com/">the</a><a href="http://www.heroku.com/"> cloud</a>," and try to spark virality. Of course, I may fail, but I think I'll succeed. This view of the world may be wrong, but no one will accuse me of not acting in accordance with it.</p>
<p>Once the product is off the ground, and has achieved a non-trivial degree of critical mass, I'll consider looking for investment and people who can come aboard and help scale it.</p>
<p>I do have some reason to think this is not impossible. For one thing, I created one of the first viral computer services that ever existed. This was a voice-mail-based dating service called 212-ROMANCE, which I started in the early 1980's. As far as I know, it was the first such service. It was enough of the right-idea-at-the-right time, that after I initially ran one small ad once in the <a href="http://www.villagevoice.com/">Village Voice</a>, usage grew continually until all phone lines were busy continuously. It was spread entirely by word-of-mouth. Eventually, I could go to a party and people I met there would already know about it.</p>
<p>As an aside, because it took a long time to listen to personals ads, I needed a way for the system to play the ads that were most appropriate for each caller first. I designed and implemented a solution that would now be referred to as "<a href="http://en.wikipedia.org/wiki/Collaborative_filtering">collaborative filtering</a>". I'm not aware of that concept being written about or implemented before that (if you know otherwise, please let me know).</p>
<p>So anyway… this post has covered a lot of ground, though none of it particularly in-depth. I wanted to bring this blog up-to-date and prepare the ground for more blogging in the future, and hopefully I've succeeded in that.</p>
<p> </p>
<p> </p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/ioAqC-deqPU" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2012/04/update.html</feedburner:origLink></entry>
    <entry>
        <title>Calculating the product of a Python list</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/mRd1nh3-bY0/calculating-the-product-of-a-python-list.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef0168e68f54cf970c" title="Calculating the product of a Python list" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2012/02/calculating-the-product-of-a-python-list.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef0168e68f54cf970c</id>
        <published>2012-02-02T10:48:31-05:00</published>
        <updated>2012-02-02T15:48:31Z</updated>
        <summary>I came across a stackoverflow question about multiplying the numbers in a Python list. Suggestions there included: def product(list): p = 1 for i in list: p *= i return p and from operator import mul reduce(mul, list) You can...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Python" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; padding: 0px; border: 0px initial initial;">I came across a <a href="http://stackoverflow.com/questions/2104782/returning-the-product-of-a-list/9114648#9114648">stackoverflow question</a> about multiplying the numbers in a Python list. Suggestions there included:</p>
<pre class="default prettyprint" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow-x: auto; overflow-y: auto; width: auto; max-height: 600px; background-position: initial initial; background-repeat: initial initial; padding: 5px; border: 0px initial initial;"><code style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"><span class="kwd" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #00008b; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">def</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> product</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">(</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">list</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">):</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"><br />    p </span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">=</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span class="lit" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #800000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">1</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"><br />    </span><span class="kwd" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #00008b; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">for</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> i </span><span class="kwd" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #00008b; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">in</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> list</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">:</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"><br />        p </span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">*=</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> i<br />    </span><span class="kwd" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #00008b; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">return</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> p</span></code></pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; padding: 0px; border: 0px initial initial;">and</p>
<pre class="default prettyprint" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow-x: auto; overflow-y: auto; width: auto; max-height: 600px; background-position: initial initial; background-repeat: initial initial; padding: 5px; border: 0px initial initial;"><code style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"><span class="kwd" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #00008b; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">from</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span class="kwd" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #00008b; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">operator</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span class="kwd" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #00008b; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">import</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> mul<br />reduce</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">(</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">mul</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">,</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> list</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">)</span></code></pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; padding: 0px; border: 0px initial initial;">You can also do:</p>
<pre class="default prettyprint" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow-x: auto; overflow-y: auto; width: auto; max-height: 600px; background-position: initial initial; background-repeat: initial initial; padding: 5px; border: 0px initial initial;"><code style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"><span class="kwd" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #00008b; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">import</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> math<br />math</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">.</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">exp</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">(</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">sum</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">(</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">map</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">(</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">math</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">.</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">log</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">,</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> list</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">)))</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"><br /></span></code></pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; padding: 0px; border: 0px initial initial;">It's not as readable as the reduce-based solution, though if you're a mathematician who isn't familiar with reduce() the opposite might be true!</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; padding: 0px; border: 0px initial initial;">I wouldn't advise using the log-based solution under normal circumstances. But if you're ever in a situation where you risk overflow or overflow, such as in</p>
<pre class="default prettyprint" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow-x: auto; overflow-y: auto; width: auto; max-height: 600px; background-position: initial initial; background-repeat: initial initial; padding: 5px; border: 0px initial initial;"><code style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;&gt;&gt;</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> reduce</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">(</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">mul</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">,</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">[</span><span class="lit" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #800000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">10.</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">]*</span><span class="lit" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #800000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">309</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">)</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"><br />inf<br /></span></code></pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; padding: 0px; border: 0px initial initial;">and your purpose is to compare the products of different sequences rather than to know what the products are, then</p>
<pre class="default prettyprint" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow-x: auto; overflow-y: auto; width: auto; max-height: 600px; background-position: initial initial; background-repeat: initial initial; padding: 5px; border: 0px initial initial;"><code style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">&gt;&gt;&gt;</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> sum</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">(</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">map</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">(</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">math</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">.</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">log</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">,</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"> </span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">[</span><span class="lit" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #800000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">10.</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">]*</span><span class="lit" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #800000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">309</span><span class="pun" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">))</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"><br /></span><span class="lit" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #800000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">711.49879373515785</span><span class="pln" style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #000000; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"><br /></span></code></pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; padding: 0px; border: 0px initial initial;">is the way to go because it's virtually impossible to have a real-world problem in which you would overflow or underflow with this approach. (The larger the result of that calculation is, the larger the product would be if you <em style="font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; font-style: italic; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">could</em> calculate it.)</p>
<!-- Technorati Tags End --><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/mRd1nh3-bY0" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2012/02/calculating-the-product-of-a-python-list.html</feedburner:origLink></entry>
    <entry>
        <title>Selenium's WebDriver &amp; Python: Dealing with script timeouts</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/bA6nx2yHQhg/seleniums-webdriver-python-dealing-with-script-timeouts.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef014e88d2a596970d" title="Selenium's WebDriver &amp; Python: Dealing with script timeouts" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2011/06/seleniums-webdriver-python-dealing-with-script-timeouts.html" thr:count="3" thr:when="2012-09-20T01:08:19Z" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef014e88d2a596970d</id>
        <published>2011-06-01T12:00:56-04:00</published>
        <updated>2011-07-11T21:40:07Z</updated>
        <summary>Selenium's WebDriver is a great way to interact with web sites in an automated way. It's primarily for testing, though I've also had occasion to use it for other purposes (with the permission of the relevant site owners). In order...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Python" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>Selenium's WebDriver is a great way to interact with web sites in an automated way. It's primarily for testing, though I've also had occasion to use it for other purposes (with the permission of the relevant site owners).</p>
<p>In order to interact with sites that use a lot of Javascript, it's helpful to use Selenium's Firefox driver. It works great, but I did have one problem, where scripts were timing out. You can modify Firefox's timeouts via changing preferences, but Selenium's Firefox driver uses its own profile, so it ignores Firefox's usual means for changing preferences.</p>
<p>I searched the web for solutions and found various suggestions that didn't work. Perhaps many of them worked with pre-WebDriver versions of Selenium, I don't know.</p>
<p>In any case, the following worked for me to change the timeouts to 10 minutes:</p>
<blockquote>
<pre style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="font-family: 'Courier New';">from selenium import webdriver</span></pre>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="font-family: 'Courier New';">profile = webdriver.firefox \</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="font-family: 'Courier New';"> .firefox_profile.FirefoxProfile()</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="font-family: 'Courier New';">set_pref = profile.set_preference</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="font-family: 'Courier New';">set_pref('dom.max_script_run_time', </span><span style="font-family: 'Courier New';">600)</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="font-family: 'Courier New';">set_pref('dom.max_chrome_script_run_time', </span><span style="font-family: 'Courier New';">600)</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="font-family: 'Courier New';">driver = webdriver.Firefox(fx_profile=profile)</span></p>
</blockquote>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="font-size: medium;">Note that the dom.max_chrome_script_run_time preference has nothing to do with Google Chrome, it's related to Firefox's internal </span><span style="font-size: medium;"><a href="http://kb.mozillazine.org/Chrome_URLs">Chrome URL's</a></span><span style="font-size: medium;">. In fact, for my purposes, I only needed to change dom.max_chrome_script_run_time.</span></p>
<p>Note: if you're not familiar with WebDriver, do help(webdriver.Firefox) for a description of the methods you have available for interacting with sites. Hint: the oddest thing is that to fill in a text field, you get an object representing the element with the text field, and then call myElement.send_keys("the text").</p>
<p>Update: Docs on the Python bindings may be found <a href="http://code.google.com/p/selenium/wiki/PythonBindings">here</a>.</p>
<p> </p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/bA6nx2yHQhg" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2011/06/seleniums-webdriver-python-dealing-with-script-timeouts.html</feedburner:origLink></entry>
    <entry>
        <title>Profiles In Courage</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/Nwzm3DzhuKE/profiles-in-courage.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef0148c84afb67970c" title="Profiles In Courage" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2011/02/profiles-in-courage.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef0148c84afb67970c</id>
        <published>2011-02-03T09:09:59-05:00</published>
        <updated>2011-02-11T17:16:06Z</updated>
        <summary>I've been paying particular attention to one Egyptian who's been tweeting about events, whose Twitter ID is Sandmonkey. I don't know about you, but when I start following somebody via blogs or twitter and they are expressing what matters to...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Current Affairs" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p> </p>
<div>I've been paying particular attention to one Egyptian who's been tweeting about events, whose Twitter ID is Sandmonkey. I don't know about you, but when I start following somebody via blogs or twitter and they are expressing what matters to them, I feel a bit like I know them. I start to care about them. Here are his most recent tweets (skipping the ones I can't read because they're in Arabic, and the ones that only link to another page):<br /><br />Sandmonkey <br /><strong>Anti-Mubarak protesters are descending on downton in the thousands. They are not giving up Tahrir. #JAN25</strong><br />16 hours ago Favorite Retweet Reply<br /><br />Sandmonkey <br /><strong>I hear reports of Army evacuating the Square from Protesters. Is this true? #jan25</strong><br />5 hours ago Favorite Retweet Reply<br /><br />Sandmonkey <br /><strong>Either way, I am heading there with medical supplies. They better not block my entrance. #jan25</strong><br />5 hours ago Favorite Retweet Reply<br /><br />Then somebody telling him how to get into Tahrir:<br /><br />ahmada2 <br /><strong>@Sandmonkey it's open. Kasr el Nile or talaat harb.</strong><br />5 hours ago Favorite Retweet Reply<br /><br />Then…<br /><br />SorayaBahgat <br /><strong>Reports about my dear friend @Sandmonkey being arrested in#Tahrir. So worried can anyone give me more info? @bencnn#Egypt</strong><br />1 hour ago Favorite Retweet Reply<br /><br />and a number of other tweets from different people reporting the same thing, including:</div>
<div>
<div>lisang Lisa Goldman</div>
<div><strong>.@sandmonkey was arrested today &amp; his blog has been suspended. Read his very important final post about #jan25 here: <a href="http://bit.ly/hqIJ2b">http://bit.ly/hqIJ2b</a></strong></div>
</div>
<div>That post ends:</div>
<div>"This is a losing battle and they have all the weapons, but we will continue fighting until we can’t. I am heading to Tahrir right now with supplies for the hundreds injured, knowing that today the attacks will intensify, because they can’t allow us to stay there come Friday, which is supposed to be the game changer. We are bringing everybody out, and we will refuse to be anything else than peaceful. If you are in Egypt, I am calling on all of you to head down to Tahrir today and Friday. It is imperative to show them that the battle for the soul of Egypt isn’t over and done with. I am calling you to bring your friends, to bring medical supplies, to go and see what Mubarak’s gurantees look like in real life. Egypt needs you. Be Heroes."</div>
<div>Update: He is out of jail now. "<a href="http://lisagoldman.net/2011/02/03/egypt-right-now-by-sandmonkey/">He was roughed up, but is fine.</a>" Sitting here in Bangor, Maine, enjoying the peaceful, beautiful snow, I'm in awe of this kind of courage.</div>
<div />
<div><strong>Later update:</strong></div>
<div><strong><br /></strong></div>
<div>
<div>Sandmonkey Sandmonkey</div>
<div><strong>I am ok. I got out. I was ambushed &amp; beaten by the police, my phone confiscated , my car ripped apar&amp; supplies taken #jan25</strong></div>
</div>
<div>28 minutes ago Favorite Retweet Reply</div>
<div>
<div />
<div>Sandmonkey Sandmonkey</div>
<div><strong>will tell the story later . Thank you all. I just need to rest now. #jan25</strong></div>
<div>16 minutes ago Favorite Retweet Reply</div>
</div>
<div><em><span style="font-style: normal;"><em>
<p> </p>
</em>
<p><strong>Last update, Feb 11:</strong></p>
<p>The courage of Sandmonkey and all the protestors has <a href="http://www.nytimes.com/2011/02/12/world/middleeast/12egypt.html?hp">paid off</a>. Unbelievable to have been privileged to watch this history unfold in real time. Here's the last tweet from Sandmonkey I'll post here:</p>
<p>
<p><em><span style="font-style: normal;">
<p style="display: inline !important;"> </p>
<p style="display: inline !important;">Sandmonkey Sandmonkey</p>
</span></em><em><span style="font-style: normal;">
<p style="display: inline !important;"> </p>
<p style="display: inline !important;"><strong>To everyone who rediculed us, opposed us, wanted us to compromise, i say: YOU ARE WELCOME :) TODAY WE ALL CELEBRATE!!! #JAN25</strong></p>
<p> </p>
</span></em></p>
</p>
<p><em><span style="font-style: normal;"><br /></span></em></p>
<p>Now, let's hope that the ruling Supreme Council of the Armed Forces doesn't turn out to just enable a continuation of the same type of authoritarian regime...</p>
<em><em><em><em><em> </em></em></em></em></em></span><em><em> </em><em><em><em><em>
<p> </p>
</em></em></em></em></em><em><em><em> </em>
<p> </p>
</em></em>
<p> </p>
<em> </em>
<p> </p>
<em> </em>
<p> </p>
</em></div>
<p> </p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/Nwzm3DzhuKE" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2011/02/profiles-in-courage.html</feedburner:origLink></entry>
    <entry>
        <title>How to tune a guitar</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/JMS7MiM2srM/how-to-tune-a-guitar.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef0133f4cbbd64970b" title="How to tune a guitar" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2010/10/how-to-tune-a-guitar.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef0133f4cbbd64970b</id>
        <published>2010-10-02T12:30:07-04:00</published>
        <updated>2010-10-02T16:30:07Z</updated>
        <summary>...if you're a luthier, that is. I was wondering why a Yamaha classical guitar I purchased a few years ago always seems out of tune, and started a discussion about it in a guitar forum, including measuring the pitch while...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>...if you're a luthier, that is.</p>
<p>I was wondering why a Yamaha classical guitar I purchased a few years ago always seems out of tune, and started a discussion about it in a <a href="http://www.acousticguitar.com/ubbcgi/ultimatebb.cgi?ubb=get_topic&amp;f=7&amp;t=010737#000012">guitar forum</a>, including measuring the pitch while each string is open and fingered on the 5th and 12th frets (bizarrely inconsistent results). They suggested I check out this <a href="http://www.byersguitars.com/Research/Research.html">fascinating article</a> by <a href="http://www.byersguitars.com/About/About.html">Gregory Byers</a>. It describes the lengths (pun not intended but allowed) a guitar-maker has to go to to create a situation where each string is somewhat in tune on each fret. My Yamaha was not made that carefully! Of course very few guitars are. Byers spends a month making a guitar,  and they cost $9,500.</p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/JMS7MiM2srM" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2010/10/how-to-tune-a-guitar.html</feedburner:origLink></entry>
    <entry>
        <title>Get yer mental health here!</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/t_Gnn8kIr2g/get-yer-mental-health-here.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef013487eb7807970c" title="Get yer mental health here!" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2010/10/get-yer-mental-health-here.html" thr:count="1" thr:when="2010-10-02T17:29:02Z" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef013487eb7807970c</id>
        <published>2010-10-02T12:07:17-04:00</published>
        <updated>2010-10-02T16:07:17Z</updated>
        <summary>A friend of mine, Tom Sulcer, with whom I like to harmonize on tunes like the Beatle's "If I Fell," posted a fairly massive article called "Mentally Healthy Mind" in a Google knowl. It touches on everything from deliberative democracy...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>A friend of mine, <a href="http://knol.google.com/k/thomas-sulcer/thomas-sulcer/38jyd65oa42fm/0#">Tom Sulcer</a>, with whom I like to harmonize on tunes like the Beatle's "If I Fell," posted a fairly massive article called "<a href="http://knol.google.com/k/thomas-sulcer/mentally-healthy-mind/">Mentally Healthy Mind</a>" in a Google knowl. It touches on everything from deliberative democracy to Maslow to Spinoza. Did I mention that it's massive? My own impression is that most of the important understandings in life are largely unconscious and hard to modify through conscious deliberation, whereas Tom appears to try and leverage a conscious understanding of just about everything related to living a life. We'll see who's right by noting which of us plays better guitar at age 95.</p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/t_Gnn8kIr2g" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2010/10/get-yer-mental-health-here.html</feedburner:origLink></entry>
    <entry>
        <title>A Dog's Consciousness</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/8KnZwn2KCC8/a-dogs-consciousness.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef0133f26ae7bb970b" title="A Dog's Consciousness" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2010/07/a-dogs-consciousness.html" thr:count="3" thr:when="2012-02-17T20:12:26Z" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef0133f26ae7bb970b</id>
        <published>2010-07-20T09:54:42-04:00</published>
        <updated>2011-02-03T14:52:12Z</updated>
        <summary>Here's a way to imagine what it would be like to be a dog. Take a few moments to imagine yourself exactly as you are now, with the exception of not being able to focus your attention on anything that...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>Here's a way to imagine what it would be like to be a dog.</p>
<p>Take a few moments to imagine yourself exactly as you are now, with the exception of not being able to focus your attention on anything that exists only in your head. You don't even have to imagine not having thoughts. You just can't focus on them.</p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/8KnZwn2KCC8" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2010/07/a-dogs-consciousness.html</feedburner:origLink></entry>
    <entry>
        <title>Non-blocking raw_input for Python</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/8u5vT0gjKF4/non-blocking-raw_input-for-python.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef0120a64753a8970c" title="Non-blocking raw_input for Python" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2009/10/non-blocking-raw_input-for-python.html" thr:count="3" thr:when="2012-09-19T00:44:21Z" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef0120a64753a8970c</id>
        <published>2009-10-17T14:19:10-04:00</published>
        <updated>2010-08-30T15:01:06Z</updated>
        <summary>[Edited Aug. 30, 2010 to fix a typo in the function name and generally improve formatting] I needed a way to allow a raw_input() call to time out. In case it's useful to anyone, I wrote this solution which works...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Python" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Web/Tech" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>[Edited Aug. 30, 2010 to fix a typo in the function name and generally improve formatting]</p>
<p>I needed a way to allow a raw_input() call to time out. In case it's useful to anyone, I wrote this solution which works under Unix-like OS's.</p>
<pre>
import signal

class AlarmException(Exception):
    pass

def alarmHandler(signum, frame):
    raise AlarmException

def nonBlockingRawInput(prompt='', timeout=20):
    signal.signal(signal.SIGALRM, alarmHandler)
    signal.alarm(timeout)
    try:
        text = raw_input(prompt)
        signal.alarm(0)
        return text
    except AlarmException:
        print '\nPrompt timeout. Continuing...'
    signal.signal(signal.SIGALRM, signal.SIG_IGN)
    return ''</pre>
<p> </p>
<p> </p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/8u5vT0gjKF4" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2009/10/non-blocking-raw_input-for-python.html</feedburner:origLink></entry>
    <entry>
        <title>Snow Leopard Guest User data loss bug</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/Ruk7gnaPMys/snow-leopard-guest-user-data-loss-bug.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef0120a5dd0237970b" title="Snow Leopard Guest User data loss bug" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2009/10/snow-leopard-guest-user-data-loss-bug.html" thr:count="2" thr:when="2009-10-13T19:56:49Z" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef0120a5dd0237970b</id>
        <published>2009-10-12T12:46:08-04:00</published>
        <updated>2009-10-13T20:06:58Z</updated>
        <summary>I've seen a number of mentions today of a bug that can cause a Snow Leopard user to lose all their data: The problem appears to manifest itself on machines which had the Guest account option enabled under Leopard and...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Web/Tech" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>I've seen a number of mentions today of a bug that can cause a Snow Leopard user to lose all their data:</p>
<blockquote>
  <p>The problem appears to manifest itself on machines which had the Guest account option enabled under Leopard and were subsequently upgraded to Snow Leopard. Users booting their machines have reported that upon start-up, they have been logged into the Guest account. Upon switching to their regular account, the affected users have been finding all of their user data missing and unrecoverable except from a backup. [<a href="http://forums.macrumors.com/showthread.php?t=801736">MacRumors</a>.]</p>
</blockquote>One user <a href="http://forums.macrumors.com/showpost.php?p=8629578&amp;postcount=21">reports</a> a way to recover the lost data. Since it's buried in a discussion thread, I'm reproducing it here (also fixing a typo pointed out by a reader of this blog):

<blockquote>
  The files were still in /Users,<br />
  recovery was not too difficult.
</blockquote>
<blockquote>
  1) su in terminal<br />
  2) mv username username.old<br />
  3) create account username<br />
  4) mv username username.new<br />
  5) mv username.old username<br />
  6) chown -R username username
</blockquote>
<p>I don't know whether it's a general fix. If you run into the bug and decide to try this solution, feel free to post your experience in the comments section!</p>
<xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/Ruk7gnaPMys" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2009/10/snow-leopard-guest-user-data-loss-bug.html</feedburner:origLink></entry>
    <entry>
        <title>FlyFi.com upgrade</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/fD-_0XzYvMc/flyficom-upgrade.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef0120a5ba7347970c" title="FlyFi.com upgrade" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2009/09/flyficom-upgrade.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef0120a5ba7347970c</id>
        <published>2009-09-11T10:53:33-04:00</published>
        <updated>2009-09-11T14:53:33Z</updated>
        <summary>We've made a substantial upgrade to the look and feel of our Flyfi.com web site. The site does a lot, and this release has been geared toward making the functionality more readily apparent and easier to use.</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Music" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Web/Tech" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>We've made a substantial upgrade to the look and feel of our <a href="http://thenextweb.com/2009/09/10/breaking-facebook-adds-mentions-status-updates/">Flyfi.com</a> web site. The site does a lot, and this release has been geared toward making the functionality more readily apparent and easier to use.</p>
<xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/fD-_0XzYvMc" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2009/09/flyficom-upgrade.html</feedburner:origLink></entry>
    <entry>
        <title>FlyFi Community Playlist</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/qupI05ophLc/flyfi-community-playlist.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef0115725363de970b" title="FlyFi Community Playlist" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2009/08/flyfi-community-playlist.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef0115725363de970b</id>
        <published>2009-08-02T12:39:41-04:00</published>
        <updated>2009-08-02T16:39:41Z</updated>
        <summary>If you're a Facebook user, you might want to check out my company's FlyFi Community Playlist app which lets a Facebook community collaborate on a playlist... but it's more than a playlist because it also provides tracks related to the...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Music" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Web/Tech" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>If you're a Facebook user, you might want to check out my <a href="http://www.flyfi.com/">company</a>'s <a href="http://www.facebook.com/apps/application.php?id=88270597788">FlyFi Community Playlist</a> app which lets a Facebook community collaborate on a playlist... but it's more than a playlist because it also provides tracks related to the manually entered ones.</p>

<p>A fair number of the tracks are legally downladable free MP3's, from superb artists like Randy Newman (one of my personal top 5 artists), Ani DiFranco, Suzanne Vega, Dar Williams, and many others. </p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/qupI05ophLc" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2009/08/flyfi-community-playlist.html</feedburner:origLink></entry>
    <entry>
        <title>Correction re singletons</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/FeKRIvN2kq4/correction-re-singletons.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef011571519d99970c" title="Correction re singletons" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2009/07/correction-re-singletons.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef011571519d99970c</id>
        <published>2009-07-29T11:36:43-04:00</published>
        <updated>2012-05-08T02:08:11Z</updated>
        <summary>The source code link presented at the main post for my singleton mixin classes was bad until now. It pointed to an earlier version that didn't have thread safety or various other improvements. Sorry.</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Web/Tech" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>The source code link presented at the main <a href="http://www.garyrobinson.net/2004/03/python_singleto.html">post</a> for my singleton mixin classes was bad until now. It pointed to an earlier version that didn't have thread safety or various other improvements. Sorry.</p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/FeKRIvN2kq4" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2009/07/correction-re-singletons.html</feedburner:origLink></entry>
    <entry>
        <title>Even more singleton improvements</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/wyUv3GPFdEA/even-more-singleton-improvements.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef0115714c3234970c" title="Even more singleton improvements" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2009/07/even-more-singleton-improvements.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef0115714c3234970c</id>
        <published>2009-07-28T08:32:30-04:00</published>
        <updated>2009-07-29T15:03:49Z</updated>
        <summary>singletonmixin now deals with cases where you want to be able to include args in calls to S.getInstance() even after the initial instantiation.</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Web/Tech" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://www.garyrobinson.net/2004/03/python_singleto.html">singletonmixin</a> now deals with cases where you want to be able to include args in calls to S.getInstance() even after the initial instantiation.</p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/wyUv3GPFdEA" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2009/07/even-more-singleton-improvements.html</feedburner:origLink></entry>
    <entry>
        <title>More singleton improvements</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/VThvVr5tBlk/more-singleton-improvements.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=6a00d8341da47953ef0115714a66fb970c" title="More singleton improvements" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2009/07/more-singleton-improvements.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00d8341da47953ef0115714a66fb970c</id>
        <published>2009-07-27T22:36:53-04:00</published>
        <updated>2009-07-28T02:36:53Z</updated>
        <summary>Based on internal work and feedback appearing in comments on this blog, I've updated the Python singleton class I posted way back in 2004. That earlier post remains the place to get the code and place any further comments. It...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Web/Tech" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>Based on internal work and feedback appearing in comments on this blog, I've updated the Python <a href="http://www.garyrobinson.net/2004/03/python_singleto.html">singleton</a> class I posted way back in 2004. That earlier post remains the place to get the code and place any further comments.</p>

<p>It now handles keyword arguments, and is threadsafe for singleton creation.</p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/VThvVr5tBlk" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2009/07/more-singleton-improvements.html</feedburner:origLink></entry>
    <entry>
        <title>Cable News</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/_PBmVOhR9i8/cable-news.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=68161521" title="Cable News" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2009/06/cable-news.html" thr:count="1" thr:when="2009-06-21T08:03:29Z" />
        <id>tag:typepad.com,2003:post-68161521</id>
        <published>2009-06-16T10:39:11-04:00</published>
        <updated>2009-06-16T14:39:11Z</updated>
        <summary>I was stunned at how poor the Iran coverage was on cable news over the weekend. Then I saw this thought from Matthew Yglesias: Whenever I find myself talking about new media to skeptics of an older generation who worry...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Current Affairs" />
        
        
<content type="html" xml:lang="en-US" xml:base="http://www.garyrobinson.net/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;
I was stunned at how poor the Iran coverage was on cable news over the weekend. Then I saw this thought from &lt;a href="http://yglesias.thinkprogress.org/archives/2009/06/media-at-its-worst.php"&gt;Matthew Yglesias&lt;/a&gt;:
&lt;/p&gt;&lt;blockquote&gt;
&lt;em&gt;Whenever I find myself talking about new media to skeptics of an older generation who worry that the standards online are too debased, I try to remind people that the real debasing came with the rise of multi-channel cable news. In terms of the Iranian elections, the world&amp;#8217;s top newspapers have the people on the ground reporting the main facts, and there&amp;#8217;s lots of smart analysis from legitimate experts all over the web, but &lt;strong&gt;on television if it can&amp;#8217;t be captured by two talking heads debating each other it&amp;#8217;s like it never happened.&lt;/strong&gt;&lt;/em&gt;
(Hat tip to &lt;a href="http://www.huffingtonpost.com/2009/06/15/ifareed-zakaria-gpsi-rede_n_215596.html"&gt;Jason Linkins&lt;/a&gt;, who also provided the emphasis.) &lt;/blockquote&gt; 

I had noticed that CNN seems to show an awful lot of discussion between experts over each event -- often much more of that than direct coverage of the event itself But I'd never thought of it in quite the way Matthew puts it. Anyway, I turned on CNN this morning to see whether, for a change, they were covering Iran.
&lt;br&gt;&lt;br&gt;
And they were -- kind of. There was some talking head being asked about whether Obama should be taking more of a stand in favor of the protestors. The guy's opinion was that he should.
&lt;br&gt;&lt;br&gt;
The picture is being coming clearer. Generally CNN consists of one or more talking heads in a room, taking turns talking about whether the latest news event is being handled in accordance with their personal opinion. Proportionately speaking, there seems to be not all that much actual reporting of facts.
&lt;br&gt;&lt;br&gt;
I still don't get the reason why this is happening. Maybe it's because people find it more enjoyable than actual reporting because it's a little like gossiping about the failures of the newsmakers? Or is it that and there's a tiny bit of "human drama" when the talking heads disagree -- kind of a combination of news and reality TV? Or could it simply be that it costs less than actual reporting?  (They probably don't even have to pay the talking heads, who are happy to be there to publicize themselves.)
&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/_PBmVOhR9i8" height="1" width="1"/&gt;</content>


    <feedburner:origLink>http://www.garyrobinson.net/2009/06/cable-news.html</feedburner:origLink></entry>
    <entry>
        <title>Iran</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/mMpABPEtSLs/iran.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=68139537" title="Iran" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2009/06/iran.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-68139537</id>
        <published>2009-06-15T17:41:27-04:00</published>
        <updated>2009-06-15T21:46:08Z</updated>
        <summary>If you've been following developments in Iran, and particularly the Internet's essential role in reporting (and supporting) events, I don't have much to add. If you haven't, I strongly suggest you go to Andrew Sullivan's blog and starting following him...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Current Affairs" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Web/Tech" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>If you've been following developments in Iran, and particularly the Internet's essential role in reporting (and supporting) events, I don't have much to add. </p>

<p>If you haven't, I strongly suggest you go to <a href="http://andrewsullivan.theatlantic.com/">Andrew Sullivan's blog</a> and starting following him now -- as well taking a bit of time to look through his posts from the last couple of days. He's been doing a wonderful job. Far better than any mainstream news outlet, with the possible exception of the NY Times' <a href="http://thelede.blogs.nytimes.com/">Lede</a>. (Although the Lede doesn't present as much detail and analysis as Sullivan does -- with the help of his readers and well-chosen links to other sources.) </p>

<p>One of Sullivan's <a href="http://andrewsullivan.theatlantic.com/the_daily_dish/2009/06/twitter-vs-the-coup.html">readers</a> sums up the key role Twitter is coming to play:</p>

<blockquote><em>Ahmadinejad's and Khamenei's websites were taken down yesterday - I saw the latter go down within a couple of minutes because of a DDOS attack organised via Twitter. @StopAhmadi is a good source for tweets on this. The other important use of Twitter has been distribution of proxy addresses via Twitter. This would be how most video and pictures of today's rally have gotten out.</em></blockquote>

<p>One amazing thing is that it seems at least conceivable that the protests would not have been as successful as they currently appear to be if Twitter didn't exist.</p>

<p>Sullivan <a href="http://andrewsullivan.theatlantic.com/the_daily_dish/2009/06/yes-the-dish-is-now-green.html">suggests</a> wearing green in support of the protesters. I think that's a great idea.</p><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/mMpABPEtSLs" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2009/06/iran.html</feedburner:origLink></entry>
    <entry>
        <title>Flyfi.com</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/_H9zunyPAD8/flyficom.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=67919247" title="Flyfi.com" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2009/06/flyficom.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-67919247</id>
        <published>2009-06-09T21:29:48-04:00</published>
        <updated>2009-06-10T01:29:48Z</updated>
        <summary>Most people reading this blog will know that I am a founder of the company that makes Flyfi.com (basically a vastly improved reboot of the old Goombah site). In the last couple of weeks we have added enormously to the...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Music" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Web/Tech" />
        
        
<content type="html" xml:lang="en-US" xml:base="http://www.garyrobinson.net/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;Most people reading this blog will know that I am a founder of the company that makes &lt;a href="http://www.flyfi.com/"&gt;Flyfi.com&lt;/a&gt; (basically a vastly improved reboot of the old Goombah site).&lt;/p&gt;

&lt;p&gt;In the last couple of weeks we have added enormously to the site, including improved recommendations. If you haven't checked it out, please do!&lt;/p&gt;

&lt;p&gt;Here's a note I wrote to introduce it to some high school friends who I recently reconnected with on Facebook:&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;blockquote&gt;Hi Everyone. You may remember me playing my guitar in the hallowed halls of B.H.S. In college I became interested in math &amp;#38; computer technology, and in recent years, I've come full-circle by finally merging my interests. I've co-founded a music-oriented Internet startup. Our product is &lt;a href="http://www.flyfi.com/"&gt;FlyFi&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Our VP/Industry Relations who, in a former life, earned 10 Grammy nominations as a producer, is now dedicated to using his industry connections for getting us the highest quality free music collection on the Internet. We've got great indie artists like Ani DiFranco, some well-known, others up-and-coming. Unlike some of our competing services you don't just hear the music for free -- you can also download many tracks as free legal MP3's. &lt;/p&gt;

&lt;p&gt;My area of focus is our music recommendation technology, which lets you type in artists you like and get music out that you'll probably also like. I love music from many genres, from the Beatles to Beethoven to John Coltrane to Leonard Cohen. But I think there are underlying commonalities in the music I most love, regardless of genre. So we have statistical algorithms that try to find music that has those commonalities for each person's tastes. &lt;/p&gt;

&lt;p&gt;Over the last 6 weeks or so, I've been completely wrapped up in putting the finishing touches on the first full release of FlyFi (which is why some of you may have noticed that my Facebook communication flow has dropped pretty much to zero). It's out now, ready for your perusal.&lt;/p&gt;

&lt;p&gt;So, if you love music, go check out FlyFi.com!&lt;/p&gt;

&lt;p&gt;Best,&lt;br /&gt;
Gary&lt;/blockquote&gt;&lt;/p&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/_H9zunyPAD8" height="1" width="1"/&gt;</content>


    <feedburner:origLink>http://www.garyrobinson.net/2009/06/flyficom.html</feedburner:origLink></entry>
    <entry>
        <title>Tom Swifties</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GaryRobinsonsRants/~3/RQ8WS4HvM1o/tom-swifties.html" />
        <link rel="service.edit" type="application/atom+xml" href="http://www.typepad.com/t/atom/weblog/blog_id=9716/entry_id=67707401" title="Tom Swifties" />
        <link rel="replies" type="text/html" href="http://www.garyrobinson.net/2009/06/tom-swifties.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-67707401</id>
        <published>2009-06-06T07:53:52-04:00</published>
        <updated>2009-06-06T11:53:52Z</updated>
        <summary>One of my more unusual pastimes is making up Tom Swifties. Examples of my efforts in this area include: "She said I look like a common farm animal!" Tom said sheepishly. and "Those damned cannibals! They're seasoning us with lemon...</summary>
        <author>
            <name>Gary Robinson</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Current Affairs" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.garyrobinson.net/"><div xmlns="http://www.w3.org/1999/xhtml"><p>One of my more unusual pastimes is making up <a href="http://en.wikipedia.org/wiki/Tom_Swifties">Tom Swifties</a>. Examples of my efforts in this area include:</p>

<blockquote><em>"She said I look like a common farm animal!" Tom said sheepishly.</em>
</blockquote>
and

<blockquote><em>"Those damned cannibals! They're seasoning us with lemon juice!" Tom said sourly.</em></blockquote>

<p>The NY Times is having Tom Swifty <a href="http://schott.blogs.nytimes.com/2009/06/05/weekend-competition-tom-swifties/#comment-13201">contest</a> this weekend. Submissions include:</p>

<blockquote><em>"My men will never mutiny," said the Captain blithely."</em></blockquote>

<p>In the esthetic of the Tom Swifty, I believe that significant demerits apply to those where the description of the act of speaking doesn't really match the tone of what is said, such as this Times submission:</p>

<blockquote><em>"She's got my photo in her locket," said Tom independently.</em></blockquote>

<p>and this one:</p>

<blockquote><em>"What's under this green jello," Tom asked sublimely.</em></blockquote>

<p><br />
Here are two particularly fine submissions, from Chris Doyle:</p>

<blockquote><em>"I'll just have to kill the king," Reggie sighed.</em></blockquote>

<blockquote><em>"May I have this dance?" Fred asked gingerly.”</em></blockquote><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/GaryRobinsonsRants/~4/RQ8WS4HvM1o" height="1" width="1" /></div></content>


    <feedburner:origLink>http://www.garyrobinson.net/2009/06/tom-swifties.html</feedburner:origLink></entry>
 
</feed><!-- ph=1 -->
