<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3878550364089796940</id><updated>2011-12-01T16:29:20.749+05:30</updated><category term='horrible'/><category term='freewrl'/><category term='personal'/><category term='swig'/><category term='cleartrip'/><category term='flight'/><category term='sage'/><category term='ticket'/><category term='conference'/><category term='scipy.in'/><category term='service'/><category term='D'/><category term='ets'/><category term='vtk'/><category term='fossee'/><category term='travel'/><category term='numpy'/><category term='jobs'/><category term='cython'/><category term='python'/><category term='scipy'/><category term='enthought'/><category term='mayavi'/><category term='performance'/><category term='c++'/><category term='India'/><category term='notebook'/><category term='rant'/><category term='screencast'/><title type='text'>Prabhu Ramachandran</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-8498772506063186412</id><published>2011-12-01T15:28:00.000+05:30</published><updated>2011-12-01T15:28:23.669+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='India'/><category scheme='http://www.blogger.com/atom/ns#' term='scipy.in'/><category scheme='http://www.blogger.com/atom/ns#' term='scipy'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>SciPy.in 2011 coming soon to IIT Bombay</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;If you aren't aware of it yet, &lt;a href="http://scipy.in/"&gt;SciPy.in 2011&lt;/a&gt; is just round the corner.&lt;br /&gt;This year it is going to be held at IIT Bombay's new Victor Menezes&lt;br /&gt;Convention Center (VMCC). &amp;nbsp;We have &lt;a href="http://scipy.in/scipyin/2011/talks-cfp/conference/"&gt;conference talks on 4th and 5th&lt;/a&gt; and&lt;br /&gt;&lt;a href="http://scipy.in/scipyin/2011/talks-cfp/tutorial/"&gt;tutorials on 6th and 7th&lt;/a&gt;. &amp;nbsp;We have invited &lt;a href="http://scipy.in/scipyin/2011/talks-cfp/speakers/"&gt;several key people&lt;/a&gt; from&lt;br /&gt;the "scientific computing with Python" community. &amp;nbsp;We have an awesome set&lt;br /&gt;of &lt;a href="http://scipy.in/scipyin/2011/talks-cfp/conference/"&gt;talks&lt;/a&gt; and &lt;a href="http://scipy.in/scipyin/2011/talks-cfp/tutorial/"&gt;tutorials&lt;/a&gt;. &amp;nbsp;Eric Jones from &lt;a href="http://www.enthought.com/"&gt;Enthought&lt;/a&gt; is our keynote&lt;br /&gt;speaker.&lt;br /&gt;&lt;br /&gt;In 2009 and 2010 we did workshops on basic scientific computing with&lt;br /&gt;Python. &amp;nbsp;This year our tutorial track features &lt;a href="http://scipy.in/scipyin/2011/talks-cfp/tutorial/"&gt;several advanced topics&lt;/a&gt;&lt;br /&gt;including, image processing, machine learning, symbolic computing,&lt;br /&gt;mapping and geoprocessing, Traits/TraitsUI, Mayavi, Sage and Cython.&lt;br /&gt;&lt;br /&gt;If you wish to attend the conference, &amp;nbsp;feel free to drop in and attend,&lt;br /&gt;free of cost -- but you'll miss out on the awesome food, t-shirt and&lt;br /&gt;other goodies if you do not register. &amp;nbsp;It would be best if you did&lt;br /&gt;&lt;a href="http://scipy.in/scipyin/2011/submit-registration/"&gt;register&lt;/a&gt; though.&lt;br /&gt;&lt;br /&gt;The main organizers of SciPy.in 2011 are &lt;a href="http://fossee.in/"&gt;FOSSEE&lt;/a&gt;. &amp;nbsp;&lt;a href="http://www.enthought.com/"&gt;Enthought&lt;/a&gt; (India) is&lt;br /&gt;also helping organize the conference. &amp;nbsp;&lt;a href="http://www.education.nic.in/"&gt;MHRD&lt;/a&gt; and Enthought are our&lt;br /&gt;financial sponsors and we are grateful to them for their continued&lt;br /&gt;support.&lt;br /&gt;&lt;br /&gt;Given the nature of the talks, the tutorials, the location, you are&lt;br /&gt;going to miss out if you choose to not attend. &amp;nbsp;&lt;a href="http://scipy.in/scipyin/2011/submit-registration/"&gt;Register before 2nd &lt;/a&gt;to&lt;br /&gt;avail of reduced rates. &amp;nbsp;Spot registration is certainly available but is more&lt;br /&gt;expensive.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-8498772506063186412?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/8498772506063186412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=8498772506063186412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/8498772506063186412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/8498772506063186412'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2011/12/scipyin-2011-coming-soon-to-iit-bombay.html' title='SciPy.in 2011 coming soon to IIT Bombay'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-1806244794837609104</id><published>2011-11-27T19:54:00.000+05:30</published><updated>2011-11-27T20:08:00.213+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='enthought'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='jobs'/><title type='text'>Enthought ... now in India</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;a href="http://www.enthought.com/"&gt;Enthought&lt;/a&gt;, as most of you (following my blog anyway) know,&lt;/div&gt;&lt;div&gt;is a leading scientific computing solutions provider and an extra-ordinary &lt;/div&gt;&lt;div&gt;champion of scientific computing with Python.  Enthought is headquartered &lt;/div&gt;&lt;div&gt;at Austin, Texas and has offices in New York, Cambridge (UK) and Brussels.  &lt;/div&gt;&lt;div&gt;Enthought has started a new development office in Mumbai, India.  Starting July 2010,&lt;/div&gt;&lt;div&gt;I am taking two years of long leave (lien) from IITB to serve as the&lt;/div&gt;&lt;div&gt;Managing Director of Enthought India.  We have a nice office located at the Supreme &lt;/div&gt;&lt;div&gt;business park in Hiranandani, Powai.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.enthought.com/img/officeIndia-Office.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://www.enthought.com/img/officeIndia-Office.jpg" border="0" alt="" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: 50px; text-align: left; cursor: pointer; width: 250px; height: 187px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We right now have three people (including yours truly) and are looking&lt;/div&gt;&lt;div&gt;for more people.  We aim to build a strong development team.  We are&lt;/div&gt;&lt;div&gt;currently working on an exciting new product that we will release over&lt;/div&gt;&lt;div&gt;the course of next year.  Stay tuned!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    &lt;/div&gt;&lt;div&gt;If you are a strong Python developer with a penchant for challenging&lt;/div&gt;&lt;div&gt;problems and building scientific computing applications, do send us your&lt;/div&gt;&lt;div&gt;resume. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I can be reached on my usual email addresses and my Enthought email is &lt;/div&gt;&lt;div&gt;prabhu at enthought dot com.  Possibly the best place to send in resumes is: &lt;/div&gt;&lt;div&gt;india-jobs@enthought.com &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-1806244794837609104?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/1806244794837609104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=1806244794837609104' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/1806244794837609104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/1806244794837609104'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2011/11/enthought-now-in-india.html' title='Enthought ... now in India'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-7652513467704445462</id><published>2011-11-27T19:40:00.000+05:30</published><updated>2011-11-27T19:46:03.417+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='fossee'/><title type='text'>FOSSEE updates</title><content type='html'>&lt;div&gt;The FOSSEE project started in mid 2009 and has been doing fairly well.&lt;/div&gt;&lt;div&gt;We've conducted several Python and Scilab workshops all over India.  We&lt;/div&gt;&lt;div&gt;organized two SciPy.in conferences (2009 and 2010) and hosted Sage days&lt;/div&gt;&lt;div&gt;25.  This year we are organizing &lt;a href="http://scipy.in"&gt;SciPy.in 2011&lt;/a&gt; at IIT Bombay.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We've generated plenty of introductory material on elementary Python for&lt;/div&gt;&lt;div&gt;scientific computing, version control and using GNU/Linux tools.  Using&lt;/div&gt;&lt;div&gt;this material we are conducting a "Software development techniques for&lt;/div&gt;&lt;div&gt;engineers and scientists" course at IITB.  There are numerous other&lt;/div&gt;&lt;div&gt;initiatives including a textbook conversion project that we are working&lt;/div&gt;&lt;div&gt;on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Recently, and rather significantly, we've have embarked on an ambitious&lt;/div&gt;&lt;div&gt;effort to train about 650 teachers all over India over five weekends&lt;/div&gt;&lt;div&gt;this month on "Software development techniques for engineers and&lt;/div&gt;&lt;div&gt;scientists".  This is part of Prof. Phatak's IIT e-Outreach program&lt;/div&gt;&lt;div&gt;funded generously by the MHRD, India.  More details are available &lt;a href="http://ekalavya.it.iitb.ac.in/EOutreachEventContent.do?categorycode=5&amp;amp;&amp;amp;itemcode=500004"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The basic idea is that we conduct workshops at IIT Bombay and the&lt;/div&gt;&lt;div&gt;lectures are streamed online.  Students are able to interact with the&lt;/div&gt;&lt;div&gt;faculty via the internet.  We are very excited about this since this&lt;/div&gt;&lt;div&gt;allows us to reach out to a large number of people in one shot.  It is&lt;/div&gt;&lt;div&gt;also a tad scary since the numbers are so large.  So far it has worked fairly well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I did write a simple Django based application to take online exams and automatically &lt;/div&gt;&lt;div&gt;grade the submitted solutions and will probably talk about that in more detail &lt;/div&gt;&lt;div&gt;at a future point.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-7652513467704445462?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/7652513467704445462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=7652513467704445462' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/7652513467704445462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/7652513467704445462'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2011/11/fossee-updates.html' title='FOSSEE updates'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-3309089853808380234</id><published>2011-11-27T18:51:00.000+05:30</published><updated>2011-11-27T19:46:18.262+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>... and they lived happily ever after</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-ldQBtqTUT-w/TtI6dRwuD9I/AAAAAAAABXY/BCInoPdC-ZE/s1600/pr_kd_yosemite.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;/a&gt;&lt;div&gt;It has been two years since I blogged about anything significant.  A lot&lt;/div&gt;&lt;div&gt;has happened and I thought I might as well give everyone a news update.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In November 2009, &lt;a href="http://kadambarid.in/"&gt;Kadambari Devarajan (KD)&lt;/a&gt; and I were married.  I'm not&lt;/div&gt;&lt;div&gt;getting into the details here but in short, she stole my heart, I&lt;/div&gt;&lt;div&gt;proposed, we were married in November and we lived happily ever after.&lt;/div&gt;&lt;div&gt;:)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The marriage ceremony was smooth and memorable thanks in very little&lt;/div&gt;&lt;div&gt;part to the two of us.  My parents organized a wonderful, short and&lt;/div&gt;&lt;div&gt;thoughtful marriage ceremony and KD's parents a wonderful reception.  We&lt;/div&gt;&lt;div&gt;cannot thank our parents enough!   My cousins thoughtfully organized and&lt;/div&gt;&lt;div&gt;hosted a mehendi party which was very memorable.  The support of our&lt;/div&gt;&lt;div&gt;siblings at this time was touching.  Close friends and relatives&lt;/div&gt;&lt;div&gt;travelled from far and wide to attend the marriage and made it very&lt;/div&gt;&lt;div&gt;special for us.  Many friends and relatives offered us their advice,&lt;/div&gt;&lt;div&gt;support and help.  Many of you attended the wedding at short notice and&lt;/div&gt;&lt;div&gt;showered us with gifts and good wishes.  Our heartfelt thanks to one and&lt;/div&gt;&lt;div&gt;all!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-ldQBtqTUT-w/TtI6dRwuD9I/AAAAAAAABXY/BCInoPdC-ZE/s320/pr_kd_yosemite.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5679666354725982162" style="text-align: left;color: rgb(0, 0, 238); text-decoration: underline; display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: 50px; cursor: pointer; width: 239px; height: 320px; " /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ever since, KD and I have been extremely happy together.  Life has&lt;/div&gt;&lt;div&gt;changed in many ways.  We've travelled the world (the picture above was &lt;/div&gt;&lt;div&gt;at Yosemite, courtesy Jarrod Millman), done many things together and &lt;/div&gt;&lt;div&gt;are having a wonderful time.  Thanks again to all of you who got &lt;/div&gt;&lt;div&gt;us together. :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-3309089853808380234?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/3309089853808380234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=3309089853808380234' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/3309089853808380234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/3309089853808380234'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2011/11/and-they-lived-happily-ever-after.html' title='... and they lived happily ever after'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-ldQBtqTUT-w/TtI6dRwuD9I/AAAAAAAABXY/BCInoPdC-ZE/s72-c/pr_kd_yosemite.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-3339165305475709761</id><published>2011-08-28T15:54:00.000+05:30</published><updated>2011-08-28T17:37:40.927+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='service'/><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='ticket'/><category scheme='http://www.blogger.com/atom/ns#' term='flight'/><category scheme='http://www.blogger.com/atom/ns#' term='horrible'/><category scheme='http://www.blogger.com/atom/ns#' term='cleartrip'/><title type='text'>Horrible service from Cleartrip</title><content type='html'>It has been ages since I blogged but I'm sufficiently pissed by some of the worst service I have ever received that I feel compelled to complain somewhere.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've been using &lt;a href="http://www.cleartrip.com"&gt;Cleartrip&lt;/a&gt; for booking tickets online for more than 4 years IIRC and have done enough business with them that they once sent me a vase of flowers.  I like their website and the online experience has been very good. I've personally recommended them to friends.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I had to make a visit to Austin this summer to visit the Enthought US office.  The ordeal begins there.  I made a booking from Mumbai to Houston and back for 23rd July but since the booking was last-minute, the online booking didn't make it and I was called by their phone department. After a round of discussion back and forth (I was booking tickets for for both me and my wife, KD) over a day or so we finally got a good deal.  I was told the ticket is confirmed but the next day I was called by cleartrip to say that my ticket was cancelled by the airline!  KD's ticket was fine! So, I had to book in the next available ticket category which entailed a roughly 60% increase in fare for myself.  I figured that was the least hassle given all of the logistic constraints and went ahead.  As usual, they wanted the full cash before issuing the confirmed ticket so I did a bank transfer to them to pay.  I had to do this twice given that the fares were changed. This whole process took a good part of two days -- phone calls, discussion, online transfer, confirmation cancellation, rebooking etc.  Anyway at this point I had received the a new ticket, but only the original invoice for the charges.  I never received an invoice for the updated booking.  I needed to provide an invoice for my flight to claim any reimbursements.  I called their office twice to ask for the invoice.  I was promised twice but nothing ever came.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once this was done, we found that KD couldn't get a visa for reasons I won't explain here. Now we had to cancel her ticket alone, which I again did.  Turns out that cleartrip's phone service is not connected to their online service, so all that you do on the phone transaction never shows up on their website.  This is a &lt;b&gt;huge pain&lt;/b&gt; for you have to go through the IVR and phone service for nearly anything.  They don't even seem to have an email based service.  Anyway, I asked again for the invoice and was upset that they didn't send it and expressed the same. I was assured again but it was an empty assurance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As it is, I was upset that the confirmed ticket was cancelled and that I had to pay a lot more.  I had called thrice for an invoice and nothing was sent.  I left for Houston on the 23rd and KD called them again (about 10-20 times when she was roaming) during the next week asking about the invoice and the cancellation.  Nothing.  The staff were polite but nothing got done and we had no news.  They apparently needed my account number even though I had done a bank transfer but never bothered to ask me about it before I left.  KD didn't have it handy and they said they'd do the transfer.  They got an earful from KD too but it was all useless.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was livid about not being sent the invoice after this long and finally called them from the US on my mobile.  I was really upset and was being assured again and was being given some random lame excuses about this.  I escalated the matter to the supervisor who also got an earful and promised to follow up.  He called me back the next day (and left a message) and in a day or so I finally received my invoice!  Phew.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The agony doesn't end here.  I still had no sight of my cancelled ticket refund and had no way of knowing how much I was owed, I had no proper bill, and no information on what was being done.  I was promised in the cancellation confirmation email that I'd receive the exact refund amount but didn't get that either.  Nothing.  No news and they had a lot of my money and a return flight to the US isn't cheap!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They did call KD in the meanwhile and she told them to process the payment.  After I returned I was called on 25th August.  I was eating lunch and they asked me for my account number again.  I asked to be called back in an hour since I didn't have it handy.  I never heard from them until I called them on 28th and spoke to two supervisors and really gave it to them.  They finally got my account number and I hope they make the transfer.  Apart from apologies on the phone, they haven't done anything to make amends.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In all, every step of the way was badly handled.  Cleartrip has a nice website but their phone department is a complete mess.  They've lost a customer. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-3339165305475709761?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/3339165305475709761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=3339165305475709761' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/3339165305475709761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/3339165305475709761'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2011/08/horrible-service-from-cleartrip.html' title='Horrible service from Cleartrip'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-1743829494027208855</id><published>2009-10-02T02:32:00.000+05:30</published><updated>2009-10-02T02:40:04.831+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='scipy'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>SciPy India conference in Dec. 2009</title><content type='html'>I'm excited to announce that the first "Scientific Computing with Python" conference in India (&lt;a href="http://scipy.in/"&gt;http://scipy.in&lt;/a&gt;) will be held from December 12th to 17th, 2009 at the &lt;a href="http://www.technopark.org/"&gt;Technopark in Trivandrum&lt;/a&gt;, Kerala, India.&lt;br /&gt;&lt;br /&gt;The theme of the conference will be "Scientific Python in Action" with respect to application and teaching.  We are pleased to have Travis Oliphant, the creator and lead developer of &lt;a href="http://numpy.scipy.org/"&gt;numpy&lt;/a&gt; as the keynote speaker.&lt;br /&gt;&lt;br /&gt;Here is a rough schedule of the conference:&lt;br /&gt;&lt;br /&gt;    Sat.    Dec. 12  (conference)&lt;br /&gt;    Sun.    Dec. 13  (conference)&lt;br /&gt;    Mon.    Dec. 14  (tutorials)&lt;br /&gt;    Tues.   Dec. 15  (tutorials)&lt;br /&gt;    Wed.    Dec. 16  (sprint)&lt;br /&gt;    Thu.    Dec. 17  (sprint)&lt;br /&gt;&lt;br /&gt;The tutorial sessions will have two tracks, one specifically for teachers and one for the general public.&lt;br /&gt;&lt;br /&gt;There are no registration fees.&lt;br /&gt;&lt;br /&gt;Please register at:&lt;br /&gt;&lt;br /&gt;        &lt;a class="moz-txt-link-freetext" href="http://scipy.in/"&gt;http://scipy.in&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The call for papers will be announced soon.&lt;br /&gt;&lt;br /&gt;This conference is organized by the &lt;a href="http://fossee.in/"&gt;FOSSEE project&lt;/a&gt; funded by the Ministry of Human Resources and Development's National Mission on Education (NME) through Information and Communication Technology (ICT) jointly with &lt;a href="http://www.space-kerala.org/"&gt;SPACE-Kerala&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-1743829494027208855?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/1743829494027208855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=1743829494027208855' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/1743829494027208855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/1743829494027208855'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2009/10/scipy-india-conference-in-dec-2009.html' title='SciPy India conference in Dec. 2009'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-6801106144073143578</id><published>2009-03-09T09:36:00.000+05:30</published><updated>2009-03-09T10:00:22.510+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='sage'/><category scheme='http://www.blogger.com/atom/ns#' term='mayavi'/><category scheme='http://www.blogger.com/atom/ns#' term='freewrl'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Sage notebook, Mayavi2 and 3D interaction on the web</title><content type='html'>Thanks to a cool open source x3d viewer along with its browser plugin -- &lt;a href="http://freewrl.sourceforge.net"&gt;freewrl&lt;/a&gt;, I can now use mayavi2 in a sage notebook and also get 3d interactivity!  To see this in action see &lt;a href="http://nb.hpfem.org/home/pub/16/#cell_14"&gt;here&lt;/a&gt;.  You should see something that looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_1RpgO2G8ep4/SbSYDBB_NHI/AAAAAAAAACA/zpBhYDiNNww/s1600-h/m2_sage_freewrl.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 319px; height: 320px;" src="http://2.bp.blogspot.com/_1RpgO2G8ep4/SbSYDBB_NHI/AAAAAAAAACA/zpBhYDiNNww/s320/m2_sage_freewrl.png" alt="" id="BLOGGER_PHOTO_ID_5311037038160458866" border="0" /&gt;&lt;/a&gt;The view on the bottom supports full 3d interactivity, which is really quite cool.  This works seamlessly with the debian package on the freewrl site.  I just installed the packge on my Ubuntu 8.04 machine and it works really nicely.  The only trouble is that for more complex visualizations, the x3d file exported can be quite large but this can be partially alleviated by perhaps using mod_deflate and similar options on the server.&lt;br /&gt;&lt;br /&gt;Now the x3d embedding above is a hack currently since I manually embedded the necessary HTML tag into the sage worksheet but as can be gleaned from this &lt;a href="http://groups.google.com/group/sage-devel/browse_thread/thread/fd54f64ba789f028"&gt;thread&lt;/a&gt;, this should be trivial to add to Sage proper.  This opens up an exciting new possibility for mayavi2 on the web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-6801106144073143578?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/6801106144073143578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=6801106144073143578' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/6801106144073143578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/6801106144073143578'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2009/03/sage-notebook-mayavi2-and-3d.html' title='Sage notebook, Mayavi2 and 3D interaction on the web'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_1RpgO2G8ep4/SbSYDBB_NHI/AAAAAAAAACA/zpBhYDiNNww/s72-c/m2_sage_freewrl.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-7883099114290186725</id><published>2009-03-07T18:19:00.000+05:30</published><updated>2009-03-07T18:50:11.058+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='sage'/><category scheme='http://www.blogger.com/atom/ns#' term='notebook'/><category scheme='http://www.blogger.com/atom/ns#' term='mayavi'/><title type='text'>Mayavi2 in a Sage notebook on the web!</title><content type='html'>I've been pretty hopeless at blogging (or even responding to comments on my blog) but this was too good to not blog about.  &lt;a href="http://ondrejcertik.blogspot.com/"&gt;Ondrej Certik&lt;/a&gt; has setup a &lt;a href="http://www.sagemath.org"&gt;Sage&lt;/a&gt; notebook on the web with support for &lt;a href="http://code.enthought.com/projects/mayavi"&gt;Mayavi2&lt;/a&gt;.  This lets you generate pictures using mayavi2 offline, from anywhere on the web and see them as static images.  No interactivity yet but that is technically possible and may happen sometime.&lt;br /&gt;&lt;br /&gt;Ondrej &lt;a href="http://ondrejcertik.blogspot.com/2009/03/siam-2009-conference-in-miami-part-i.html"&gt;blogged&lt;/a&gt; about this very briefly and mentioned his struggle on getting mayavi2 working in sage.  Here is a link to his first attempt demonstrating a mayavi plot on the hpfem notebook:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://nb.hpfem.org/home/pub/12/"&gt;http://nb.hpfem.org/home/pub/12/&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I made a little worksheet with a few of the standard mayavi test cases here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://nb.hpfem.org/home/pub/16/"&gt;http://nb.hpfem.org/home/pub/16/&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If your browser shows you a text rendering of the above, download the Force HTML bookmarklet from &lt;a href="http://www.howtocreate.co.uk/bookmarklets.html"&gt;here&lt;/a&gt; and click on that, you should see the page nicely.&lt;br /&gt;&lt;br /&gt;Quite a bit of work went into this before we got this far. I spent several hours figuring out how to get VTK built reliably so it can work for this. There was a minor bug in mlab that was fixed by Gael and me. Ondrej then figured out (after much pain) how to get mayavi2 and sage working nicely together. Jaap Spies' very cool mayavi2 packages for sage were also a big help I believe.  Ondrej then ran into trouble with memory issues with the virtual machine he hosts this on.  Once that was resolved this became possible.&lt;br /&gt;&lt;br /&gt;Needless to say, this opens up some very interesting possibilities and is very cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-7883099114290186725?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/7883099114290186725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=7883099114290186725' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/7883099114290186725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/7883099114290186725'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2009/03/mayavi2-in-sage-notebook-on-web.html' title='Mayavi2 in a Sage notebook on the web!'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-5402990204858709620</id><published>2008-09-21T14:52:00.000+05:30</published><updated>2008-09-21T15:27:22.652+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='numpy'/><category scheme='http://www.blogger.com/atom/ns#' term='cython'/><title type='text'>Python list (in Cython) vs. NumPy</title><content type='html'>Taking my previous benchmark a little further I decided to see how well iterating over a Python list of doubles compares with using NumPy arrays.  Here is an extremely simple example that implements the sum function in Cython and compares the result with NumPy's sum method.&lt;br /&gt;&lt;br /&gt;Here is the Cython code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# --- csum.pyx ---&lt;br /&gt;def csum(list array):&lt;br /&gt;  cdef int i, N=len(array)&lt;br /&gt;  cdef double x, s=0.0&lt;br /&gt;  for i in range(N):&lt;br /&gt;      x = array[i]&lt;br /&gt;      s += x&lt;br /&gt;  return s&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here is a setup.py to build it:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# --- setup.py ---&lt;br /&gt;from distutils.core import setup&lt;br /&gt;from distutils.extension import Extension&lt;br /&gt;from Cython.Distutils import build_ext&lt;br /&gt;setup(cmdclass={'build_ext': build_ext},&lt;br /&gt;    ext_modules = [Extension("csum", ["csum.pyx"])])&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To time it in &lt;a href="http://ipython.scipy.org/"&gt;IPython&lt;/a&gt; I created a simple file called test.ipy like so:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# --- test.ipy ---&lt;br /&gt;import csum&lt;br /&gt;import numpy&lt;br /&gt;for i in [10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 250000000]:&lt;br /&gt;  print '-'*80&lt;br /&gt;  print 'N =', i&lt;br /&gt;  a = numpy.linspace(0, 1, i)&lt;br /&gt;  b = a.tolist()&lt;br /&gt;  print "Cython:",&lt;br /&gt;  %timeit csum.csum(b)&lt;br /&gt;  print "NumPy:",&lt;br /&gt;  %timeit a.sum()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I run it using IPython and here are the results (formatted a little):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;N         Cython       NumPy&lt;br /&gt;10          534 ns       10.1 micros&lt;br /&gt;100         1.76 micros  10.8 micros&lt;br /&gt;1000        15.3 micros  19.3&lt;br /&gt;10000       150 micros   101 micros&lt;br /&gt;100000      1.75 ms      933 micros&lt;br /&gt;1000000     19.7 ms       9.24 ms&lt;br /&gt;10000000    198 ms        92.1 ms&lt;br /&gt;25000000    499 ms       231 ms&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This was done on a P4 3 Ghz machine and clearly lists do quite well.  At small sizes they outperform NumPy and at really large sizes they are about twice as slow.  This is very good considering how general lists are.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-5402990204858709620?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/5402990204858709620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=5402990204858709620' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/5402990204858709620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/5402990204858709620'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2008/09/python-list-in-cython-vs-numpy.html' title='Python list (in Cython) vs. NumPy'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-6114519815954006031</id><published>2008-09-20T23:01:00.000+05:30</published><updated>2008-09-20T23:59:24.916+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='D'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='swig'/><category scheme='http://www.blogger.com/atom/ns#' term='cython'/><title type='text'>Python vs. Cython vs. D (PyD) vs. C++ (SWIG)</title><content type='html'>In April 2008 there was a &lt;a href="http://thread.gmane.org/gmane.comp.python.scientific.devel/7883/focus=7923"&gt;thread&lt;/a&gt; on the scipy-dev list regarding the inclusion of Cython code in SciPy.  In that thread, I mentioned a particular use case of interest to me -- creating and manipulating an array of objects (rather than arrays of elementary data types) and being able to do that with Cython easily and efficiently.  &lt;br /&gt;&lt;br /&gt;The problem I was considering is a simple one.  I create a list of "Vortex" objects and compute (naively) the velocity of a collection of these particles on one another.  This is an O(N^2) computation since every particle influences every other.  The idea was to create simple OO code to be able to perform these computations. Here is an outline of the Python code for doing this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Vortex(object):&lt;br /&gt; def __init__(self, pos=0.0, strength=1.0):&lt;br /&gt;    # ...&lt;br /&gt; def eval_velocity(self, pos):&lt;br /&gt;    return -1j*self.strength/(2*pi*(pos - self.position))&lt;br /&gt;&lt;br /&gt;class VortexManager(object):&lt;br /&gt; def __init__(self, vortices=None):&lt;br /&gt;    # vortices is a list of vortex objects.&lt;br /&gt;    self.vortices = vortices&lt;br /&gt;&lt;br /&gt; def set(self, pos, str):&lt;br /&gt;    # ...&lt;br /&gt;&lt;br /&gt; def velocity(self):&lt;br /&gt;    for va in self.vortices:&lt;br /&gt;        vel = complex(0, 0)&lt;br /&gt;        for vb in self.vortices:&lt;br /&gt;            if va is vb:&lt;br /&gt;                continue&lt;br /&gt;            else:&lt;br /&gt;                vel += vb.eval_velocity(va.position)&lt;br /&gt;        va.velocity = vel&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Very straightforward code.  Now, back in April I implemented this in pure Python, C++ and wrapped the C++ code to Python using &lt;a href="http://www.swig.org/"&gt;SWIG&lt;/a&gt;.  I also implemented it in &lt;a href="http://www.digitalmars.com/d/"&gt;D&lt;/a&gt; and wrapped that using &lt;a href="http://pyd.dsource.org/"&gt;PyD.&lt;/a&gt;  I found that D was about 1.7 times slower than C++.  C++ was about 300-400 times faster than the pure Python version.&lt;br /&gt;&lt;br /&gt;I attended Robert Bradshaw's  &lt;a href="http://conference.scipy.org/slides"&gt;Cython tutorial at SciPy08&lt;/a&gt; and really liked it.  About 10 days ago I finally found the time to create a Cython version and the winner is ...&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Cython!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I've put up all of the code &lt;a href="http://www.aero.iitb.ac.in/%7Eprabhu/software/code/python/cpython_d_cpp.tgz"&gt;here&lt;/a&gt;.  To use the code, untar the tarball and do the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ cd cpython_d_cpp&lt;br /&gt;$ python setup.py build_ext --inplace&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This requires SWIG, numpy and Cython to build.  If you have PyD installed it will build the PyD extension also.  To test the performance do this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ python test_perf.py&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This produces the following output for me on a P4 (3 Ghz):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;dee(4000): 1.87730193138&lt;br /&gt;(1411.53285812+1411.53285812j) (945.091286479+945.091286479j)&lt;br /&gt;swig(4000): 1.10782289505&lt;br /&gt;(1411.53285812+1411.53285812j) (945.091286479+945.091286479j)&lt;br /&gt;cython(4000): 1.15034103394&lt;br /&gt;(1411.53285812+1411.53285812j) (945.091286479+945.091286479j)&lt;br /&gt;Pure Python(200): 1.14771318436&lt;br /&gt;# N SWIG Cython Ratio&lt;br /&gt;1000 0.071 0.069 0.967&lt;br /&gt;2000 0.283 0.274 0.968&lt;br /&gt;3000 0.638 0.619 0.970&lt;br /&gt;4000 1.135 1.100 0.970&lt;br /&gt;5000 1.767 1.720 0.973&lt;br /&gt;6000 2.517 2.473 0.983&lt;br /&gt;7000 3.474 3.370 0.970&lt;br /&gt;8000 4.541 4.403 0.970&lt;br /&gt;9000 5.698 5.575 0.978&lt;br /&gt;10000 7.000 6.879 0.983&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The first few numbers just test one single case of 4000 particles.  D is slower than both C++ and Cython.  Python is dog slow (or donkey slow as I like to say it)!  For some reason I was getting segfaults when I tried to test the D wrapper for more than 3000 particles.  On my Macbook the Cython version is actually 30% faster than the C++ version and on a Sempron 2800 Cython is about 25% slower.  So different machines produce different numbers.  However, C++ and Cython are both in the same ballpark.&lt;br /&gt;&lt;br /&gt;What I loved about the Cython code is that I use a Python list to manage the Vortex objects.  This shows that we can use the normal Python containers to manage objects.  This is extremely convenient.  This isn't very surprising either since Python containers are also heavily optimized.  "cython -a" was a huge help when getting things done.  For more details on the Cython code look at the tarball.&lt;br /&gt;&lt;br /&gt;Clearly, if you are building code from scratch and need speed, Cython is an excellent option.  For this I really must congratulate the Cython and Pyrex developers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-6114519815954006031?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/6114519815954006031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=6114519815954006031' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/6114519815954006031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/6114519815954006031'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2008/09/python-vs-cython-vs-d-pyd-vs-c-swig.html' title='Python vs. Cython vs. D (PyD) vs. C++ (SWIG)'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-5228000828255291830</id><published>2008-09-20T02:14:00.000+05:30</published><updated>2008-09-20T02:55:02.309+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='mayavi'/><category scheme='http://www.blogger.com/atom/ns#' term='screencast'/><title type='text'>Mayavi Screencast now on blogger</title><content type='html'>Finally, I've managed to upload the screencast I posted last about on blogger.&lt;br /&gt;If you are on a Mac or on Windows and downloaded the file I put up earlier, you might need to install the theora component from &lt;a href="http://www.xiph.org/quicktime/download.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I have no idea how it will eventually show up with the processing that goes into it.  Depending on how this goes I'll put up new screencasts either here or perhaps at Showmedo. Anyways, here it is:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-765d5de9d1e2cf5a" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v21.nonxt1.googlevideo.com/videoplayback?id%3D765d5de9d1e2cf5a%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1329896413%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D3EBF1C35E8431986D4F6B770D63AE9E93B4C2B83.46667FC96D236E35C1ADFCB94DF4239ED9A14C73%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D765d5de9d1e2cf5a%26offsetms%3D5000%26itag%3Dw160%26sigh%3D6_m5SKKeyLgmZQpizKmBUL7nMzc&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v21.nonxt1.googlevideo.com/videoplayback?id%3D765d5de9d1e2cf5a%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1329896413%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D3EBF1C35E8431986D4F6B770D63AE9E93B4C2B83.46667FC96D236E35C1ADFCB94DF4239ED9A14C73%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D765d5de9d1e2cf5a%26offsetms%3D5000%26itag%3Dw160%26sigh%3D6_m5SKKeyLgmZQpizKmBUL7nMzc&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-5228000828255291830?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=765d5de9d1e2cf5a&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/5228000828255291830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=5228000828255291830' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/5228000828255291830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/5228000828255291830'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2008/09/mayavi-screencast-now-on-blogger.html' title='Mayavi Screencast now on blogger'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-2822344965062507190</id><published>2008-09-19T21:33:00.000+05:30</published><updated>2008-09-19T23:55:29.977+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='mayavi'/><category scheme='http://www.blogger.com/atom/ns#' term='screencast'/><title type='text'>Mayavi2-3.x screencast</title><content type='html'>Here is a screencast  (16 Mb Ogg Theora) of some of the new Mayavi2 features in the 3.x series.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.aero.iitb.ac.in/%7Eprabhu/tmp/videos/mayavi2-3-screencast.avi"&gt;http://www.aero.iitb.ac.in/~prabhu/tmp/videos/mayavi2-3-screencast.avi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Its an ogg theora video.  This is my first screencast so its going to be a little rough.   There is too much noise in the sound recording and I'll try and fix that next time.  BTW, I used the excellent &lt;a href="http://live.gnome.org/Istanbul"&gt;istanbul&lt;/a&gt; for the video recording.  I recorded the sound track separately and mixed the two with a gst script I got from &lt;a href="http://fedoraproject.org/wiki/ScreenCasting"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I was unable to upload this video on this blog because the IITB network at this time is unbelievably slow.  If you know of another place I should consider uploading the video or would like to host the video elsewhere please let me know.  Feel free to download it and host it elsewhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-2822344965062507190?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/2822344965062507190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=2822344965062507190' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/2822344965062507190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/2822344965062507190'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2008/09/mayavi2-3x-screencast.html' title='Mayavi2-3.x screencast'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-3695398840551092790</id><published>2008-09-18T22:13:00.000+05:30</published><updated>2008-09-18T23:36:38.312+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='ets'/><category scheme='http://www.blogger.com/atom/ns#' term='mayavi'/><title type='text'>Announcing the Mayavi2-3.x series</title><content type='html'>This is a long overdue announcement.  ETS-3.0.0 was released just before the SciPy conference in August 2008. Mayavi-3.0.0 was released as part of this.  There are a &lt;span style="font-weight: bold;"&gt;huge&lt;/span&gt; number of significant changes to Mayavi as compared to 2.x. Note that we are still calling this Mayavi2-3.x.y since the Mayavi2 represents a departure from the older Mayavi-1.x series and Mayavi2-3.x is simply the next version of Mayavi2. The full details of the changes from the 2.x series are documented in the &lt;a href="https://svn.enthought.com/enthought/browser/Mayavi/trunk/docs/CHANGES.txt"&gt;CHANGES.txt&lt;/a&gt; file in the mayavi documentation directory.  Here is a summary of the major changes to this series thus far.  The current release is 3.0.3.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Core Mayavi:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I've added all the modules and filters that were available in Mayavi1 into Mayavi2.  The only module I didn't port is the Locator module which didn't seem very useful. Mayavi2 now has more modules and filters than Mayavi1 had. Now there isn't an excuse to continue using Mayavi1.5.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Users can now right-click on the nodes on the tree view to create new sources, filters and modules.&lt;/li&gt;&lt;li&gt;The menu entries for the modules and filters (on the app and on right-click) are all context sensitive.  So if your data doesn't support a particular module you shouldn't be able to add it from the UI.&lt;/li&gt;&lt;li&gt;The file-&gt;open menu is far cleaner and exposes just one "Open" item that automatically lets you open any supported data.&lt;/li&gt;&lt;li&gt;Added a toolbar to the engine view that offer icons to make it easy to add new sources/filters and modules.  Special "Adder nodes" are added to the tree view when a scene/source is empty that makes it easy for new users to use the mayavi pipeline.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Added a -o/--offscreen option to the mayavi2 application so you can run mayavi offscreen if your VTK version supports it.  This in combination with the -x command line option makes for a powerful combination.&lt;/li&gt;&lt;li&gt;New and much easier extension mechanism for the mayavi library and app via a user_mayavi.py and site_mayavi.py.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Added a tvtk_doc module/script that lets you search through the TVTK classes (with and/or keyword support), this is similar to Mayavi1's vtk_doc script.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Added a GenericModule that makes it very easy to put together a bunch of components/filters to create a new module.&lt;/li&gt;&lt;li&gt;Added Optional, Collection filters that let you easily build filters out of combinations of existing components or filters.&lt;/li&gt;&lt;li&gt;Added a new SetActiveAttribute filter that lets you choose the active scalar/vector/tensor attribute, this lets you do neat things like plot iso-contours of one scalar on top of the iso-contour of another, see examples/mayavi/contour_contour.py for an example.&lt;/li&gt;&lt;li&gt;Gaël sphinxified the documentation to make it look much nicer and fully &lt;span&gt;searchable&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Better and more complete testing, these are unfortunately integration tests currently and will slowly be made into proper unit tests.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The mayavi2 application and plugins are now ported to use Envisage3 which is much cleaner and nicer to work with than Envisage2.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There is now a full-fledged preferences framework for Mayavi (to access the preferences use, from enthought.mayavi.preferences.api import preference_manager).&lt;/li&gt;&lt;li&gt;Some parts of the API and file organization has been cleaned up. This is mostly related to the location of some modules, the core scripting API hasn't really changed. &lt;/li&gt;&lt;li&gt;The project is now called Mayavi and not MayaVi as before.  This avoids unnecessary confusion on how to pronounce the name and avoids any comparison with either Maya or Vi.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ETS itself is reorganized into a much smaller set of packages unlike the 40 odd packages in the ETS-2.x series. This makes dependency handling, packaging and installing much easier.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mlab:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The enthought.mayavi.mlab.pipeline is complete and can be used to fully script mayavi.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The mlab API has changed to be more consistent with the naming style used in ETS, for example isosurface has become iso_surface, extractedges becomes  extract_edges etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Added a show() function and decorator to allow users to easily create standalone scripts.&lt;/li&gt;&lt;li&gt;mlab.pipeline.open lets you open any supported data.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The mlab API can now take either engine or figure keyword arguments. This allows to avoid the use of the global sate set in the mlab engine. Mlab also now exposes a set_engine function.&lt;/li&gt;&lt;li&gt;It is easy to change visualized data using the .mlab_source attribute on objects created from mlab.  This makes it very efficient and easy to create animations from mlab. See &lt;a href="http://code.enthought.com/projects/mayavi/docs/development/html/mayavi/mlab.html#animating-the-data"&gt;here&lt;/a&gt; for more details.&lt;/li&gt;&lt;li&gt;Mlab by default uses a MayaviScene that features a convenient Mayavi icon which brings up the engine view using which you can edit the pipeline from the UI (using the toolbar or right clicks).  This gives mlab the full power of mayavi.&lt;/li&gt;&lt;/ol&gt;Apart from these significant feature additions there have been the usual round of bug fixes and new bugs introduced.&lt;br /&gt;&lt;br /&gt;As you can see this is a very significant release that marks a very important phase for mayavi2. All the additions made at the sprint went into this release.&lt;br /&gt;&lt;br /&gt;Currently it is probably easiest to install mayavi via either enthought's &lt;a href="http://www.enthought.com/products/epd.php"&gt;EPD&lt;/a&gt; or &lt;a href="http://pythonxy.com/foreword.php"&gt;Python(x,y)&lt;/a&gt;. Gaël has made available Ubuntu packages that are available at a link he mentions &lt;a href="http://gael-varoquaux.info/blog/?p=22"&gt;here&lt;/a&gt;. Dave Peterson has been making all of ETS available from PyPI, however you'll have to get all the dependencies installed (numpy, VTK, wxPython or Qt4). The best place to look for installation instructions is here, &lt;a href="https://svn.enthought.com/enthought/wiki/Install"&gt;https://svn.enthought.com/enthought/wiki/Install&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-3695398840551092790?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/3695398840551092790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=3695398840551092790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/3695398840551092790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/3695398840551092790'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2008/09/announcing-mayavi2-3x-series.html' title='Announcing the Mayavi2-3.x series'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-985449253624945025</id><published>2008-07-11T10:47:00.000+05:30</published><updated>2008-07-11T12:02:40.408+05:30</updated><title type='text'>Mayavi sprint July 2008: a summary</title><content type='html'>The first Mayavi sprint was held between 2nd to 9th July at Enthought's offices in Austin Texas. It was a great success in my opinion.  A large amount of work was done.  Gaël Varoquaux and I were heading the sprint team.  Several Enthought employees participated as did many of the interns.  Jarrod Millman was also at the office at this time and it was great having him around as well.  Overall it was great fun and I personally had a wonderful time.&lt;br /&gt;&lt;br /&gt;Here is a picture of part of the sprint room at the Enthought office on day one (2nd July).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_1RpgO2G8ep4/SHbx3rKduII/AAAAAAAAAAs/MQL_ZDjYuxo/s1600-h/IMG_0605.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_1RpgO2G8ep4/SHbx3rKduII/AAAAAAAAAAs/MQL_ZDjYuxo/s320/IMG_0605.JPG" alt="" id="BLOGGER_PHOTO_ID_5221626756764383362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Part of the room on 8th.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_1RpgO2G8ep4/SHb2AfKcAmI/AAAAAAAAAA8/z3gr-i6DoEU/s1600-h/IMG_0615.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_1RpgO2G8ep4/SHb2AfKcAmI/AAAAAAAAAA8/z3gr-i6DoEU/s320/IMG_0615.JPG" alt="" id="BLOGGER_PHOTO_ID_5221631306208379490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We had identified various things to do and these are all put up on the &lt;a href="http://svn.enthought.com/enthought/wiki/MayaviSprint2008"&gt;Mayavi sprint wiki page&lt;/a&gt;. I'll summarize these in short below in no particular order (more details on the wiki page):&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Generating the menu items in Envisage involved a ton of boilerplate code.  In addition we wanted to be able to generate pure TraitsUI menus when a user right clicked on a node on the mayavi engine tree view.  This has been implemented so we have automatically generated envisage and traits UI menus for all the sources, filters and modules.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Mayavi now supports context sensitive menus.  Suppose for example you have loaded a file that contains unstructured grid data.  In this case the mayavi menus for say a GridPlane module will be greyed out since it is not possible to use that module for unstructured grid data.&lt;/li&gt;&lt;li&gt;The file-&gt;load data menu has been cleaned up.  There is only one "Open file" entry for all supported mayavi datasets.  This is also true for the command line option.  One may load any file using simply &lt;pre&gt;mayavi2 -d file.ext&lt;/pre&gt; where the file extension&lt;span style="font-family:monospace;"&gt; &lt;/span&gt;ext is any supported data file extension (vtk, wrl, 3ds, jpeg, png etc.)&lt;/li&gt;&lt;li&gt;Gaël led a group (Field C, Ilan S and Chris C) which built a data visualization wizard that makes it easy for a user to create a TVTK dataset given numpy arrays.  The dialog looks really cool and is not finished yet but getting there real fast.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_1RpgO2G8ep4/SHb3NVsM5aI/AAAAAAAAABE/wJyGmXmf9QE/s1600-h/import_wizard2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_1RpgO2G8ep4/SHb3NVsM5aI/AAAAAAAAABE/wJyGmXmf9QE/s320/import_wizard2.png" alt="" id="BLOGGER_PHOTO_ID_5221632626515568034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Judah, Vibha and Eric worked very hard on improving the UI of several of the dialogs. They made modifications so it is easier to customize views and made several of the views much nicer.&lt;/li&gt;&lt;li&gt;Robert Kern ported the text editor plugin and the logger plugin to Envisage3. The text editor plugin is now used in mayavi.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Evan P fixed a few bugs with the scrollbars on Traits UI's.&lt;/li&gt;&lt;li&gt;Chris G fixed many packaging issues.  He also removed the unnecessary multiple copies of the sphinx generated docs that were being checked in.&lt;/li&gt;&lt;li&gt;Jeff W and Patrick helped write scripts to generate the sphinx docs and have the &lt;a href="http://code.enthought.com/projects/mayavi/docs/development/html/"&gt;mayavi docs&lt;/a&gt; show up on the web. &lt;/li&gt;&lt;li&gt;Ilan S. helped find several bugs and helped both Gaël and me in various areas.&lt;/li&gt;&lt;li&gt;Dave Peterson started some work on automatic scripting of mayavi based on recording UI actions but there wasn't enough time for this to get done considering Dave's many other responsibilities.&lt;/li&gt;&lt;li&gt;Dave Peterson pushed for an ETS-2.8.0 release during the sprint.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Dave Morrill helped fix several traits bugs.&lt;/li&gt;&lt;/ul&gt;My apologies if I missed someone in the list of contributors above.  As you can see, a huge number of things got done.  It was great fun.  Enthought hospitality was, as always, outstanding.&lt;br /&gt;&lt;br /&gt;Gaël and I thank  all those who participated!  Our thanks to Enthought who funded it and helped make it a success.&lt;br /&gt;&lt;br /&gt;Given the success with our first sprint, we plan to hold a two day sprint at &lt;a href="http://conference.scipy.org/"&gt;SciPy 2008&lt;/a&gt;. Please do join us!&lt;br /&gt;&lt;br /&gt;Gaël and I are also teaching a &lt;a href="http://conference.scipy.org/tutorials"&gt;two hour tutorial&lt;/a&gt; this year at SciPy 2008.  Hurry, 11th is the last day for early &lt;a href="http://conference.scipy.org/to_register"&gt;registration&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-985449253624945025?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/985449253624945025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=985449253624945025' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/985449253624945025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/985449253624945025'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2008/07/mayavi-sprint-july-2008-summary.html' title='Mayavi sprint July 2008: a summary'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_1RpgO2G8ep4/SHbx3rKduII/AAAAAAAAAAs/MQL_ZDjYuxo/s72-c/IMG_0605.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-7546091570667104159</id><published>2008-03-30T18:30:00.000+05:30</published><updated>2008-03-30T19:05:30.280+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='mayavi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='numpy'/><title type='text'>Uniform deviates on the surface of a sphere</title><content type='html'>Here is a simple example of how to generate points randomly on the surface of the sphere that are uniformly distributed.  The reason I'm posting it here is that it shows how convenient mayavi's mlab is for this sort of thing.&lt;br /&gt;&lt;br /&gt;Anyone who has studied pseudo random numbers should know that the following will not generate points uniformly on the sphere.  Here is a demonstration of the fact:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ ipython -wthread&lt;br /&gt;In [1]: from numpy import *&lt;br /&gt;In [2]: from enthought.mayavi import mlab&lt;br /&gt;In [3]: p = random.random(10000)*2*pi&lt;br /&gt;In [4]: t = random.random(10000)*pi&lt;br /&gt;In [5]: x, y, z = sin(t)*cos(p), sin(t)*sin(p), cos(t)&lt;br /&gt;In [6]: g = mlab.points3d(x, y, z, z,  mode='point')&lt;br /&gt;In [7]: g.actor.property.point_size = 2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The point size is made larger so you can see the points more clearly. Here is the picture it produces:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_1RpgO2G8ep4/R--UGj2AxcI/AAAAAAAAAAU/wMqLmmIxhcA/s1600-h/non_uniform.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_1RpgO2G8ep4/R--UGj2AxcI/AAAAAAAAAAU/wMqLmmIxhcA/s320/non_uniform.png" alt="" id="BLOGGER_PHOTO_ID_5183524536548640194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Notice the clustering at the poles.  OTOH, the following works nicely,&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;In [3]: p = random.random(10000)*2*pi&lt;br /&gt;In [10]: mlab.clf()&lt;br /&gt;In [12]: t = arccos(random.random(10000)*2.0 - 1.0)&lt;br /&gt;In [13]: x, y, z = sin(t)*cos(p), sin(t)*sin(p), cos(t)&lt;br /&gt;In [14]: g1 = mlab.points3d(x, y, z, z,  mode='point')&lt;br /&gt;In [15]: g1.actor.property.point_size = 2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is the picture this one produces:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_1RpgO2G8ep4/R--WJT2AxdI/AAAAAAAAAAc/Ih2X4BBRQsM/s1600-h/uniform.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_1RpgO2G8ep4/R--WJT2AxdI/AAAAAAAAAAc/Ih2X4BBRQsM/s320/uniform.png" alt="" id="BLOGGER_PHOTO_ID_5183526782816536018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As you can see the transformation has worked and generates what appears to be a uniform distribution on the surface of a sphere.  Visual testing isn't good enough uniformness but that isn't the point here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-7546091570667104159?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/7546091570667104159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=7546091570667104159' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/7546091570667104159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/7546091570667104159'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2008/03/uniform-deviates-on-surface-of-sphere.html' title='Uniform deviates on the surface of a sphere'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_1RpgO2G8ep4/R--UGj2AxcI/AAAAAAAAAAU/wMqLmmIxhcA/s72-c/non_uniform.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-345823605557630392</id><published>2008-03-30T17:50:00.000+05:30</published><updated>2008-03-30T18:26:21.976+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Using virtualenv under Linux</title><content type='html'>Mayavi and TVTK are part of ETS (Enthought Tool Suite).  The stable version of ETS is 2.7.1.  ETS-2.7.1 ships with Traits2 and Envisage2.  However, the latest traits version is 3 and Envisage3 is the current development Envisage version.  These are part of ETS-3.0.  Thus far mayavi was being developed in the branches.  Earlier, in order to test mayavi with both ETS-2.7.1 and ETS-3.0, I used to manage a bunch of directories with symbolic links to switch between the ETS versions.  It has been a while since I did that and yesterday I wanted to try out &lt;a href="http://pypi.python.org/pypi/virtualenv"&gt;virtualenv&lt;/a&gt; to see if it would solve my problem easily.  I'm using a Gutsy i386 system.  In short, virtualenv worked like a charm.  This is what I did.&lt;br /&gt;&lt;br /&gt;I first needed to clean up my older setup.  In the past I used a .pydistutils.cfg file that was in my home directory to tell easy_install to use my custom directories (which were in my PYTHONPATH).  I removed this.  Then I downloaded the virtualenv tarball from pypi and did the usual python setup.py install dance.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ cd virtualenv-1.0&lt;br /&gt;$ sudo python setup.py install --prefix=/usr/local&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then I did the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ mkdir -p ~/usr/virtualenv&lt;br /&gt;$ cd ~/usr/virtualenv&lt;br /&gt;$ virtualenv ets_stabe # for ETS-2.7.1&lt;br /&gt;$ ln -s ets_stable/bin/activate .&lt;br /&gt;# edit .bash_profile and add "source ~/usr/virtualenv/activate" (or whatever for your particular shell) to it.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now, either login afresh or source ~/usr/virtualenv/activate to use the newly created virtual environment.&lt;br /&gt;&lt;br /&gt;Now you are all set.  I then installed ETSProjectTools and installed ets==2.7.1 and everything else I needed in the stable environment (using either python setup.py [option] or via easy_install).  You just need to make sure you use the corresponding virtual environments python and easy_install.&lt;br /&gt;&lt;br /&gt;To switch to the truk I created another virtualenv like so:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd ~/usr/virtualenv&lt;br /&gt;virtualenv ets_trunk&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then I installed the trunk related packages here.  To switch between virtual environments I have a small shell script that looks like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;# switch_ets.sh&lt;br /&gt;cd ~/usr/virtualenv&lt;br /&gt;rm activate&lt;br /&gt;ln -s $1/bin/activate .&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So to switch I simply run:&lt;br /&gt;&lt;pre&gt;$ switch_ets.sh ets_trunk&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and I'm all set to go when I start a new shell.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-345823605557630392?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/345823605557630392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=345823605557630392' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/345823605557630392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/345823605557630392'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2008/03/using-virtualenv-under-linux.html' title='Using virtualenv under Linux'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-9070826842118666976</id><published>2008-03-30T17:47:00.000+05:30</published><updated>2008-03-30T17:49:57.920+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='mayavi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Mayavi sprint in July 2008</title><content type='html'>This is to announce a Mayavi sprint between 2nd July to 9th July, 2008.&lt;br /&gt;The sprint will be held at the Enthought Office, Austin Texas.&lt;br /&gt;Here are the details:&lt;br /&gt;&lt;br /&gt; Dates:     2nd July 2008 to 9th July 2008&lt;br /&gt; Location:  Enthought Office at Austin, TX&lt;br /&gt;&lt;br /&gt;Please do join us.  Both Gaël  and myself will be at the sprint on all&lt;br /&gt;days and there will be developers from Enthought joining us as well.&lt;br /&gt;Enthought is graciously hosting the sprint.&lt;br /&gt;&lt;br /&gt;The agenda for the sprint is yet to be decided.&lt;br /&gt;&lt;br /&gt;This was announced earlier on the enthought-dev and mayavi-users lists.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-9070826842118666976?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/9070826842118666976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=9070826842118666976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/9070826842118666976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/9070826842118666976'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2008/03/mayavi-sprint-in-july-2008.html' title='Mayavi sprint in July 2008'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-9118260953300139134</id><published>2008-03-29T22:45:00.000+05:30</published><updated>2008-03-29T22:58:19.122+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='vtk'/><title type='text'>Debugging Python scripts</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Elementary debugging&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've noticed that many students who submit assignments in Python for a course I teach don't know how to use a debugger. Here are some simple notes on debugging Python scripts to get people started. Lets say you have the following trivial code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# -- junk.py ---&lt;br /&gt;print "hello"&lt;br /&gt;foo&lt;br /&gt;a = 1&lt;br /&gt;print a+1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Importing this from IPython produces this::&lt;br /&gt;&lt;pre&gt;In [1]: import junk&lt;br /&gt;hello&lt;br /&gt;---------------------------------------------------------------------------&lt;br /&gt;         Traceback (most recent call last)&lt;br /&gt;&lt;br /&gt;/tmp/ in ()&lt;br /&gt;&lt;br /&gt;/tmp/junk.py in ()&lt;br /&gt;  1 print "hello"&lt;br /&gt;----&gt; 2 foo&lt;br /&gt;  3 a = 1&lt;br /&gt;  4 print a+1&lt;br /&gt;  5&lt;br /&gt;&lt;br /&gt;exceptions.NameError: name 'foo' is not defined&lt;br /&gt;&lt;/pre&gt;If you have a non-trivial program you can debug this right away using IPython's %debug magic.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;In [2]: %debug&lt;br /&gt;&gt; /tmp/junk.py(2)()&lt;br /&gt;  1 print "hello"&lt;br /&gt;----&gt; 2 foo&lt;br /&gt;  3 a = 1&lt;br /&gt;&lt;br /&gt;ipdb&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This drops you into ipdb which is an enhanced, pdb. At this point you can print variables and step through your code, go up the stack of execution etc. For more details on ipdb read the &lt;a href="http://docs.python.org/lib/module-pdb.html"&gt;pdb documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you use the %pdb magic then IPython automatically drops you into the debugger whenever it sees an error. This is often very convenient.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Debugging a VTK-Python script&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is obviously a little more complicated (because VTK is implemented in C++ and you want to step through C++ code to figure out what is wrong) and there are a few ways of doing this. In the following I assume that you are doing this on a *nix/Linux/Mac machine. Suppose you run a Python script that segfaults and need to figure out where it crashed you can do the following (assuming you have gdb installed of course):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ gdb python&lt;br /&gt;(gdb) run your_script.py&lt;br /&gt;[gdb messages]&lt;br /&gt;Segmentation fault (or whatever)&lt;br /&gt;(gdb) backtrace&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The backtrace should typically give you more information about the crash.&lt;br /&gt;&lt;br /&gt;Several weeks ago I needed to debug a VTK related problem where a window was not being resized if the off screen rendering mode was set. Debugging this can again be achieved by running the script using Python started from gdb and then setting a breakpoint in gdb. However, I thought I'd illustrate a very handy gdb feature of debugging running applications. In my particular case, I had a simple Python script that was demonstrating a VTK bug. At the appropriate location wher, I added a simple raw_input('DBG:') to give me a point where execution would be paused. I then ran the script like so:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ python offscreen.py&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;On another shell I did the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ ps uax | grep python&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Using the PID of the process (30708) I did the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ gdb&lt;br /&gt;(gdb) attach 30708&lt;br /&gt;[tons of output]&lt;br /&gt;Loaded symbols for /usr/lib/libwx_gtk2u_gl-2.8.so.0&lt;br /&gt;Reading symbols from /usr/lib/libGLU.so.1...done.&lt;br /&gt;Loaded symbols for /usr/lib/libGLU.so.1&lt;br /&gt;0xffffe410 in __kernel_vsyscall ()&lt;br /&gt;(gdb)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;On the gdb prompt I specify a break point where I want to stop execution::&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(gdb) br vtkXOpenGLRenderWindow.cxx:1185&lt;br /&gt;Breakpoint 1 at 0xb52846a0: file /skratch/prabhu/vtk/cvs/VTK/Rendering/vtkXOpenGLRenderWindow.cxx, line 1185.&lt;br /&gt;(gdb) c&lt;br /&gt;Continuing.&lt;br /&gt;[Switching to Thread -1210595664 (LWP 30708)]&lt;br /&gt;&lt;br /&gt;Breakpoint 1, vtkXOpenGLRenderWindow::SetSize (this=0x99bfb78, width=800,&lt;br /&gt;height=800)&lt;br /&gt;at /skratch/prabhu/vtk/cvs/VTK/Rendering/vtkXOpenGLRenderWindow.cxx:1185&lt;br /&gt;1185      if ((this-&gt;Size[0] != width)||(this-&gt;Size[1] != height))&lt;br /&gt;Current language:  auto; currently c++&lt;br /&gt;(gdb)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;At this point I can step through the code and try and figure out what is going on. This is extremely convenient and handy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-9118260953300139134?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/9118260953300139134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=9118260953300139134' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/9118260953300139134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/9118260953300139134'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2008/03/debugging-python-scripts.html' title='Debugging Python scripts'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3878550364089796940.post-8227394939818907013</id><published>2008-01-25T22:20:00.000+05:30</published><updated>2008-02-05T14:26:23.529+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='ets'/><category scheme='http://www.blogger.com/atom/ns#' term='mayavi'/><title type='text'>Getting the current development snapshot of Mayavi</title><content type='html'>Hello world!&lt;br /&gt;&lt;br /&gt;Mayavi is part of the Enthought Tool Suite (ETS).  Enthought has reorganized its SVN repository in order to break up the various parts of ETS into smaller chunks with a very clear set of dependencies. This should make it easy for people to get parts of ETS rather than have to get it all as part of ETS (which is quite huge).  Ideally users will install released versions of ETS using prebuilt eggs or native packages (debs or rpms).  However, if one wants to get the bleeding edge from SVN things can get messy.  This is because mayavi depends on several other ETS packages and manually getting the right versions of each package from SVN can be a huge pain.  In order to make life easier in this regard Dave Peterson has created a package called ETSProjectTools that let a user/developer checkout a particular package from ETS along with all its dependencies as well. Let us pick mayavi as an example to demonstrate how this works.&lt;br /&gt;&lt;br /&gt;Say you want to get the latest, greatest version of mayavi. The current version that you should look to get would be the up and coming ets-2.7.0b1 release.  The release isn't out yet but will be soon.  Here is how you get it:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Get hold of ETSProjectTools like so:&lt;br /&gt;&lt;pre class="wiki"&gt;svn co https://svn.enthought.com/svn/enthought/ETSProjectTools/trunk ETSProjectTools&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Build and install it:&lt;br /&gt;&lt;pre class="wiki"&gt;cd ETSProjectTools&lt;br /&gt;python setup.py install&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;This will give you several new scripts that will let us checkout the sources etc.  etsco, etsup,  etsdevelop etc.  More information on these is here &lt;a href="http://svn.enthought.com/enthought/wiki/SVNScripts"&gt;https://svn.enthought.com/enthought/wiki/SVNScripts&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Now checkout ets==2.7.0b1 like so:&lt;br /&gt;&lt;pre class="wiki"&gt;etsco "ets==2.7.0b1"&lt;span style="font-family:Georgia,serif;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Georgia,serif;"&gt;Be patient, the above will checkout all of the ETS-2.7.0b1 (that is yet to be released).&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Georgia,serif;"&gt;Now get the egg_builder script (this should soon be part of ETSProjectTools but isn't yet) like so:&lt;/span&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;cd ets_2.7.0b1&lt;br /&gt;svn cat https://svn.enthought.com/svn/enthought/sandbox/egg_builder.py &gt; egg_builder.py&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Georgia,serif;"&gt;Build the eggs for ets-2.7.0b1 (the command will build the eggs and put them in a "dist" directory under the current directory):&lt;/span&gt;&lt;pre class="wiki"&gt;python egg_builder.py&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Now install mayavi:&lt;br /&gt;easy_install -f dist -H dist enthought.mayavi&lt;/li&gt;&lt;/ol&gt;This will install enthought.mayavi from the built eggs.  If you want to keep tracking enthought.mayavi as it develops in SVN you may want to instead do:&lt;br /&gt;&lt;br /&gt;   cd enthought.mayavi_2.0.3a1&lt;br /&gt;   python setup.py develop -f ../dist -H ../dist&lt;br /&gt;&lt;br /&gt;This will install all the dependencies for mayavi as eggs and make an egg-link for mayavi alone so you can keep track of it via SVN.&lt;br /&gt;&lt;br /&gt;If you want to keep track of every package you could always do:&lt;br /&gt;&lt;br /&gt;   cd ets_2.7.0b1&lt;br /&gt;   etsdevelop .&lt;br /&gt;&lt;br /&gt;This will do a setup.py develop in each and every subdirectory of ets_2.7.0b1.&lt;br /&gt;&lt;br /&gt;Note that the ets* scripts only get the sources of other ETS packages and not everything else!  Building ETS requires several other external packages like a compiler, swig, numpy, etc.  For a complete list check the pages here:&lt;br /&gt;&lt;a href="https://svn.enthought.com/enthought/wiki/Build"&gt;https://svn.enthought.com/enthought/wiki/Build&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The dependencies needed for Ubuntu Gutsy are listed in the ubuntu specific page for the last release (2.6.0b1).&lt;br /&gt;&lt;br /&gt;As you can see, all the complexity of getting the ETS sources is made easy via etsco and the other scripts.  In the future, as mayavi grows at its own pace, these tools will let us specify dependencies within ETS and thereby make it easier to cut new releases.  This also makes it relatively easy to develop different branches that have entirely different dependencies.&lt;br /&gt;&lt;br /&gt;Phew!  That was a massive first blogspot post!&lt;br /&gt;Enjoy,&lt;br /&gt;Prabhu&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3878550364089796940-8227394939818907013?l=prabhuramachandran.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prabhuramachandran.blogspot.com/feeds/8227394939818907013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3878550364089796940&amp;postID=8227394939818907013' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/8227394939818907013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3878550364089796940/posts/default/8227394939818907013'/><link rel='alternate' type='text/html' href='http://prabhuramachandran.blogspot.com/2008/01/getting-current-development-snapshot-of.html' title='Getting the current development snapshot of Mayavi'/><author><name>Prabhu Ramachandran</name><uri>http://www.blogger.com/profile/02222896794693014723</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/-gminzyeZaas/ThAFR-g3psI/AAAAAAAAAz8/Q8jjF8H7H3Y/s220/profile1.jpg'/></author><thr:total>1</thr:total></entry></feed>
