<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Planet SciPy</title>
	<link>http://planet.scipy.org/</link>
	<language>en</language>
	<description>Planet SciPy - http://planet.scipy.org/</description>

<item>
	<title>Enthought: Greg Wilson speaking at the Austin Python User Group meeting</title>
	<guid>http://blog.enthought.com/?p=31</guid>
	<link>http://blog.enthought.com/?p=31</link>
	<description>Wednesday, May 14th, Greg Wilson will be joining us in Austin for the monthly APUG meeting.  He&amp;#8217;ll be talking about Beautiful Code.  If you&amp;#8217;re in the area, swing by Enthought&amp;#8217;s Offices right downtown at the corner of 6th and Congress (the Epicenter for Weirdness, as we like to call it).
There&amp;#8217;s more information at the python.org [...]</description>
	<pubDate>Tue, 13 May 2008 03:30:02 +0000</pubDate>
</item>
<item>
	<title>Titus Brown: pygr gets some summer love</title>
	<guid>http://ivory.idyll.org/blog/2008/05/09/pygr-gets-some-summer-love</guid>
	<link>http://ivory.idyll.org/blog/may-08/pygr-gets-some-summer-love</link>
	<description>&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;(&lt;a class=&quot;reference&quot; href=&quot;http://bioinformatics.ucla.edu/pygr/&quot;&gt;pygr&lt;/a&gt; is a neat
bioinformatics framework in Python.)&lt;/p&gt;
&lt;p&gt;After some commenters on my last post seemed happy to hear that pygr
was the focus of some summer work, I realized I had only discussed the
pygr summer work in &lt;a class=&quot;reference&quot; href=&quot;http://lists.idyll.org/pipermail/biology-in-python/2008-April/000306.html&quot;&gt;a post to the biology-in-python list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Whoops.&lt;/p&gt;
&lt;p&gt;So, here's the scoop: not only is pygr the focus of &lt;a class=&quot;reference&quot; href=&quot;http://code.google.com/soc/2008/psf/appinfo.html?csaid=B6BADB61050FB8F0&quot;&gt;Rachel McCreary's
Google Summer of Code project&lt;/a&gt;,
but &lt;a class=&quot;reference&quot; href=&quot;http://code.google.com/soc/2008/psf/appinfo.html?csaid=16FD71A42C4B7B&quot;&gt;Jenny Qian will be using pygr to build an ENSEMBL interface&lt;/a&gt;,
also as part of the Google Summer of Code.&lt;/p&gt;
&lt;p&gt;That's not all!&lt;/p&gt;
&lt;p&gt;In addition to Rachel and Jenny (under the sterling mentorship of
Chris Lee, Robert Kirkpatrick, Namshin Kim, and myself) I have two MSU
students working with me over the summer, Alex Nolley and Marie
Buckner.  They'll both be working with pygr-related things, although
like Jenny their efforts may end up being more on ways to use pygr
than on pygr's code itself.&lt;/p&gt;
&lt;p&gt;I also have a grad student or two that may drop in on pygr, if only to
use it for something research-y.&lt;/p&gt;
&lt;p&gt;So all in all, pygr will get a lot of love this summer.  Hopefully we can
polish the code and documentation and tutorials to the point where the
learning curve is as minimal as it can get, and this fabulous package will
become readily available to many others...&lt;/p&gt;
&lt;p&gt;Why am I personally putting so much effort into pygr?  Well, I've been
using it more and more over the last few months, and (&lt;a class=&quot;reference&quot; href=&quot;http://www.vetta.org/2008/05/scipy-the-embarrassing-way-to-code/&quot;&gt;somewhat like
scipy&lt;/a&gt;)
it's transformed my work by turning annoyingly difficult data
organization problems into trivial Python transformations.  I can
literally throw together a custom genome browser in a matter of hours
-- I've implemented two or three already, for different projects --
and it has enabled several new research program.  pygr seems to be one
of those rare packages (kind of like Python itself) that is not only
functional and effective but presents a unified and coherent
intellectual interface.  pygr is the only good middleware layer I've
seen for sequence intertwingling in bioinformatics.  It's not that
mature yet, but it has serious promise, and I'm hoping to get in on
the ground floor, so to speak :).&lt;/p&gt;
&lt;p&gt;cheers,&lt;/p&gt;
&lt;p&gt;--titus&lt;/p&gt;
&lt;/div&gt;</description>
	<pubDate>Fri, 09 May 2008 18:03:10 +0000</pubDate>
</item>
<item>
	<title>OpenOpt (Dmitrey Kroshko): blas and lapack issues with CVXOPT installation</title>
	<guid>tag:blogger.com,1999:blog-6210259640013469958.post-4634041256913073108</guid>
	<link>http://openopt.blogspot.com/2008/05/blas-and-lapack-issues-with-cvxopt.html</link>
	<description>As I have made conclusion from my own experience with CVXOPT installation (from source, i.e. tarball), as well as from some user comments, CVXOPT sometimes cannot find lapack and blas, despite they are present.&lt;br /&gt;&lt;br /&gt;I noticed that it searches for llapack and lblas, and despite I have libblas.so.3 and liblapack.so.3 (installed in my KUBUNTU 8.04, to /usr/lib, via aptitude) it doesn't work. So I had copied libblas.so.3 and liblapack.so.3 into files libblas.so and liblapack.so (same directory /usr/lib) and now all works ok (mb creating soft links would be enough?).&lt;br /&gt;&lt;br /&gt;I hope CVXOPT developers will take it into account, mb this problem happens with some other OSes as well.&lt;br /&gt;&lt;br /&gt;P.S. If you intend to use OO-&gt;CVXOPT-&gt;glpk connection don't forget to set BUILD_GLPK=1 in CVXOPT setup.py file. glpk should be already installed.</description>
	<pubDate>Thu, 08 May 2008 05:47:38 +0000</pubDate>
	<author>noreply@blogger.com (Dmitrey)</author>
</item>
<item>
	<title>Titus Brown: Dear Lazyweb: JavaScript &quot;imagemaps&quot; and/or image subselection?</title>
	<guid>http://ivory.idyll.org/blog/2008/05/07/lazyweb-javascript-image-stuff</guid>
	<link>http://ivory.idyll.org/blog/may-08/lazyweb-javascript-image-stuff</link>
	<description>&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;Dear Lazyweb, help!&lt;/p&gt;
&lt;p&gt;I'm embarking on a number of summer projects in my &lt;a class=&quot;reference&quot; href=&quot;http://ged.cse.msu.edu/&quot;&gt;new lab at MSU&lt;/a&gt;, and several of them focus on using &lt;a class=&quot;reference&quot; href=&quot;http://code.google.com/p/pygr&quot;&gt;pygr&lt;/a&gt; to do cool genomic stuff.  In
particular, I'm planning to build a personal genome annotation system
that will let people run their own full genome Web sites and annotate
the genomes with private information such as Solexa data, cDNA/EST
projects, ChIP-seq, cis-regulatory reporter constructs, ncRNA
predictions, etc. etc.  (If you're interested in this sort of thing,
&lt;a class=&quot;reference&quot; href=&quot;mailto:ctb&amp;#64;msu.edu&quot;&gt;get in touch&lt;/a&gt; -- it will, of course, be open
source and open development, albeit in Python :)&lt;/p&gt;
&lt;p&gt;As I've been thinking more about how to do the display side of things,
I've been running headfirst into a serious lack of knowledge.  I would
like to make an interface that looks somewhat like your standard
genome browser/GMOD/UCSC interface, such as &lt;a class=&quot;reference&quot; href=&quot;http://genome.ucsc.edu/cgi-bin/hgTracks?hgsid=107080583&amp;amp;clade=vertebrate&amp;amp;org=Chicken&amp;amp;db=galGal3&amp;amp;position=chr8%3A28%2C563%2C111-28%2C563%2C687&amp;amp;pix=620&amp;amp;Submit=submit&amp;amp;hgsid=107080583&quot;&gt;this UCSC view of the
chicken genome&lt;/a&gt;.
I already have the basics of that view working; for example, see this
&lt;a class=&quot;reference&quot; href=&quot;http://iorich.caltech.edu/~t/transfer/pygr-draw/doc/simple-example.html&quot;&gt;simple example&lt;/a&gt;
and &lt;a class=&quot;reference&quot; href=&quot;http://iorich.caltech.edu/~t/transfer/pygr-draw/doc/group-example.html&quot;&gt;a group-feature example&lt;/a&gt;.
But I'd like to add more - a LOT more -- interactivity.&lt;/p&gt;
&lt;p&gt;Ideally I'd like to be able to draw simple objects (squares, rectangles,
lines) on some sort of canvas and then use JavaScript and AJAX to pop
up windows and display bits of information.  But I don't really know this
space of functionality very well.&lt;/p&gt;
&lt;p&gt;So I'm turning to the lazyweb.&lt;/p&gt;
&lt;p&gt;Are JavaScript+image maps the right way to go (for example, &lt;a class=&quot;reference&quot; href=&quot;http://www.sbrady.com/hotsource/javascript/mapdis.html&quot;&gt;this&lt;/a&gt;, &lt;a class=&quot;reference&quot; href=&quot;http://www.w3schools.com/js/js_image_maps.asp&quot;&gt;this&lt;/a&gt;, and &lt;a class=&quot;reference&quot; href=&quot;http://www.webmonkey.com/webmonkey/98/29/index3a_page2.html?tw=programming&quot;&gt;this&lt;/a&gt;)?
Do they work well with multiple browsers?  Or are there good JS
libraries for &lt;em&gt;drawing&lt;/em&gt; images on the fly in the browser?  Is SVG a
good thing to look at?  Were you stuck with this task, what would you use?&lt;/p&gt;
&lt;p&gt;The most important things for this project are, in order of importance:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;basic functionality (JS image maps seem fine for this)&lt;/li&gt;
&lt;li&gt;cross-browser functionality&lt;/li&gt;
&lt;li&gt;selection (e.g. &lt;a class=&quot;reference&quot; href=&quot;http://www.gmod.org/wiki/index.php/RubberBandSelection&quot;&gt;GMOD RubberBandSelection&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;flexibility: reordering and redrawing of images.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Your thoughts are much appreciated!  Please &lt;a class=&quot;reference&quot; href=&quot;mailto:ctb&amp;#64;msu.edu&quot;&gt;drop me a line&lt;/a&gt; or comment, whichever is most convenient.  I'll summarize the options.&lt;/p&gt;
&lt;p&gt;thanks,&lt;/p&gt;
&lt;p&gt;--titus&lt;/p&gt;
&lt;p&gt;p.s. I'm perfectly fine with &amp;quot;Google this, dumby!&amp;quot;  I just don't have much
in the way of google keyword knowledge in this area...&lt;/p&gt;
&lt;/div&gt;</description>
	<pubDate>Wed, 07 May 2008 22:03:21 +0000</pubDate>
</item>
<item>
	<title>OpenOpt (Dmitrey Kroshko): Some code cleanup</title>
	<guid>tag:blogger.com,1999:blog-6210259640013469958.post-5249108110155301416</guid>
	<link>http://openopt.blogspot.com/2008/05/some-code-cleanup.html</link>
	<description>I have started some code cleanup (mentioned in OO timeline), some changes have been already committed and some more will be done from time to time, so current OO taken from svn or latest tarball can work unstably (of course, I have checked my tests before code commit, but some other may fail).</description>
	<pubDate>Wed, 07 May 2008 13:16:42 +0000</pubDate>
	<author>noreply@blogger.com (Dmitrey)</author>
</item>
<item>
	<title>Matthieu Brucher: Book review: From P2P to Web Services and Grids: Peers In A Client/Server World</title>
	<guid>http://matt.eifelle.com/?p=59</guid>
	<link>http://matt.eifelle.com/2008/05/06/book-review-from-p2p-to-web-services-and-grids-peers-in-a-clientserver-world/</link>
	<description>&lt;p&gt;I was looking for an introductory book on peer-to-peer (P2P) application and their application to grid computation. Web services was a bonus, as it is something I don&amp;#8217;t usually play with.&lt;/p&gt;
&lt;h4&gt;Content and opinions&lt;/h4&gt;
&lt;p&gt;The book is split in four parts. The first chapter is an introduction to distributed systems, with the definitions and some examples of what is and what is not a centralized (by opposition to decentralized) application or framework. For people novice to P2P, the examples and the problems are well presented.&lt;/p&gt;
&lt;p&gt;The first part goes into details of a distributed environment. The P2P solution is thus exposed, with its specific aspects, social (P2P has not a good reputation, to say the least) or routing (accessing peer behind firewalls, routers). As web services are one of the main subjects of the book, they are presented next. The last chapter tackles grid computing through its evolution, the current definition of a grid and the Globus Toolkit 2 architecture. Those chapters are really interesting because they lay down the ground for the remaining of the book.&lt;/p&gt;
&lt;p&gt;The second part is about several P2P technologies that can be used, as well as some specific issues. &lt;strong&gt;Jini&lt;/strong&gt; and &lt;strong&gt;Gnutella&lt;/strong&gt; are the first ones to be exposed. They were not developed to answer to the same questions: Jini is about &lt;em&gt;Remote Objects&lt;/em&gt; and Gnutella is about &lt;em&gt;file sharing&lt;/em&gt;. These technologies introduce the issues of scalability and security ; the first tackles the use of more nodes in the grid, the second the protection of the grid. Finally, &lt;strong&gt;Freenet&lt;/strong&gt; and &lt;strong&gt;JXTA&lt;/strong&gt; are exposed. The first is dedicated to fiel storage on a distributed data grid, the second is a generic P2P framework. The chapters on the different technologies do not bring more information than what can be found on tutorials on the net, but they explain them in a clear way. Scalability and security are aspects that are sometimes forgotten in the design of a distributed system, so their presence in this part of the book helps remembering them.&lt;/p&gt;
&lt;p&gt;Part three tackles Jini, JXTA and web service deployement. The first two chapters have some code samples that can be used ; for web service, there is only some XML fragments. Several formats are exposed in this chapter with their advantages and drawbacks.&lt;/p&gt;
&lt;p&gt;Finally, the fourth chapter presents web services applied to grid systems. This gives grid services. The Globus toolkit 3 can be used for those grid services, and the future version 4 is introduced as well. This part is the shortest, maybe because these special services are not widely used, and a lot should still be explored to have a clear software designed (which may be used by the Globus toolkit 4, according to the book).&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;The good writting style of the book helps reading the book, as some pages can be difficult to understand. The final goal is to present grid services, with the underlying frameworks and tools that are grid (and P2P) systems and web services. The beginner is taken from the basics to advanced concepts, which can be applied to concrete grids.&lt;/p&gt;
&lt;p&gt;If grid computation, how they can be done, and web services are of interest to you, I suggest you read this book.&lt;/p&gt;
&lt;div class=&quot;subcolumns&quot;&gt;
&lt;div&gt;
&lt;div&gt;
		&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/1852338695/masbl03-20&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/516STRQKYVL._SL75_.jpg&quot; width=&quot;50&quot; height=&quot;75&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
	&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/1852338695/masbl03-20&quot; target=&quot;_blank&quot;&gt;From P2P to Web Services and Grids: Peers in a Client/Server World&lt;/a&gt; (Paperback)&lt;br /&gt;
		&lt;span&gt;by &lt;strong&gt;Ian J. Taylor, Andrew Harrison&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
		ISBN: 1852338695&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Price:&lt;/strong&gt; &lt;span&gt;USD 52.30&lt;/span&gt;&lt;br /&gt;
		17 deals available from &lt;span&gt;USD 48.29&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;		&lt;img src=&quot;http://matt.eifelle.com/wp-content/plugins/amazonsimpleadmin/img/stars-4.5.gif&quot; class=&quot;asa_rating_stars&quot; /&gt; (4 reviews)
	&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 06 May 2008 07:29:41 +0000</pubDate>
</item>
<item>
	<title>Ga&amp;#235;l Varoquaux: Update on my life</title>
	<guid>http://gael-varoquaux.info/blog/?p=34</guid>
	<link>http://gael-varoquaux.info/blog/?p=34</link>
	<description>&lt;p&gt;I am currently changing jobs and changing countries. This is why I have been really bad at dealing with questions on the mailing-lists, bug-reports or feature requests.&lt;/p&gt;
&lt;h1&gt;Before&lt;/h1&gt;
&lt;p&gt;So far I have been working as a physicist, doing atomic physics (Bose Einstein Condensation). I studied quantum physics, mostly theory, and I did a PhD in an experimental lab, building a couple of experiments on Bose Einstein Condensation and atom interferometry. After this, I moved to Florence to do a post-doc also on a BEC experiment.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://gael-varoquaux.info/blog/wp-content/uploads/2008/05/gregor_in_lab.jpg&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-35&quot; title=&quot;gregor_in_lab&quot; src=&quot;http://gael-varoquaux.info/blog/wp-content/uploads/2008/05/gregor_in_lab.jpg&quot; alt=&quot;A colleague working on the experiment in Florence&quot; width=&quot;499&quot; height=&quot;375&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This kind of work is very experimental. These experiments are monsters that you have to keep alive doing a lot of homemade mechanics, optics, and electronics. I thought I would love that, because I used to like working with my hands, but I grew tired of it. I wanted to work more with abstractions. And in addition I am computer geek, the parts of my job I preferred were related to computers.&lt;/p&gt;
&lt;h1&gt;This summer&lt;/h1&gt;
&lt;p&gt;My contract has ended at the end of April, and I have not renewed it. I was missing my girlfriend and wanted to find an excuse to come back to Paris. So now I am jobless, living at the expense of my girlfriend. I decided to take some time without a job, as I have the feeling I have been working without stopping for the last few years, not having time to travel and visit the world as I like to. We are planning a three weeks trip to Uzbekistan and Kyrgyzstan in two weeks.&lt;/p&gt;
&lt;p&gt;After this i am going to devote my summer to hacking. The big news is that I am going to be going to the states. I will spend most of my time in Austin, working for &lt;a href=&quot;http://www.enthought.com&quot;&gt;Enthought&lt;/a&gt;. I am very excited about this, as I see this as the occasion to learn more about building scientific GUIs with Python. Building usable scientific programs is something that I am passionate about. I will also spend some time at Berkeley, with Fernando Perez, hopefully to work on Ipython1. I need to thank Enthought for making this possible for me, as they are providing the money. With some luck, this summer I will be productive on the free software side.&lt;/p&gt;
&lt;p&gt;Of course right now I am battling with moving houses, fighting for visas, trying to fall back on my feet and organize the summer. I still don&amp;#8217;t have my visa for the states, and it is making me nervous. I would really hate to have to cancel my trip to Kyrgyzstan because of visa problems with the states: I take time off work, I expect to spend it enjoying myself, and not waiting for visas.&lt;/p&gt;
&lt;h1&gt;The future&lt;/h1&gt;
&lt;p&gt;So I am quitting atomic physics. I am starting a new adventure in something totally new for me. Starting from October, I will be working with JB Poline and Bertrand Thirion, at &lt;a href=&quot;http://www-dsv.cea.fr/neurospin/&quot;&gt;Neurospin&lt;/a&gt;, on neuroimaging. This work is mostly data processing, even though  it has a lot of interplay with the physics of NMR. This is something very new for me and I will have to discover a new field. The good news is that a lot of the work is centered on computers, and one of the core technologies used at Neurospin is Python.&lt;/p&gt;</description>
	<pubDate>Mon, 05 May 2008 08:35:15 +0000</pubDate>
</item>
<item>
	<title>Enthought: Facelift for code.enthought.com: of Commodities, Communities and Mullets</title>
	<guid>http://blog.enthought.com/?p=30</guid>
	<link>http://blog.enthought.com/?p=30</link>
	<description>We&amp;#8217;ve recently refreshed the look and content of our code.enthought.com site, so I thought I&amp;#8217;d provide my thoughts about what the site is about and what it means to Enthought (and the world). I&amp;#8217;ll apologize in advance for rambling.

For several years Enthought has hosted code.enthought.com as a site for the Open Source tools that we&amp;#8217;ve [...]</description>
	<pubDate>Fri, 02 May 2008 19:26:57 +0000</pubDate>
</item>
<item>
	<title>OpenOpt (Dmitrey Kroshko): Python Wins &quot;Favorite Scripting Language&quot; Award</title>
	<guid>tag:blogger.com,1999:blog-6210259640013469958.post-7090014778030079835</guid>
	<link>http://openopt.blogspot.com/2008/05/python-wins-favorite-scripting-language.html</link>
	<description>(The information has been taken from PSF blog)&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;Python Wins &quot;Favorite Scripting Language&quot; Award.&lt;br /&gt;&lt;br /&gt;May 1, 2008 Linux Journal announced their 2008 &lt;a href=&quot;http://www.linuxjournal.com/article/10065&quot;&gt;Readers' Choice Awards&lt;/a&gt; today, and we are happy to say that Python won the Favorite Scripting Language category with 28.9% of the vote. PHP, Bash and Perl (in that order) won honorable mentions. Thanks to everyone who took the time to register their votes. Python's popularity does seem to be climbing this year, as attendance at the recent Chicago PyCon confirmed with a 77% increase in attendance. Let's hope that leads to career opportunities for Python users!&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------&lt;br /&gt;&lt;div class=&quot;titlepage&quot;&gt;Favorite Scripting Language:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;bold&quot;&gt;&lt;b&gt;Python&lt;/b&gt;&lt;/span&gt; (28.9%) &lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;span class=&quot;emphasis&quot;&gt;&lt;em&gt;Honorable Mentions&lt;/em&gt;&lt;/span&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt; PHP (21.7%) &lt;/li&gt;&lt;li&gt; bash (19.8%) &lt;/li&gt;&lt;li&gt; Perl (17%) &lt;/li&gt;&lt;/ul&gt;</description>
	<pubDate>Thu, 01 May 2008 16:46:12 +0000</pubDate>
	<author>noreply@blogger.com (Dmitrey)</author>
</item>
<item>
	<title>OpenOpt (Dmitrey Kroshko): Using OpenOpt with KUBUNTU 8.04</title>
	<guid>tag:blogger.com,1999:blog-6210259640013469958.post-876506309852596332</guid>
	<link>http://openopt.blogspot.com/2008/04/using-openopt-with-kubuntu-804.html</link>
	<description>After KUBUNTU 8.04 installation + python-matplotlib from channel I had a error message &quot;can't find gtk module&quot; (while using p.plot=1). After installation python-gtk2 from &lt;a href=&quot;http://packages.ubuntu.com/hardy/python/python-gtk2&quot;&gt;here&lt;/a&gt; all works ok.</description>
	<pubDate>Wed, 30 Apr 2008 12:46:57 +0000</pubDate>
	<author>noreply@blogger.com (Dmitrey)</author>
</item>
<item>
	<title>Matthieu Brucher: My favorite design pattern in Python</title>
	<guid>http://matt.eifelle.com/?p=67</guid>
	<link>http://matt.eifelle.com/2008/04/30/my-favorite-design-pattern-in-python/</link>
	<description>&lt;p&gt;I&amp;#8217;ve noticed some days ago that I mainly used one design pattern in my scientific (but not only) code, the &lt;strong&gt;registry&lt;/strong&gt;. How does it work? A registry is a list/dictionary/&amp;#8230; of objects, applications add a new entry if it is needed, and then a user can tap into the registry to find the most adequate object for one&amp;#8217;s purpose.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-67&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In fact, the registry is one of the best replacement for the &lt;em&gt;switch&lt;/em&gt; statement. Indeed, it is far more modular as new cases can be introduced and deleted, and it is more readable as well.&lt;/p&gt;
&lt;p&gt;I used a registry in several pieces of code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;when I&amp;#8217;m playing with manifold learning, I have a registry of the dimensionality reduction tools and I can choose the one that fits my needs (given as a commandline argument);&lt;/li&gt;
&lt;li&gt;I refactored scikits.openopt so that a registry contains the different solver wrappers, and now people can add their own wrapper in the dictionary, the key being the name of the solver and the value is a string with the package hierarchy to use;&lt;/li&gt;
&lt;li&gt;I&amp;#8217;m trying to develop a JXTA implementation in Python, and the registry shows up everywhere, or almost. For instance, as in the original, Java, implementation, the advertisements are stored in a dictionary, and new kind of advertisements can be registered efficiently. The parsing of each advertisement is also done with a class registry.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python, with is dynamic and duck typing, is naturally inclined to use registers, IMHO. This is more scientific-oriented coding, but the ease of use of a registry is very helpful in my everyday work.&lt;/p&gt;
&lt;p&gt;Here is a sample of the automatic use in pyP2P:&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table width=&quot;100%&quot;&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;msgheader&quot;&gt;&lt;div class=&quot;codebox_right&quot;&gt;&lt;a href=&quot;http://matt.eifelle.com/feed###&quot;&gt;[Copy to clipboard]&lt;/a&gt;&lt;a href=&quot;http://matt.eifelle.com/feed###&quot;&gt;[&lt;span id=&quot;674_symbol&quot;&gt;-&lt;/span&gt;]&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;codebox_left2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Download&lt;a href=&quot;http://matt.eifelle.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=67&amp;amp;download=__init__.py&quot;&gt;__init__.py&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id=&quot;674&quot;&gt;&lt;td class=&quot;code&quot; id=&quot;67code4&quot;&gt;&lt;pre class=&quot;python&quot;&gt;&lt;span&gt;from&lt;/span&gt; advertisement_core &lt;span&gt;import&lt;/span&gt; *
&lt;span&gt;from&lt;/span&gt; peer_advertisement &lt;span&gt;import&lt;/span&gt; *&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;


&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table width=&quot;100%&quot;&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;msgheader&quot;&gt;&lt;div class=&quot;codebox_right&quot;&gt;&lt;a href=&quot;http://matt.eifelle.com/feed###&quot;&gt;[Copy to clipboard]&lt;/a&gt;&lt;a href=&quot;http://matt.eifelle.com/feed###&quot;&gt;[&lt;span id=&quot;675_symbol&quot;&gt;-&lt;/span&gt;]&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;codebox_left2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Download&lt;a href=&quot;http://matt.eifelle.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=67&amp;amp;download=advertisement_core.py&quot;&gt;advertisement_core.py&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id=&quot;675&quot;&gt;&lt;td class=&quot;code&quot; id=&quot;67code5&quot;&gt;&lt;pre class=&quot;python&quot;&gt;&lt;span&gt;class&lt;/span&gt; Advertisement&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;:
  &lt;span&gt;pass&lt;/span&gt;
&amp;nbsp;
registry = &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;


&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table width=&quot;100%&quot;&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;msgheader&quot;&gt;&lt;div class=&quot;codebox_right&quot;&gt;&lt;a href=&quot;http://matt.eifelle.com/feed###&quot;&gt;[Copy to clipboard]&lt;/a&gt;&lt;a href=&quot;http://matt.eifelle.com/feed###&quot;&gt;[&lt;span id=&quot;676_symbol&quot;&gt;-&lt;/span&gt;]&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;codebox_left2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Download&lt;a href=&quot;http://matt.eifelle.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=67&amp;amp;download=peer_advertisement.py&quot;&gt;peer_advertisement.py&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id=&quot;676&quot;&gt;&lt;td class=&quot;code&quot; id=&quot;67code6&quot;&gt;&lt;pre class=&quot;python&quot;&gt;&lt;span&gt;import&lt;/span&gt; advertisement_core
&amp;nbsp;
&lt;span&gt;class&lt;/span&gt; PeerAdvertisement&lt;span&gt;&amp;#40;&lt;/span&gt;advertisement_core.&lt;span&gt;Advertisement&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;:
  &lt;span&gt;pass&lt;/span&gt;
&amp;nbsp;
advertisement_core.&lt;span&gt;registry&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&amp;quot;PA&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; = PeerAdvertisement&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This way, when the module is imported, the registry is also automatically populated.&lt;/p&gt;</description>
	<pubDate>Wed, 30 Apr 2008 07:16:56 +0000</pubDate>
</item>
<item>
	<title>OpenOpt (Dmitrey Kroshko): new OO MILP solver: glpk</title>
	<guid>tag:blogger.com,1999:blog-6210259640013469958.post-8982214810262030525</guid>
	<link>http://openopt.blogspot.com/2008/04/new-oo-milp-solver-glpk.html</link>
	<description>Another one &lt;a href=&quot;http://scipy.org/scipy/scikits/wiki/MILP&quot;&gt;MILP&lt;/a&gt; solver has been connected - glpk. This one can handle binary constraints: x_j should be from {0, 1} for all j from p.binVars (lpSolve cannot, but maybe setting for those coords &lt;br /&gt;lb[j], ub[j] = 0, 1 &lt;br /&gt;and demand them to be integers (p.intVars = [...])&lt;br /&gt;can be helpful).&lt;br /&gt;&lt;br /&gt;Requires CVXOPT ver &gt;= 1.0 + Python ver &gt;= 2.4 (code contains Python set) + glpk.&lt;br /&gt;See more details + example in OO MILP webpage (mentioned above).</description>
	<pubDate>Tue, 29 Apr 2008 10:27:00 +0000</pubDate>
	<author>noreply@blogger.com (Dmitrey)</author>
</item>
<item>
	<title>Enthought: Python for Scientific Computing - Training Course</title>
	<guid>http://blog.enthought.com/?p=29</guid>
	<link>http://blog.enthought.com/?p=29</link>
	<description>Enthought is offering an open training course for Scientific Computing with Python at its Austin, TX offices. Space is limited. We&amp;#8217;ll accept the first 15 people who register.
Date: June 23-27, 2008
Location: Austin, Texas, at Enthought&amp;#8217;s offices
Cost: 3 days: $1500; 5 days: $2500. You can attend either the         [...]</description>
	<pubDate>Mon, 28 Apr 2008 17:59:37 +0000</pubDate>
</item>
<item>
	<title>Ga&amp;#235;l Varoquaux: Docs using Sphinx</title>
	<guid>http://gael-varoquaux.info/blog/?p=33</guid>
	<link>http://gael-varoquaux.info/blog/?p=33</link>
	<description>&lt;p&gt;After Ipython and Sympy, Mayavi is now using &lt;a href=&quot;http://sphinx.pocoo.org/&quot;&gt;sphinx&lt;/a&gt; to build its docs. Sphinx is very neat because it allows for high quality pdf and html from the same restructured text source. The killer feature is that the resulting html pages have a builtin search that works with javascript, and thus works on the client without the need of a server.&lt;/p&gt;
&lt;p&gt;In addition, the developer is very reactive and dedicated to making sphinx versatile-enough to generate high-quality docs for many packages. As a result many Python projects are switching to sphinx. First Python itself (that&amp;#8217;s what sphinx was created for), but now more and more. It seems that zope is even considering it. One great side effect is that documentation for different Python modules will be consistent, with the same look and feel (although you can tweak sphinx output if you want).&lt;/p&gt;
&lt;p&gt;We don&amp;#8217;t have a server serving the html docs yet (it is planned, we just need a bit of time), but you can check out the pdf generated &lt;a href=&quot;https://svn.enthought.com/enthought/browser/Mayavi/branches/enthought.mayavi_2.1.2/docs/build/latex/mayavi_user_guide.pdf?format=raw&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Mon, 28 Apr 2008 08:10:30 +0000</pubDate>
</item>
<item>
	<title>Matthieu Brucher: Book review: Twisted: Networking Programming Essentials</title>
	<guid>http://matt.eifelle.com/?p=66</guid>
	<link>http://matt.eifelle.com/2008/04/28/book-review-twisted-networking-programming-essentials/</link>
	<description>&lt;p&gt;This book is different from the two last books I read. Indeed, it tackles a specific Python library, &lt;strong&gt;Twisted&lt;/strong&gt;, and how to use it.&lt;/p&gt;
&lt;h4&gt;Content and opinions&lt;/h4&gt;
&lt;p&gt;Twisted is a network library aiming at simplifying the developement of network applications. It is based on an event loop for all processing (unfortunately, no word in the book about managing several event loops, as it is the case with GUI-based applications).&lt;/p&gt;
&lt;p&gt;After an introduction of what is event programming with simple clients and servers, the reader will be introduced to basic web clients and servers. Twisted proposes a lot of bridges to create webservices with XMLRPC or SOAP. The explanations and the code is pretty clear, and it is easy to do one&amp;#8217;s own small distributed application with these blocks.&lt;/p&gt;
&lt;p&gt;When authentification is introduced, it is hard to understand at first. Zope interfaces are used, but I didn&amp;#8217;t find the explanation of what they are and what the function &lt;em&gt;implements()&lt;/em&gt; is and does. One can find out with the context, but a complete introduction of these techniques should be done at this point. Once authentification is understood, other services are exposed, like mail clients and servers (how to send a mail, process the information in the mail to send an answer), as well as NNTP.&lt;/p&gt;
&lt;p&gt;SSH is only introduced towards the end of the book. And it is not simply explained as it is mixed with shells. Finally, network applications often are services or dameons, how to create them is done in the last chapter.&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;This book is good, a lot of explanations and of code (some mistakes can be found here and there) helps understanding the use of the library. Some parts of the book are outdated, so I hope that a new edition will be published soon, and some software tools should be more explained. Every aspect of Twisted is not developed in the book, it&amp;#8217;s only &lt;em&gt;Networking Programming Essentials&lt;/em&gt;, but once the basics are known, the rest can be learnt with the documentation.&lt;/p&gt;
&lt;div class=&quot;subcolumns&quot;&gt;
&lt;div&gt;
&lt;div&gt;
		&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0596100329/masbl03-20&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/5118bxK2Q7L._SL75_.jpg&quot; width=&quot;57&quot; height=&quot;75&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
	&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0596100329/masbl03-20&quot; target=&quot;_blank&quot;&gt;Twisted Network Programming Essentials&lt;/a&gt; (Paperback)&lt;br /&gt;
		&lt;span&gt;by &lt;strong&gt;Abe Fettig&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
		ISBN: 0596100329&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Price:&lt;/strong&gt; &lt;span&gt;USD 19.77&lt;/span&gt;&lt;br /&gt;
		47 deals available from &lt;span&gt;USD 7.73&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;		&lt;img src=&quot;http://matt.eifelle.com/wp-content/plugins/amazonsimpleadmin/img/stars-3.5.gif&quot; class=&quot;asa_rating_stars&quot; /&gt; (9 reviews)
	&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
	<pubDate>Mon, 28 Apr 2008 07:11:00 +0000</pubDate>
</item>
<item>
	<title>OpenOpt (Dmitrey Kroshko): CVXOPT 1.0 has been released</title>
	<guid>tag:blogger.com,1999:blog-6210259640013469958.post-6980507372244252260</guid>
	<link>http://openopt.blogspot.com/2008/04/cvxopt-10-has-been-released.html</link>
	<description>&lt;a href=&quot;http://abel.ee.ucla.edu/cvxopt&quot;&gt;CVXOPT&lt;/a&gt; developers have informed of release 1.0. &lt;br /&gt;&lt;br /&gt;As I had &lt;a href=&quot;http://openopt.blogspot.com/2008/03/mb-cvxopt-will-include-glpk-milp-solver.html&quot;&gt;informed&lt;/a&gt;, one of the changes is interface to GLPK integer LP solver. I intend to have the one connected to OO (till next.OO release). Currently single MILP solver connected to OO is lp_solve (as lpSolve).</description>
	<pubDate>Sun, 27 Apr 2008 12:48:47 +0000</pubDate>
	<author>noreply@blogger.com (Dmitrey)</author>
</item>
<item>
	<title>Official SymPy blog: SymPy 0.5.14 released</title>
	<guid>tag:blogger.com,1999:blog-2520472460430880330.post-2289142824144363416</guid>
	<link>http://sympy.blogspot.com/2008/04/sympy-0514-released.html</link>
	<description>SymPy 0.5.14 has been released on April 26, 2008. It is available at&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://code.google.com/p/sympy/&quot;&gt;http://code.google.com/p/sympy/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;About SymPy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SymPy is a Python library for symbolic mathematics. It aims to become a full-featured computer algebra system (CAS) while keeping the code as simple as possible in order to be comprehensible and easily extensible. SymPy is written entirely in Python and does not require any external libraries.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;user-visible changes:&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;SymPy is now 25% faster on average compared to the previous release (see below) &lt;/li&gt;&lt;li&gt;Documentation was improved a &lt;strong&gt;lot&lt;/strong&gt; (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/26d75a5b7dbc&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/a0a01fc08c63&quot; rel=&quot;nofollow&quot;&gt;2&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/526612998a02&quot; rel=&quot;nofollow&quot;&gt;3&lt;/a&gt;). See &lt;a href=&quot;http://docs.sympy.org/&quot; rel=&quot;nofollow&quot;&gt;http://docs.sympy.org/&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;tt&gt;rsolve_poly&lt;/tt&gt; &amp;amp; &lt;tt&gt;rsolve_hyper&lt;/tt&gt; fixed (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/191d906f553b&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/95722c586c3c&quot; rel=&quot;nofollow&quot;&gt;2&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;subs and subs_dict unified to .subs() (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/c78c01651791&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/cf7db1715d61&quot; rel=&quot;nofollow&quot;&gt;2&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;faster and more robust polynomials module (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/eae5a978e965&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/a2b46b6a9339&quot; rel=&quot;nofollow&quot;&gt;2&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/068fe612ab61&quot; rel=&quot;nofollow&quot;&gt;3&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/94ce7584098a&quot; rel=&quot;nofollow&quot;&gt;4&lt;/a&gt;,  &lt;a href=&quot;http://hg.sympy.org/sympy/rev/e4e392eebac5&quot; rel=&quot;nofollow&quot;&gt;5&lt;/a&gt;,  &lt;a href=&quot;http://hg.sympy.org/sympy/rev/d8110613024e&quot; rel=&quot;nofollow&quot;&gt;6&lt;/a&gt;,  &lt;a href=&quot;http://hg.sympy.org/sympy/rev/58d8d9eb2cfa&quot; rel=&quot;nofollow&quot;&gt;7&lt;/a&gt;,  &lt;a href=&quot;http://hg.sympy.org/sympy/rev/911965062220&quot; rel=&quot;nofollow&quot;&gt;8&lt;/a&gt;,  &lt;a href=&quot;http://hg.sympy.org/sympy/rev/d3fd80444cb6&quot; rel=&quot;nofollow&quot;&gt;9&lt;/a&gt;,  &lt;a href=&quot;http://hg.sympy.org/sympy/rev/ac727777a83a&quot; rel=&quot;nofollow&quot;&gt;10&lt;/a&gt;,  &lt;a href=&quot;http://hg.sympy.org/sympy/rev/176de6403477&quot; rel=&quot;nofollow&quot;&gt;11&lt;/a&gt;,  &lt;a href=&quot;http://hg.sympy.org/sympy/rev/a9fc641351aa&quot; rel=&quot;nofollow&quot;&gt;12&lt;/a&gt;,  &lt;a href=&quot;http://hg.sympy.org/sympy/rev/4a71cecc65f4&quot; rel=&quot;nofollow&quot;&gt;13&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/90caafd36b5a&quot; rel=&quot;nofollow&quot;&gt;14&lt;/a&gt;, ..., look into the hg history) &lt;/li&gt;&lt;li&gt;improved Matrix.det(), implemented Berkowitz algorithm (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/c8cbb6c5e78d&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/6ab14eeeda3e&quot; rel=&quot;nofollow&quot;&gt;2&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;improved isympy (interactive shell for SymPy) (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/075af554b091&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/01b152988acb&quot; rel=&quot;nofollow&quot;&gt;2&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/194752e14bd7&quot; rel=&quot;nofollow&quot;&gt;3&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/58cddca75b8f&quot; rel=&quot;nofollow&quot;&gt;4&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/397a1bf465b9&quot; rel=&quot;nofollow&quot;&gt;5&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/82d6521722e9&quot; rel=&quot;nofollow&quot;&gt;6&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;pretty-printing improved (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/16f56992f467&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/31c518a87450&quot; rel=&quot;nofollow&quot;&gt;2&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/e12accf6a9d1&quot; rel=&quot;nofollow&quot;&gt;3&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;Rel, Eq, Ne, Lt, Le, Gt, Ge implemented (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/4bb011af2d0c&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;Limit class represents unevaluated limits now (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/936e73c6bafd&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;)  &lt;/li&gt;&lt;li&gt;Bailey-Borwein-Plouffe algorithm (finds the nth hexidecimal digit of pi without calculating the previous digits) implemented (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/6d73013adce3&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;solver for transcendental equations added (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/e2db18455951&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;.nseries() methods implemented (more robust/faster than .oseries) (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/81f8e2c98500&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/a2eed9dc6a91&quot; rel=&quot;nofollow&quot;&gt;2&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;multivariate Lambdas implemented (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/0097b68ac3c5&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;) &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;changes that affected speed:&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;&lt;tt&gt;__eq__&lt;/tt&gt;/&lt;tt&gt;__ne__&lt;/tt&gt;/&lt;tt&gt;__nonzero__&lt;/tt&gt; returns True/False directly so dict lookups are not expensive anymore (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/1f52bd36839c&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/d9965888a005&quot; rel=&quot;nofollow&quot;&gt;2&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/9e7131a4533b&quot; rel=&quot;nofollow&quot;&gt;3&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/76542a035dd6&quot; rel=&quot;nofollow&quot;&gt;4&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/92af27a9e8bd&quot; rel=&quot;nofollow&quot;&gt;5&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/edcd763c6999&quot; rel=&quot;nofollow&quot;&gt;6&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;&lt;tt&gt;sum(x**i/i,i=1..400)&lt;/tt&gt; is now 4.8x faster (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/9fa720169ed9&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/15fc2acb7231&quot; rel=&quot;nofollow&quot;&gt;2&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/a602e5369326&quot; rel=&quot;nofollow&quot;&gt;3&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/2e496abeb32b&quot; rel=&quot;nofollow&quot;&gt;4&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/4962f6641827&quot; rel=&quot;nofollow&quot;&gt;5&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;&lt;tt&gt;isinstance(term, C.Mul)&lt;/tt&gt;  was replaced by &lt;tt&gt;term.is_Mul&lt;/tt&gt; and similarly for other basic classes (&lt;a href=&quot;http://hg.sympy.org/sympy/rev/f83106bc39a5&quot; rel=&quot;nofollow&quot;&gt;commit 1&lt;/a&gt;, &lt;a href=&quot;http://hg.sympy.org/sympy/rev/a522f77cd5e9&quot; rel=&quot;nofollow&quot;&gt;2&lt;/a&gt;) &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Plus a lot of smaller bugfixes, you can browse our Mercurial &lt;a href=&quot;http://hg.sympy.org/sympy/shortlog&quot;&gt;history&lt;/a&gt; for details.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;This release contains patches from 15 developers, which is so far the highest number of people/release (33 people have sent patches to SymPy so far, see the list of &lt;a href=&quot;http://wiki.sympy.org/wiki/Contributors&quot;&gt;contributors&lt;/a&gt;):&lt;br /&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Mateusz Paprocki &lt;/li&gt;&lt;li&gt;Fredrik Johansson &lt;/li&gt;&lt;li&gt;James Aspnes &lt;/li&gt;&lt;li&gt;Friedrich Hagedorn &lt;/li&gt;&lt;li&gt;Pan Peng &lt;/li&gt;&lt;li&gt;Abderrahim Kitouni &lt;/li&gt;&lt;li&gt;Nimish Telang &lt;/li&gt;&lt;li&gt;Jurjen N.E. Bos &lt;/li&gt;&lt;li&gt;Elrond der Elbenfuerst &lt;/li&gt;&lt;li&gt;Rizgar Mella &lt;/li&gt;&lt;li&gt;Felix Kaiser &lt;/li&gt;&lt;li&gt;Roberto Nobrega &lt;/li&gt;&lt;li&gt;David Roberts &lt;/li&gt;&lt;li&gt;Ondřej Čertík &lt;/li&gt;&lt;li&gt;Kirill Smelkov &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you'd like to contribute too, you can browse our open issues here:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://code.google.com/p/sympy/issues/list&quot;&gt;http://code.google.com/p/sympy/issues/list&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and then we suggest you to read the &lt;a href=&quot;http://docs.sympy.org/sympy-patches-tutorial.html&quot;&gt;SymPy Patches Tutorial&lt;/a&gt;, that explains how to work with Mercurial effectively and how to create and send patches easily (not only) to SymPy. Any contribution is welcome, be it documentation, code, or just hanging out on our &lt;a href=&quot;http://groups.google.com/group/sympy&quot;&gt;mailinglist&lt;/a&gt; or IRC (#sympy at freenode).</description>
	<pubDate>Sat, 26 Apr 2008 16:13:10 +0000</pubDate>
	<author>noreply@blogger.com (Ondřej Čertík)</author>
</item>
<item>
	<title>OpenOpt (Dmitrey Kroshko): OpenOpt will participate in GSoC 2008</title>
	<guid>tag:blogger.com,1999:blog-6210259640013469958.post-5645147500196918067</guid>
	<link>http://openopt.blogspot.com/2008/04/openopt-will-participate-in-gsoc-2008.html</link>
	<description>My OpenOpt-related application have been accepted to participate in GSoC 2008.&lt;br /&gt;This year assigned mentors are Alan G Isaac (same as GSoC 2007) and (co-mentor) Nils Wagner.&lt;br /&gt;&lt;br /&gt;Here's intended &lt;a href=&quot;http://scipy.org/scipy/scikits/wiki/OOTimeLine&quot;&gt;schedule&lt;/a&gt;, mb I'll start to do some chapters from the one earlier.</description>
	<pubDate>Fri, 25 Apr 2008 13:50:55 +0000</pubDate>
	<author>noreply@blogger.com (Dmitrey)</author>
</item>
<item>
	<title>Matthieu Brucher: Dimensionality reduction: comparison of different methods</title>
	<guid>http://matt.eifelle.com/?p=48</guid>
	<link>http://matt.eifelle.com/2008/04/23/dimensionality-reduction-comparison-of-different-methods/</link>
	<description>&lt;p&gt;I&amp;#8217;ve already given some answers in &lt;a href=&quot;http://matt.eifelle.com/2008/01/25/dimensionality-reduction-isomap/&quot;&gt;one of my first tickets on manifold learning&lt;/a&gt;. Here I will give some more complete results on the quality of the dimensionality reduction performed by the most well known techniques.&lt;/p&gt;
&lt;p&gt;First of all, my test is about respecting the geodesic distances in the reduced space. This is not possible for some manifolds like a Gaussian 2D plot. I used the SCurve to create the test, as the speed on the curve is unitary and thus the distances in the coordinate space (the one I used to create the SCurve) are the same as the geodesic ones on the manifold. My test measures the matrix (Froebenius) norm between the original coordinates and the computed one up to an affine transform of the latter.&lt;br /&gt;
&lt;span id=&quot;more-48&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I tested several noise levels :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;no noise&lt;/li&gt;
&lt;li&gt;5% of Gaussian noise&lt;/li&gt;
&lt;li&gt;2% of Laplacian noise (only 2% because there are many outliers in the Laplacian law)&lt;/li&gt;
&lt;li&gt;Impulsive noise on 12.5% elements of the distance matrix with 200% Laplacian noise (quantified with respect to the variance of the noise-free d1-d2, where d2 was estimated with my &lt;a href=&quot;http://matt.eifelle.com/2008/04/02/dimensionality-reduction-explicit-optimization-of-a-cost-function/&quot;&gt;robust cost function&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are the results:&lt;/p&gt;
&lt;table border=&quot;1&quot; width=&quot;100%&quot;&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;no noise&lt;/th&gt;
&lt;th&gt;Gaussian Noise 5%&lt;/th&gt;
&lt;th&gt;Laplacian noise 2%&lt;/th&gt;
&lt;th&gt;Impulsive noise&lt;/th&gt;
&lt;/tr&gt;
&lt;tr align=&quot;center&quot;&gt;
&lt;td&gt;PCA&lt;/td&gt;
&lt;td&gt;43.6&lt;/td&gt;
&lt;td&gt;43.6&lt;/td&gt;
&lt;td&gt;44.4&lt;/td&gt;
&lt;td&gt;na&lt;/td&gt;
&lt;/tr&gt;
&lt;tr align=&quot;center&quot;&gt;
&lt;td&gt;Isomap&lt;/td&gt;
&lt;td&gt;3.01&lt;/td&gt;
&lt;td&gt;8.55&lt;/td&gt;
&lt;td&gt;7.01&lt;/td&gt;
&lt;td&gt;3.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr align=&quot;center&quot;&gt;
&lt;td&gt;Sp&lt;/td&gt;
&lt;td&gt;2.29&lt;/td&gt;
&lt;td&gt;2.94&lt;/td&gt;
&lt;td&gt;6.46&lt;/td&gt;
&lt;td&gt;2.93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr align=&quot;center&quot;&gt;
&lt;td&gt;Ssam&lt;/td&gt;
&lt;td&gt;2.61&lt;/td&gt;
&lt;td&gt;2.60&lt;/td&gt;
&lt;td&gt;6.10&lt;/td&gt;
&lt;td&gt;3.22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr align=&quot;center&quot;&gt;
&lt;td&gt;Scca&lt;/td&gt;
&lt;td&gt;3.01&lt;/td&gt;
&lt;td&gt;6.22&lt;/td&gt;
&lt;td&gt;4.70&lt;/td&gt;
&lt;td&gt;3.09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr align=&quot;center&quot;&gt;
&lt;td&gt;Laplacian Eigenmaps&lt;/td&gt;
&lt;td&gt;21.13&lt;/td&gt;
&lt;td&gt;23.51&lt;/td&gt;
&lt;td&gt;23.47&lt;/td&gt;
&lt;td&gt;na&lt;/td&gt;
&lt;/tr&gt;
&lt;tr align=&quot;center&quot;&gt;
&lt;td&gt;Diffusion Maps&lt;/td&gt;
&lt;td&gt;67.50&lt;/td&gt;
&lt;td&gt;67.76&lt;/td&gt;
&lt;td&gt;67.54&lt;/td&gt;
&lt;td&gt;na&lt;/td&gt;
&lt;/tr&gt;
&lt;tr align=&quot;center&quot;&gt;
&lt;td&gt;Hessian Eigenmaps&lt;/td&gt;
&lt;td&gt;3.05&lt;/td&gt;
&lt;td&gt;18.57&lt;/td&gt;
&lt;td&gt;20.51&lt;/td&gt;
&lt;td&gt;na&lt;/td&gt;
&lt;/tr&gt;
&lt;tr align=&quot;center&quot;&gt;
&lt;td&gt;LLE&lt;/td&gt;
&lt;td&gt;40.1&lt;/td&gt;
&lt;td&gt;90.2&lt;/td&gt;
&lt;td&gt;69.2&lt;/td&gt;
&lt;td&gt;na&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;The geodesic-based algorithms perfom obviously and logically better than every other algorithms. In my case, I want this to happen as I want to estimate a mapping function between the reduced space and the original space. This estimation and the effect of the reduction algorithm on it will be the subjects of future tickets.&lt;/p&gt;</description>
	<pubDate>Wed, 23 Apr 2008 07:11:43 +0000</pubDate>
</item>
<item>
	<title>Enthought: EPD - The Kitchen-Sink-Included Python Distribution</title>
	<guid>http://blog.enthought.com/?p=28</guid>
	<link>http://blog.enthought.com/?p=28</link>
	<description>The team here at Enthought has just released the Enthought Python Distribution (EPD):
EPD is a Distribution of the Python Programming Language (currently version 2.5.2) that includes over 60 additional libraries.  A short list includes (note, this is a partial list):


Package
Description
Version


Python
Core Python
2.5.2


NumPy
Multidimensional arrays and fast numerics for Python
1.0.4


SciPy
Scientific Library for Python
0.6.0


Enthought Tool Suite (ETS)
A suite [...]</description>
	<pubDate>Tue, 22 Apr 2008 23:09:37 +0000</pubDate>
</item>
<item>
	<title>Matthieu Brucher: Book review: Tools and environments for parallel and distributed computing</title>
	<guid>http://matt.eifelle.com/?p=61</guid>
	<link>http://matt.eifelle.com/2008/04/21/book-review-tools-and-environments-for-parallel-and-distributed-computing/</link>
	<description>&lt;p&gt;After &lt;a href=&quot;http://matt.eifelle.com/2008/04/11/book-review-advanced-computer-architecture-and-parallel-processing/&quot;&gt;Advanced Computer Architecture and Parallel Processing&lt;/a&gt;, I&amp;#8217;m going to review another book from the same serie. As the title hints it, the goal of this book is to introduce the tools that may be used in parallel, grid and distributed computing. This is the layer above the architecture the last book presented.&lt;/p&gt;
&lt;h4&gt;Content and opinions&lt;/h4&gt;
&lt;p&gt;This book is split in six very different chapters. The first introduces the basic and necessary notions of computer or cluster architecture that are inherent to parallel computing. The issues that remain to be solved are clearly exposed although they are not the main topic of this book (which are programming tools and environments). People familiar with usual computer science will benefit a lot from this chapter, people accustomed with grids and clusters will refresh their memories by reading it.&lt;/p&gt;
&lt;p&gt;The second chapter is dedicated to message passing tools. After a small comparison between Distributed Shared Memory models (DSMs, that are presented later) and MP tools, the important aspects of these tools are presented. Then, several of them are presented, with their advantages and their drawbacks (often in terms of richness of the interface they provide). Several pages propose experiment results, from the communication time for a given message to specific parallel applications like FFT transforms, and the conclusions are very interesting (the widely used MPI tool may not be the most adequate one for your parallel application&amp;#8230;)&lt;/p&gt;
&lt;p&gt;DSM are exposed in the third chapter. Hardware and software-based are analyzed through their specificities. Although DSMs are very attractive, they are not that well spread in labs and clusters (as far as I know, and this is a very selfish opinion). Here, some of the reasons are presented.&lt;/p&gt;
&lt;p&gt;The next chapter is an &amp;#8220;UFO&amp;#8221; in the whole book. For the first time, there is code (!!) for three distributed-object protocols (with tests and times), and perhaps more that usual text. At least, with DO, one can test even at the office (or even at home) if the technology may be interesting. Besides, DO are not difficult to use, and they can be very efficient in a small application.&lt;/p&gt;
&lt;p&gt;As the different tools are used on grids, a state of the art of the grid is summed up in the fifth chapter. The state of the art encompasses the goals of a grid and the associated management issues (security, data, scheduling, &amp;#8230;), the different frameworks (that may use some of the tools presented in the first chapters) and mainly the Globus toolkit, and of course the applications of the grid (astrophysics for instance). This chapter is enjoyable because it shows that the frameworks are used and developed for a lot of applications. This leads to robust libraries that can be reused for one&amp;#8217;s application(s). A small presentation of web services is done in the end of this chapter.&lt;/p&gt;
&lt;p&gt;Finally, some development process stages are presented. A typical parallel application cannot be developed like a simple application (text processing, browser, &amp;#8230;), even less scientific applications. What was surprising when I read this chapter is that the different tools that can help developing parallel applications are listed after the presentation of the whole process. Besides, an example is used as a support to show how to use the process, but as no tool is used in the very example, its impact (as an explanation and as a support) is limited. For each step of the process, the conclusions are not always shown. This is annoying as it would have been a good argument for the proposed software development (which seems appropriate for parallel scientific applications).&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;This book was far more interesting for me than &lt;a href=&quot;http://matt.eifelle.com/2008/04/11/book-review-advanced-computer-architecture-and-parallel-processing/&quot;&gt;Advanced Computer Architecture and Parallel Processing&lt;/a&gt;, but this feeling is biased as I have a larger background in electronics and computer architecture than in parallel tools. Nevertheless, I enjoyed this reading which taught me a lot about the tools I could use and their diversity (shared-memory models, distributed objects, frameworks, &amp;#8230;).&lt;/p&gt;
&lt;div class=&quot;subcolumns&quot;&gt;
&lt;div&gt;
&lt;div&gt;
		&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0471332887/masbl03-20&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41SPQEZ1NXL._SL75_.jpg&quot; width=&quot;47&quot; height=&quot;75&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
	&lt;/div&gt;
&lt;div&gt;
		&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0471332887/masbl03-20&quot; target=&quot;_blank&quot;&gt;Tools and Environments for Parallel and Distributed Computing (Wiley Series on Parallel and Distributed Computing)&lt;/a&gt;&lt;br /&gt;
		&lt;strong&gt;Price:&lt;/strong&gt; &lt;span&gt;USD 96.52&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;18 Deals available from &lt;span&gt;USD 24.99&lt;/span&gt;&lt;/p&gt;

&lt;div&gt;&lt;/div&gt;


&lt;div class=&quot;subcolumns&quot;&gt;
&lt;div&gt;
&lt;div&gt;
		&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B000Q676W8/masbl03-20&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41BfkNWn3tL._SL75_.jpg&quot; width=&quot;47&quot; height=&quot;75&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
	&lt;/div&gt;
&lt;div&gt;
		&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B000Q676W8/masbl03-20&quot; target=&quot;_blank&quot;&gt;Tools and Environments for Parallel and Distributed Computing (Wiley Series on Parallel and Distributed Computing)&lt;/a&gt;&lt;br /&gt;
		&lt;strong&gt;Price:&lt;/strong&gt; &lt;span&gt;USD 89.20&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;1 Deals available from &lt;span&gt;USD 89.20&lt;/span&gt;&lt;/p&gt;

&lt;div&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 21 Apr 2008 07:14:54 +0000</pubDate>
</item>
<item>
	<title>Titus Brown: Eating your own dogfood (but only eating half the bowl)</title>
	<guid>http://ivory.idyll.org/blog/2008/04/20/eating-your-own-dogfood</guid>
	<link>http://ivory.idyll.org/blog/apr-08/eating-your-own-dogfood</link>
	<description>&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;So I'm &lt;a class=&quot;reference&quot; href=&quot;http://ivory.idyll.org/blog/mar-08/software-quality-death-spiral.html&quot;&gt;pretty bullish on testing&lt;/a&gt;
for maintenance reasons.  It was nice to see how well it worked out
for me when a user recently reported a problem with &lt;a class=&quot;reference&quot; href=&quot;http://cartwheel.idyll.org/&quot;&gt;Cartwheel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is what happened: third-party package (LAGAN) that the user was running
through the Web interface depended on certain command-line behavior from
'sort'.  Now, I wasn't aware the the command-line arguments to sort were
still evolving, but apparently they are -- my latest Debian upgrade removed
some options (the '+1' behavior) in favor of '-k 1'.  In any case, I did
this big upgrade of many packages, and didn't realize that this third-party
program was now broken.  (More on that later.)&lt;/p&gt;
&lt;p&gt;The user reported weird results, so I went and verified that he'd set
everything up properly and that this was in fact a real problem.  Then
I ran the Cartwheel automated test suite.  Voila!  Problem was instantly
pinpointed in a reproducible manner.&lt;/p&gt;
&lt;p&gt;I fixed the program (editing Perl, ick), re-ran the tests, and then
re-ran the user's analyses.  Tada, done.&lt;/p&gt;
&lt;p&gt;OK, so, great, the tests pinpointed the error for me after the user had
found it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why did I have to wait for a user to report it?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Because I wasn't running the tests under continuous integration on my
compute server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why not?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Can't think of why.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What would you have done differently?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I would have made sure all my tests were passing on my compute server
after I upgraded the thing, i.e. not been a schmuck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What have we learned?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tests are only useful if (first) you write them -- that's half the battle --
and (second) you run them.  Oops.&lt;/p&gt;
&lt;p&gt;More generally, it was fun to note that by putting a fairly high-level
functional test on the batch-processing backend, I discovered a bug
several levels down in my software stack -- a problem lying between a
third-party package and a system utility.  Unit tests wouldn't have
found this bug, unless the third-party package had them (don't think
so) &lt;em&gt;and&lt;/em&gt; I was running the third-party package unit tests (good
grief...)&lt;/p&gt;
&lt;p&gt;OK, back to work.&lt;/p&gt;
&lt;p&gt;--titus&lt;/p&gt;
&lt;/div&gt;</description>
	<pubDate>Sun, 20 Apr 2008 20:03:05 +0000</pubDate>
</item>
<item>
	<title>Titus Brown: Threading and subprocess</title>
	<guid>http://ivory.idyll.org/blog/2008/04/19/threading-and-subprocess</guid>
	<link>http://ivory.idyll.org/blog/apr-08/threading-and-subprocess</link>
	<description>&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;I'm having a long-running discussion with some people about threading
and why using threads with simple subprocess calls is almost certainly an
overcomplicated (== BAD) use of threads.  Everyone seems to think I'm
wrong (at least, there's either deafening silence or straight out argument ;)
and I think I finally figured out why.&lt;/p&gt;
&lt;p&gt;The task at hand: use subprocess to run some command (say, 'ping') a
bunch of times.  Because the command is I/O bound, you want to run the
commands in parallel.  Should you use threads to do this?  Is it necessary
in order to achieve good performance?&lt;/p&gt;
&lt;p&gt;Well, consider these two examples ('common.py' is down at the bottom;
it just contains the list of IP addresses to ping, and a function to
call subprocess.Popen).&lt;/p&gt;
&lt;p&gt;nothread.py:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
from common import IP_LIST, do_ping

z = []
for i in range(0, len(IP_LIST)):
   p = do_ping(IP_LIST[i])
   z.append(p)

for p in z:
   p.wait()
&lt;/pre&gt;
&lt;p&gt;thread.py:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
import threading
from common import IP_LIST, do_ping

def run_do_ping(addr):
   p = do_ping(addr)
   p.wait()

###

# start all threads
z = []
for i in range(0, len(IP_LIST)):
   t = threading.Thread(target=run_do_ping, args=(IP_LIST[i],))
   t.start()
   z.append(t)

# wait for all threads to finish
for t in z:
   t.join()
&lt;/pre&gt;
&lt;p&gt;Both of these work fine, and in both cases are easily modifiable to
retrieve the output, exit status, etc. of the ping command.  (In the
threaded example you have to keep track of 'p' in 'run_do_ping' to
retrieve this kind of info, and I wanted to keep things as simple as
possible.)&lt;/p&gt;
&lt;p&gt;They also run in about the same amount of time, although the non-threaded
one is quicker by a few milliseconds for me.  I think this is because
thread starts &amp;amp; joins are extra overhead.&lt;/p&gt;
&lt;p&gt;The key misunderstanding in the discussion seems to have been that the
examples at hand were using subprocess.call, which &lt;strong&gt;blocks&lt;/strong&gt;
waiting for the subprocess to exit, i.e. equivalent to
using this code in nothread.py:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
for i in range(0, len(IP_LIST)):
   p = do_ping(IP_LIST[i])
   p.wait()
&lt;/pre&gt;
&lt;p&gt;Here the pings would execute serially rather than in parallel, with
the obvious performance problem :).  However, you can bypass this
effect of subprocess.call by using subprocess.Popen, which creates a
new process that executes in parallel with the calling process.&lt;/p&gt;
&lt;p&gt;So, for this simple use of subprocess -- running a shell command and
gathering the output -- which is &amp;quot;better&amp;quot;?  I think 'nothread.py' is
better because it is simpler, shorter, clearer, and less complicated.
Of course, as soon as you start doing more complicated stuff like
reading the streams of information coming out of the subprocess
commands, the threaded version may well have its advantages.  But
that's not the case here, I think.&lt;/p&gt;
&lt;p&gt;Comments welcome.&lt;/p&gt;
&lt;p&gt;--titus&lt;/p&gt;
&lt;p&gt;common.py:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
import subprocess

IP_LIST = [ '131.215.17.3',
            '131.215.17.4',
            '131.215.17.5',
            '131.215.17.16',
            '131.215.17.17',
            '131.215.17.18',
            '131.215.17.19',
            '131.215.17.24',
            '131.215.17.25',
            '131.215.17.31']

cmd_stub = 'ping -c 5 %s'

def do_ping(addr):
    cmd = cmd_stub % (addr,)
    return subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
&lt;/pre&gt;
&lt;/div&gt;</description>
	<pubDate>Sat, 19 Apr 2008 08:14:46 +0000</pubDate>
</item>
<item>
	<title>OpenOpt (Dmitrey Kroshko): paypal does not allow payments to Ukraine</title>
	<guid>tag:blogger.com,1999:blog-6210259640013469958.post-3371536805870043851</guid>
	<link>http://openopt.blogspot.com/2008/03/paypal-does-not-allow-payments-to.html</link>
	<description>I have been informed that paypal link from OO page refuses to make donation to OpenOpt, because paypal does not allow payments to Ukraine. So I will try to find another approach. Ideas or leads are very welcome.&lt;br /&gt;&lt;span&gt;(Last edit: 2008/04/16 09:39 by Dmitrey)&lt;/span&gt;</description>
	<pubDate>Wed, 16 Apr 2008 00:40:58 +0000</pubDate>
	<author>noreply@blogger.com (Dmitrey)</author>
</item>
<item>
	<title>Titus Brown: Some new terminology?</title>
	<guid>http://ivory.idyll.org/blog/2008/04/15/new-terminology</guid>
	<link>http://ivory.idyll.org/blog/apr-08/new-terminology</link>
	<description>&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;In some discussions with a moderately new Python programmer who seems
to value complexity over simplicity, I may have coined a new term:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
&amp;quot;Penis size&amp;quot; style of programming -- the (mistaken) belief that the
more advanced programming language features you use, the more
impressive your code will look.
&lt;/pre&gt;
&lt;p&gt;I think it's a fair generalization to say that experienced programmers
value simplicity over complexity, all other things being equal.&lt;/p&gt;
&lt;p&gt;A search for &amp;quot;penis size programming&amp;quot; came up with &lt;a class=&quot;reference&quot; href=&quot;http://freewareapp.com/penis-size-o-matic_download/&quot;&gt;this link&lt;/a&gt;, which is
entertainingly apropos.&lt;/p&gt;
&lt;p&gt;--titus&lt;/p&gt;
&lt;p&gt;p.s. I originally used &amp;quot;dick size&amp;quot;, but now that I'm a professor, I have to
be decorous, right?&lt;/p&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 15 Apr 2008 18:03:06 +0000</pubDate>
</item>
<item>
	<title>Ga&amp;#235;l Varoquaux: Of packaging, installation and dependencies</title>
	<guid>http://gael-varoquaux.info/blog/?p=28</guid>
	<link>http://gael-varoquaux.info/blog/?p=28</link>
	<description>&lt;p&gt;I have been struggling for the last few days trying to understand the issues behind packaging and installing the Enthought Tool Suite. I think have been making progress, though only in my head, no actual code or packages so far are terribly satisfying.&lt;/p&gt;
&lt;h1&gt;The problem&lt;/h1&gt;
&lt;p&gt;If you are developing a Python-only program, with only dependencies on the standard library, you have no problems with packaging. You can ship tarballs, MSi installer, eggs, &amp;#8230; all this works.&lt;/p&gt;
&lt;p&gt;However, if you want to develop a rich program that provides many features in a closely integrated and consistent way to the user, you will have to depend on external packages. I know that many projects work around this by including the external dependencies inside the project, or simply reinventing the wheel. Well this does not scale. We cannot expect to develop a major scientific tool and community this way. Reuse is the key to scalability, in my opinion. Thus comes the problem, how to we ship our program?&lt;/p&gt;
&lt;p&gt;The problem can be very well seen with the &lt;a href=&quot;http://code.enthought.com/ets/&quot;&gt;Enthought Tool Suite&lt;/a&gt; (ETS). The ETS is a suite of many different packages, all pretty much geared towards building &lt;strong&gt;interactive&lt;/strong&gt; scientific application. In house, Enthought, the company (disclaimer: I do not work for Enthought) uses these packages to develop domain-specific applications for customers. They have broken up the suite in a set of small packages, to enable assembling applications by requiring only the features you need. This is important because if you want to use ETS&amp;#8217;s 3D plotting package (TVTK or Mayavi), but you want to stick with MatPlotLib to do 2D plotting, and not use Chaco, you should be able to download only what you need.&lt;/p&gt;
&lt;p&gt;As a result the ETS is made of a set of interdependent packages. Maybe they went a bit too far in the modularity, and there are almost 50 packages. The dependency graph looks like this:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://gael-varoquaux.info/blog/wp-content/uploads/2008/04/ets_deps1.png&quot;&gt;&lt;img class=&quot;aligncenter size-thumbnail wp-image-30&quot; title=&quot;ETS dependency graph&quot; src=&quot;http://gael-varoquaux.info/blog/wp-content/uploads/2008/04/ets_deps1.png&quot; alt=&quot;&quot; width=&quot;1024&quot; height=&quot;156&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Just to reassure you, the next version of the ETS has a much reduced number of packages, just because some packages where grouped, and the dependency graph indeed is sane:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://gael-varoquaux.info/blog/wp-content/uploads/2008/04/ets3_deps.png&quot;&gt;&lt;img class=&quot;aligncenter size-medium wp-image-32&quot; title=&quot;ETS3 dependency graph&quot; src=&quot;http://gael-varoquaux.info/blog/wp-content/uploads/2008/04/ets3_deps.png&quot; alt=&quot;&quot; width=&quot;1024&quot; height=&quot;315&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As you can see, there is a complex dependency graph. So how do you ship this to the user? Another problem that should not be underestimated is: how do you make it easy for people who distribute your projects to package this?&lt;/p&gt;
&lt;h1&gt;Setuptools&lt;/h1&gt;
&lt;p&gt;Python has no good answer for this problem, but &lt;a href=&quot;http://peak.telecommunity.com/DevCenter/setuptools&quot;&gt;setuptools&lt;/a&gt; do go part of the way. Dependencies in the ETS are declared using setuptools, and installing the ETS strongly relies on setuptools.&lt;/p&gt;
&lt;p&gt;Setuptools provides a way of automatically downloading dependencies. However, it is not a full packaging system replacement. The reason I say this is that it does not have the knowledge of a dependency graph, it just downloads packages, introspects them to find their dependencies, and recursively tries to satisfy them by downloading more. Phillip J. Eby (the author of setuptools) has been quite clear that he does not want to write an APT replacement, tough people keep getting it wrong and making the equation &amp;#8220;easy_install = apt for Python&amp;#8221; (IMHO this is due to bad communication on setuptools webpage).&lt;/p&gt;
&lt;p&gt;Moreover, setuptools does not provide an easy to use API to extract all the information it has about packages, dependencies, and download URLs. It is thus not trivial to plug packages shipped with  setuptools in an other package manager like rpm or apt. This is why bothers me most, because this is strongly limiting the exposure the ETS is getting in distributions (whether they be Linux distributions, or scientific computing &amp;#8220;superpacks&amp;#8221;). Recently I have had discussions with somebody on how to ship Mayavi in a monolithic distribution he has developed. He agreed to ship setuptools with the distribution, so now I need to give him a list of eggs to provide. There is no obvious way to get this list using setuptools (insert here big big rant). So I thought that an option was to install Mayavi in a virtual environment to trac the eggs added, and use this information. However, this person&amp;#8217;s internet access was possible only by login on dumbed-down servers for security reasons. So we hit a wall. And for me this wall is a wall we keep hitting with setuptools: setuptools does everything for you, the download, the building the install. It does have flags to control these processes, but it does not expose the information you need to do this without using it. I actually think the reason it does not expose this information is that it does not know it a priori. Looking at the code it does seem so. In addition, the structure of the packages make it hard to do.&lt;/p&gt;
&lt;h1&gt;From packages to repositories&lt;/h1&gt;
&lt;p&gt;On the other side, Dave Peterson, at Enthought, has been working on a tool to allow checking out of the ETS SVN only the projects you are interested in. I played a bit with it, and modified it to generate the dependency graphs. I quickly found out that I actually like this tool much more than setuptools, even though it was pretty much using the same concepts. It took me a while to understand what I like about the tool. It is that it uses a map file to gather all the package and dependency information. As a result, it has the equivalent of a dependency graph. This makes it possible to do the operations I am interested in, eg listing all the packages required for installing a given project without actually downloading them.&lt;/p&gt;
&lt;p&gt;The reason this is possible is that with the ETS we are not dealing with an open set of packages, like PyPI, in which packages can come and go, and no consistency is enforced. We are dealing with one suite of multiple projects that are made to work with each other. The base entity is thus a project set, on which we can make a &amp;#8220;project map&amp;#8221;.&lt;/p&gt;
&lt;p&gt;What Dave has done works fantastically for development, I would like to push it further for distribution. What we expose to the user can now be a repository, in the sens of APT: a set of packages with consistent inter-dependencies, and a way of retrieving easily this information. The difference between the two, and the implications of the difference, is not something I had clearly in my mind in the beginning, but it is becoming clearer that having a repository with a project map gives a lot of added value for distributing. I&amp;#8217;ll see if I can reuse Dave&amp;#8217;s work to build such a tool, but do not hold your breath, I am not willingly in the business of packaging, and will probably not spend enough time on this to make it a good tool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt;: Correct Phillip&amp;#8217;s name.&lt;/p&gt;</description>
	<pubDate>Sat, 12 Apr 2008 14:52:47 +0000</pubDate>
</item>
<item>
	<title>Matthieu Brucher: Book review: Advanced Computer Architecture and Parallel Processing</title>
	<guid>http://matt.eifelle.com/?p=62</guid>
	<link>http://matt.eifelle.com/2008/04/11/book-review-advanced-computer-architecture-and-parallel-processing/</link>
	<description>&lt;p&gt;This is my first review. I read this book some time ago but I still want to write about it because the topic is very interesting.&lt;/p&gt;
&lt;h4&gt;Content and opinions&lt;/h4&gt;
&lt;p&gt;The main matter of this book is not about how to write parallel applications, but more on what underlying architecture is interesting for those applications.&lt;/p&gt;
&lt;p&gt;First, the reader is introduced with some vocabulary about parallelism (SIMD, MIMD, &amp;#8230;) and their impact on applications. Then, interconnections between processors is introduced. In every current parallel application, communication between processors has a big impact at different scale: when more processors are added to the cluster, how the application is distributed, &amp;#8230; Several chapters are discussing the issues that users will face.&lt;/p&gt;
&lt;p&gt;Once the processors are connected, the different process that are executed need to use a way of communicating: they share some memory or they post messages to each other. Each model has its advantages and drawbacks. They are described in two complete chapters.&lt;/p&gt;
&lt;p&gt;These architectures solve problems. The reader is introduced with the concept of abstract model. The underlying assumption is that problem that cannot be parallelly solved on the abstract model cannot be solved with shared memory or message passing architecture. This part is also abstract in its content and is perhaps the hardest part to understand in the book. I agree that mastering the abstract model will ease the pain of design the application, because it would have been split into parallel chunks first, but there is some overhead with using this model.&lt;/p&gt;
&lt;p&gt;A complete chapter is dedicated to the &lt;em&gt;Message Passing Interface&lt;/em&gt;, MPI. This is a standard that is widely used, and this chapter is perhaps the closest to programming issues (there is some code !). The C implementation is exposed (not the C++ or Fortran&amp;#8217;s interface) in a reference-manual way.&lt;/p&gt;
&lt;p&gt;The last chapter is about scheduling. This is a very difficult topic that is not introduced in a lot of books. It is a difficult field (an NP-complete problem), and this is hidden in a lot of explanations. Here, the reader has a complete introduction on the topic and can benefit from his reading when he has a lot of paralel task to do.&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;The topics covered by this book are very pragmatic. Each programmer should read it so that he can understand the issues with communication in a parallel application. The main reason why parallel applications are not so widely spread is : hardware intercommunication does not scale very well, but solutions are finally starting to be available. As a conclusion, I think this book should be in every university library, not on your own one, because it is still very expensive.&lt;/p&gt;
&lt;div class=&quot;subcolumns&quot;&gt;
&lt;div&gt;
&lt;div&gt;
		&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0471467405/masbl03-20&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51DSP5YCBJL._SL75_.jpg&quot; width=&quot;47&quot; height=&quot;75&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
	&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0471467405/masbl03-20&quot; target=&quot;_blank&quot;&gt;Advanced Computer Architecture and Parallel Processing (Wiley Series on Parallel and Distributed Computing)&lt;/a&gt; (Hardcover)&lt;br /&gt;
		&lt;span&gt;by &lt;strong&gt;Hesham El-Rewini, Mostafa Abd-El-Barr&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
		ISBN: 0471467405&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Price:&lt;/strong&gt; &lt;span&gt;USD 118.50&lt;/span&gt;&lt;br /&gt;
		27 deals available from &lt;span&gt;USD 58.94&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;		 (0 reviews)
	&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;subcolumns&quot;&gt;
&lt;div&gt;
&lt;div&gt;
		&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B000W6HIMK/masbl03-20&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/51ZdZRd-2xL._SL75_.jpg&quot; width=&quot;47&quot; height=&quot;75&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
	&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/B000W6HIMK/masbl03-20&quot; target=&quot;_blank&quot;&gt;Advanced Computer Architecture and Parallel Processing (Wiley Series on Parallel and Distributed Computing)&lt;/a&gt; (Kindle Edition)&lt;br /&gt;
		&lt;span&gt;by &lt;strong&gt;Hesham El-Rewini, Mostafa Abd-El-Barr&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
		ISBN: &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Price:&lt;/strong&gt; &lt;span&gt;USD 89.20&lt;/span&gt;&lt;br /&gt;
		1 deals available from &lt;span&gt;USD 89.20&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;		 (0 reviews)
	&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
	<pubDate>Fri, 11 Apr 2008 08:48:54 +0000</pubDate>
</item>
<item>
	<title>Titus Brown: Google Highly Open Participaton Contest -- another notch in the source code!</title>
	<guid>http://ivory.idyll.org/blog/2008/04/09/ghop-scores-again</guid>
	<link>http://ivory.idyll.org/blog/apr-08/ghop-scores-again</link>
	<description>&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;Pavel Vinogradov &amp;lt;fastnix&amp;gt; has been keeping me updated on an issue he
discovered while testing &lt;a class=&quot;reference&quot; href=&quot;http://goog-perftools.sourceforge.net/doc/tcmalloc.html&quot;&gt;TCMalloc&lt;/a&gt; with
Python as a Google Highly Open Participation (GHOP) task, &lt;a class=&quot;reference&quot; href=&quot;http://code.google.com/p/google-highly-open-participation-psf/issues/detail?id=105&quot;&gt;task 105&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Briefly, Pavel discovered a situation in which replacing the Python
memory allocator with TCMalloc resulted in really bad performance.
The latest is that there appears to be a bug or gotcha in TCMalloc
with glibc, where TCMalloc does a poor job in cases where mremap can
be used by glibc.  The TCMalloc folk are going to look into it more, I
gather.  (See google-perftools thread &lt;a class=&quot;reference&quot; href=&quot;http://groups.google.com/group/google-perftools/browse_thread/thread/4cc0f545c25caecc&quot;&gt;here&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Anyway, this was a situation where we just threw the task at the
students to see if anything interesting would pop out -- not expecting
much of anything other than a learning experience for the student --
and yet through some simple-yet-dogged testing, Pavel really
contributed something.&lt;/p&gt;
&lt;p&gt;Awesome stuff!&lt;/p&gt;
&lt;p&gt;There have been several real success stories to GHOP.  I need to write them
down, sigh... my kingdom for some time :)&lt;/p&gt;
&lt;p&gt;--titus&lt;/p&gt;
&lt;/div&gt;</description>
	<pubDate>Wed, 09 Apr 2008 07:08:11 +0000</pubDate>
</item>
<item>
	<title>Matthieu Brucher: Parallel computing in large-scale applications</title>
	<guid>http://matt.eifelle.com/?p=58</guid>
	<link>http://matt.eifelle.com/2008/04/08/parallel-computing-in-large-scale-application/</link>
	<description>&lt;p&gt;In March 2008 issue, IEEE Computers published &lt;a href=&quot;http://dx.doi.org/10.1109/MC.2008.101&quot;&gt;a case study on large-scale parallel scientific code development&lt;/a&gt;. I&amp;#8217;d like to comment this article, a very good one in my mind.&lt;/p&gt;
&lt;p&gt;Five research centers were analyzed, or more precisely their development tool and process. Each center did a research in a peculiar domain, but they seem share some Computational Fluid Dynamics basis.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-58&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;What technologies are used ?&lt;/h3&gt;
&lt;p&gt;Although the centers are very different, they use a common set of technologies :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt; The core langages are C/C++ or Fortran, and there is no surprise there, as these languages are portable accross platforms (if used correctly) and can be very fast, thanks to the evolution of the compilers.&lt;/li&gt;
&lt;li&gt;MPI is the glue used between processors, and nothing else (like OpenMP). This can be surprising, but using only one tool and the most generic one is to be expected. Too many tools for the same application leads to tensions between programmers and inside the different modules. With only MPI, programmers must rely on the implementation of the MPI library to optimize communication between processors that share memory, but it means that the programmers have more time tuning the application (a big issue in scientific code).&lt;/li&gt;
&lt;li&gt;For such large applications, everything must be modular, and even can be run separately. This enables teams to work only on part of the application.&lt;/li&gt;
&lt;li&gt;Version control is integrated into the developement, with either CVS or Subversion. There are no automatic tests prior or after the commits. The fact that there are tests (unit, integration, &amp;#8230;) must one of the reasons these applications are still updated, upgraded and holding up over the years. Students are trained to test their code (I often see code that isn&amp;#8217;t tested in research labs, even if tests would have caught a lot of &amp;#8220;stupid&amp;#8221; errors) in several ways, one does not test scientific code as a standard code.&lt;/li&gt;
&lt;li&gt;Every project uses well-known libraries like BLAS, LAPACK, the usual I/O, &amp;#8230;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Whereas Computer Science (CS) students are taught how to write an application in an efficient way (robust but rapidly written), Scientific Computing (SC) students must develop fast algorithms in a short time. This is needed because parallel computation is used when a serial computation would take too much time, but even parallelized, these computations can take several hours or days.&lt;/p&gt;
&lt;p&gt;Having a prototype is great, but it only is half the job. Once you have a prototype, you can test it, tune it if needed, and then it must be parallelized (sometimes it is parallelized during prototyping; I tend to think that parallel code must be introduced after a first draft, but it doesn&amp;#8217;t mean that I didn&amp;#8217;t think about how to parallelize my code). At this point, it is not sure that the code executes well on several dozens of processors, but it can be tested on a small farm (talking about farms, one great thing about Subversion is that it can trigger actions, like &lt;a href=&quot;http://buildbot.net/&quot;&gt;building and testing code on a farm&lt;/a&gt;, this is a must have).&lt;/p&gt;
&lt;p&gt;It seems that none of these centers have found a correct parallel debugger for their application. Even for a multithread program on a simple computer, mastering the debugger and then debugging the code is hard. A lot of manpower will have to be put in this domain&amp;#8230;&lt;/p&gt;
&lt;h3&gt;What technologies could also be used ?&lt;/h3&gt;
&lt;p&gt;Here are some of my thoughts about what could be used to enhance the quality of such an application, some of them are already used in some of these centers (so it is not completely crazy to express them here) :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A compilation and testing farm should always be set up. These centers use a lot of different computers and plateforms, using a farm allows the use of different slaves to build and test the application almost everywhere.&lt;/li&gt;
&lt;li&gt;The application should be steered by a so-called high level language, like Python. Every module can really be separated and wrapped in a cross-platform way. One team used Python for a Fortran bridge, but they abandoned the idea. This is sad because with Numpy, there is a nice cross-platform tool that works really well For wrapping Fortran code. For C and C++, a lot of tools exist for this bridge (SWIG, my favorite, Boost.Python, &amp;#8230;).&lt;/li&gt;
&lt;li&gt;Using Python as a link between modules can help with the debugging as well. If there is a problem somewhere, the state of the application can be easilly saved and restored to debug the issue. This is not always possible, but for reproductible bugs (they are the simplest one, I agree, not-reproductible bugs are much more annoying), it can help a lot.&lt;/li&gt;
&lt;li&gt;Sometimes, one node of the cluster can fail. In a long computation this means a lot of wasted time. A more robust message-passing tool could be used, but I&amp;#8217;ve failed to find the adequate one for the moment. &lt;a href=&quot;http://ipython.scipy.org/moin/IPython1/&quot;&gt;IPython1&lt;/a&gt; may be a first clue toward the solution.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I do not pretend to know the truth with my comments; these applications are developed for a very long time, far longer than my own development experience, and thus I&amp;#8217;m not in the position of knowing better than the people working on them (if one of them is reading this post, I&amp;#8217;d like to congratulate her/him for the hard work). But I think that sometimes a new look at a problem may solve it, and Python may be an efficient tool for these applications, leading to even better scientific applications.&lt;/p&gt;</description>
	<pubDate>Tue, 08 Apr 2008 07:45:38 +0000</pubDate>
</item>
<item>
	<title>Titus Brown: Google's AppEngine OneThousand</title>
	<guid>http://ivory.idyll.org/blog/2008/04/08/freezing-your-ass-off-at-google-with-leslie-and-guido</guid>
	<link>http://ivory.idyll.org/blog/apr-08/freezing-your-ass-off-at-google-with-leslie-and-guido</link>
	<description>&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;At Google Campfire One, v 2.0 -- introducing AppEngine.&lt;/p&gt;
&lt;p&gt;IT'S FREEZING.  The cider ran out.  Brr.&lt;/p&gt;
&lt;p&gt;Deploying Web apps is annoyingly difficult.  Technical hurdles, etc.
Need machines.  Blech.  Costly.&lt;/p&gt;
&lt;p&gt;AppEngine solves all these problems.  Runs web apps, handles app lifecycles,
apps are run on Google infrastructure can make use of GFS, auth etc. etc. etc.&lt;/p&gt;
&lt;p&gt;Components&lt;/p&gt;
&lt;ol class=&quot;arabic simple&quot;&gt;
&lt;li&gt;Scalable serving infrastructure&lt;/li&gt;
&lt;li&gt;Python runtime&lt;/li&gt;
&lt;li&gt;Soft Dev Kit&lt;/li&gt;
&lt;li&gt;Web-based admin console&lt;/li&gt;
&lt;li&gt;Data&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Config is in YAML, with mapping done by regexp.&lt;/p&gt;
&lt;p&gt;from google.appengine.ext import webapp, looks like Java to me.&lt;/p&gt;
&lt;p&gt;Naah, that was mean.  It's python.&lt;/p&gt;
&lt;p&gt;Oooh, WSGI built in.&lt;/p&gt;
&lt;p&gt;def get, def post -- looks like web.py.  why do people do that?&lt;/p&gt;
&lt;p&gt;Using introspection, building SQL-like GQL, to drop stuff into/suck
stuff out of database with proper names.&lt;/p&gt;
&lt;p&gt;Django templates.&lt;/p&gt;
&lt;p&gt;Single-command deployment.&lt;/p&gt;
&lt;p&gt;Scalable serving infrastructure: when app pushed, pushed to multiple fault
tolerant servers.  Any one may fail, but request will always go through.
THE ROADS MUST ROLL.&lt;/p&gt;
&lt;p&gt;All Python runtime and many third-party libraries available.  (How do they
deal with security?  What about SQL and ORMs?)&lt;/p&gt;
&lt;p&gt;SDK: releasing for Linux etc.&lt;/p&gt;
&lt;p&gt;Web-based admin console.  Standard stuff, stats collected in
&amp;quot;near-real time&amp;quot;.&lt;/p&gt;
&lt;p&gt;Data store.  BigTable. Yah.  Horizontally distributed fault-tolerant system.&lt;/p&gt;
&lt;p&gt;No joins in GQL?!  Rationale: joins may need to work across computers and
individual ram capacity.&lt;/p&gt;
&lt;p&gt;Send e-mail, make HTTP reqs, auth with Google accounts, use a variety of
frameworks.&lt;/p&gt;
&lt;p&gt;Went to get cider, they replenished.  There are also meatballs wrapped in
dough (!?!)  It is still FREEZING.&lt;/p&gt;
&lt;p&gt;Guido gets up.  He's on the AppEngine team.&lt;/p&gt;
&lt;p&gt;All about making tools for developers.  But hates root password.  Thinks
AppEngine solves this.&lt;/p&gt;
&lt;p&gt;&amp;quot;First time Google lets other people run stuff on their servers.&amp;quot;&lt;/p&gt;
&lt;p&gt;Isn't this a support nightmare?  Software versions etc??  Well, can upload
your own frameworks.&lt;/p&gt;
&lt;p&gt;Stdlib emasculated in three ways: writing to the file system is forebidden;
cannot talk directly to the network (urlfetch &amp;amp; mail sending API); no
threads (chuckle, I think GvR not so secretly hates threads).&lt;/p&gt;
&lt;p&gt;Python is not the only language (you heard it from Guido).  Perl?  COBOL?
Assembly?&lt;/p&gt;
&lt;p&gt;Stuff about admin infrastructure.&lt;/p&gt;
&lt;p&gt;Lots of nice error logging/tracking stuff.&lt;/p&gt;
&lt;p&gt;Data viewer.  Interactive query.  Nifty.  (Hmm, how do you upload bulks of
data??)&lt;/p&gt;
&lt;p&gt;Version control built in. Yay.&lt;/p&gt;
&lt;p&gt;Is testing built in???&lt;/p&gt;
&lt;p&gt;Adding a domain...&lt;/p&gt;
&lt;p&gt;Host limits: 5mn page views a month for a well written application is free.&lt;/p&gt;
&lt;p&gt;Over and out.  I'm freezing.  Still.&lt;/p&gt;
&lt;p&gt;--titus&lt;/p&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 08 Apr 2008 07:23:03 +0000</pubDate>
</item>
<item>
	<title>Ga&amp;#235;l Varoquaux: Objects, modules and Traits and Envisage</title>
	<guid>http://gael-varoquaux.info/blog/?p=27</guid>
	<link>http://gael-varoquaux.info/blog/?p=27</link>
	<description>&lt;p&gt;I have been reading an article about a new language paradigm (&lt;a href=&quot;http://users.encs.concordia.ca/~grogono/Erasmus/E01.pdf&quot;&gt;Erasmus, a modular language for concurrent programming&lt;/a&gt;). The authors discuss the limitations of objects in terms of modularity. To sum up their point (and most probably distort it completely), the limitations with objects comes from the fact that you can&amp;#8217;t be sure what is modifying what: suppose you have a method &lt;em&gt;foo&lt;/em&gt; of an object &lt;em&gt;bar&lt;/em&gt; that you call in a method of an object &lt;em&gt;baz&lt;/em&gt;, you cannot be sure that this method hasn&amp;#8217;t modified private attributes of your object &lt;em&gt;baz&lt;/em&gt;, as &lt;em&gt;foo&lt;/em&gt; could have called a method of your object. This does happen in large code bases. Of course, best practice tries to reduce this to a minimum, but this reduces modularity, and thus limits both code reuse and concurrency (as side effects are not well controlled).&lt;/p&gt;
&lt;p&gt;Erasmus&amp;#8217;s solution to is adopt a new container, that they call modules rather than objects, and that are based on message passing rather than method calls. These modules live in separate processes and can themselves be made of more conventional code (I am extrapolating a bit from the original article here).&lt;/p&gt;
&lt;p&gt;This strikes me as being related to a pattern that I see more  and more in my code that uses Traits. The objects deriving from HasTraits have a very easy and cheap way of coupling callbacks to the modification of their attributes. This induces a programming style know as reactive programming that is entirely callback-driven. In addition, this is a nice way of ensuring that the internal state of an object is always consistent. This is a first step to message passing and decoupling: you no longer call methods, you just set attributes and let the object do the rest. The limitation of this model in a large code base is that you have to carry around references to the objects you are interested about, and their attributes. Traits has patterns to help you do this (delegation, namely), but it is still a limitation.&lt;/p&gt;
&lt;p&gt;This is where the &lt;a href=&quot;https://svn.enthought.com/enthought/wiki/EnvisageThree&quot;&gt;Envisage framework&lt;/a&gt; comes into play. Envisage introduces the notion of plugins which provide extension points. These extension points are special traits attributes that are published in a registry (which can be application-wide, or not, in Envisage3). You can query the registry to retrieve these extension points and contribute to them. After that, the traits callback mechanism triggers an action in the plugin contributing the extension point.&lt;/p&gt;
&lt;p&gt;This contribution mechanism could be based on message passing between processes quite easily (although for GUIs it breaks down, because AFAIK you cannot assemble a consistent GUI from different widgets living in different process space, without using some Xwindows-specific tricks). Of course this does not give me hard guaranties of decoupling and control of the side-effects, as a call to a plugin can induce calls to other plugins inside it. This is where best practice comes along: core plugins should be able to run and provide their basic functionality outside of Envisage, as normal objects. Envisage should only be a thin wrapper allowing them to expose this functionality and extend other plugins. This is introducing a distinction between objects and method calls, that do not need to be arranged in self-consistent entities and which you use very often , and plugins and extensions contribution, that form standalone entities and should be used more sparsely.&lt;/p&gt;
&lt;p&gt;Of course Envisage cannot go too far in terms of providing guaranties for decoupling. It gives a mechanism, best practices, could even help plugin decoupling by having them live in different processes, but as long as it does not enforce rules in the semantics of the language, it cannot achieve what projects like Erasmus are trying to do. I however think it is good to have a look at the work done in these projects to see what we can learn.&lt;/p&gt;
&lt;p&gt;PS: Web apps suck! I made a few sortcut mystakes under wordpress, wanted to undo them and hit &amp;#8220;Ctrl-R&amp;#8221;, which is &amp;#8220;redo&amp;#8221; under vim, and lost all my post. I strongly &lt;strong&gt;don&amp;#8217;t &lt;/strong&gt;believe in web apps, amongst other things because they don&amp;#8217;t allow me to use vim.&lt;/p&gt;</description>
	<pubDate>Sat, 05 Apr 2008 12:19:56 +0000</pubDate>
</item>
<item>
	<title>Titus Brown: 2008 Summer Internship at Disney Animation</title>
	<guid>http://ivory.idyll.org/blog/2008/04/04/disney-intern</guid>
	<link>http://ivory.idyll.org/blog/apr-08/disney-intern</link>
	<description>&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;Please send this on to anyone who might be interested...&lt;/p&gt;
&lt;hr class=&quot;docutils&quot; /&gt;
&lt;p&gt;Disney Animation has an opening for a summer intern to work on a testing
project under the supervision of Paul Hildebrandt and Dr. C. Titus Brown.  The
ideal candidate will have experience with a dynamic language supporting
introspection (Python preferred) as well as experience developing unit,
functional, and regression tests, but the ability to learn quickly is the only
requirement.  The work will consist of building a new testing tool for aiding
test automation on large existing code bases.  We expect to release the tool
under an Open Source license.&lt;/p&gt;
&lt;p&gt;Please send your CV and a short personal statement to
&lt;a class=&quot;reference&quot; href=&quot;mailto:da-testing-2008&amp;#64;idyll.org&quot;&gt;da-testing-2008&amp;#64;idyll.org&lt;/a&gt;, c/o Paul Hildebrandt and C. Titus Brown.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;BA/BS requested, MA or PhD in-progress desired.&lt;/li&gt;
&lt;li&gt;Housing stipend provided; competitive hourly wage.&lt;/li&gt;
&lt;li&gt;2 months commitment minimum, 3 months preferred.&lt;/li&gt;
&lt;li&gt;Opportunity for follow-on work or continued employment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Disney Animation is located in Burbank, CA.&lt;/p&gt;
&lt;hr class=&quot;docutils&quot; /&gt;
&lt;p&gt;I'll post what I can of the specific project proposal when I have a cleaner version.&lt;/p&gt;
&lt;p&gt;--titus&lt;/p&gt;
&lt;/div&gt;</description>
	<pubDate>Sat, 05 Apr 2008 00:35:29 +0000</pubDate>
</item>
<item>
	<title>Matthieu Brucher: Dimensionality reduction: similarities graph and its use</title>
	<guid>http://matt.eifelle.com/2008/04/04/dimensionality-reduction-similarities-graph-and-its-use/</guid>
	<link>http://matt.eifelle.com/2008/04/04/dimensionality-reduction-similarities-graph-and-its-use/</link>
	<description>&lt;p&gt;Some of the widely used method are based on a similarity graph made with the local structure. For instance &lt;a href=&quot;http://matt.eifelle.com/2008/02/18/dimensionality-reduction-locally-linear-embedding/&quot;&gt;LLE&lt;/a&gt; uses the relative distances, which is related to similarities. Using similarities allows the use of sparse techniques. Indeed, a lot of points are not similar, and then the similarities matrix is sparse. This also means that a lot of manifold can be reduced with these techniques, but not with Isomap or the other geodesic-based techniques.&lt;/p&gt;
&lt;p&gt;It is worth mentioning that I only implemented Laplacian Eigenmaps with a sparse matrix, due to the lack of generalized eigensolver for sparse matrix, but it will be available in a short time, I hope.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-53&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://citeseer.ist.psu.edu/632472.html&quot;&gt;Laplacian Eigenmaps&lt;/a&gt; are the most known technique using the similarity graph (safe for LLE, which is nothing more than a special case of the Laplacian Eigenmaps). The similarities are computed between neighboors (neighboors meaning the samples that are near one from another in a distance way or samples that are close, like pixels in an image), generally with a Gaussian kernel. The trick here is to choose the correct width of the kernel. Then, the similarities matrix is weighted (each column and line must sum to one, this is the Laplacian of the graph) and then eigenvectors are extracted from it. The first eigenvalue is one and must not be used.&lt;/p&gt;
&lt;p&gt;Here is what I get :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://matt.eifelle.com/wp-content/uploads/2008/04/swissrollcoords2lem08nonoise00test.png&quot; title=&quot;Laplacian Eigenmaps compression of the Swissroll&quot;&gt;&lt;img src=&quot;http://matt.eifelle.com/wp-content/uploads/2008/04/swissrollcoords2lem08nonoise00test.thumbnail.png&quot; alt=&quot;Laplacian Eigenmaps compression of the Swissroll&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One may wonder why the reduction is so poor, but I&amp;#8217;m not &lt;a href=&quot;http://dx.doi.org/10.1109/TPAMI.2007.70735&quot;&gt;the only one&lt;/a&gt;  to get this result. I tried every width for the kernel to no avail. The literature says that Laplacian Eigenmaps tendto cluster points, which is easily explained by the algorithm. The eigenproblem extracts the main eigenvectors so that the weighted similarities matrix is preserved (in a quadratic way). This means that even if points should be close, if they are not close enough, they have a similarity of 0 so the eigenproblem will separate them.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dx.doi.org/10.1016/j.acha.2006.04.006&quot;&gt; Diffusion maps&lt;/a&gt; are another similarity graph technique. Although there is a Markovian/probabilistic interpretation, diffusion maps are basically Laplacian Eigenmaps with similarities computed between every pair of points. This means that they have the same drawbacks that Laplacian Eigenmaps except for the clustering. The width of the kernel is still difficult to estimate.&lt;/p&gt;
&lt;p&gt;Here is the result :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://matt.eifelle.com/wp-content/uploads/2008/04/swissrollcoords2dm08nonoise00test.png&quot; title=&quot;Diffusion map compression of the Swissroll&quot;&gt;&lt;img src=&quot;http://matt.eifelle.com/wp-content/uploads/2008/04/swissrollcoords2dm08nonoise00test.thumbnail.png&quot; alt=&quot;Diffusion map compression of the Swissroll&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The fact that every similarity is used explains the fact that diffusion maps cannot reduce the SwissRoll correctly. In this precise case, the kernel width was obviously too big, but smaller width gives a result similar to the Laplacian Eigenmaps, which is not correct either.&lt;/p&gt;
&lt;p&gt;The other technique I will present is &lt;a href=&quot;http://www.pnas.org/cgi/doi/10.1073/pnas.1031596100&quot;&gt;Hessian Eigenmaps&lt;/a&gt;. Instead of estimating the Laplacian of the similarities graph, it tries to estimate the Hessian. This gives very good result for the SwissRoll :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://matt.eifelle.com/wp-content/uploads/2008/04/swissrollcoords2hm08nonoise00test.png&quot; title=&quot;Hessian Eigenmaps compression of the Swissroll&quot;&gt;&lt;img src=&quot;http://matt.eifelle.com/wp-content/uploads/2008/04/swissrollcoords2hm08nonoise00test.thumbnail.png&quot; alt=&quot;Hessian Eigenmaps compression of the Swissroll&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately, the technique is not robust to noise, as I will show you in the result ticket. Safe for this fact, the technique is robust to holes in the manifold (not uniformly sampled manifolds for instance), which is one of the biggest drawback in techniques based on the geodesic distances.&lt;/p&gt;
&lt;p&gt;Stay tuned.&lt;/p&gt;</description>
	<pubDate>Fri, 04 Apr 2008 07:58:25 +0000</pubDate>
</item>
<item>
	<title>Enthought: PointIR - Multitouch with Python (PyCon 2008)</title>
	<guid>http://blog.enthought.com/?p=27</guid>
	<link>http://blog.enthought.com/?p=27</link>
	<description>I’ve just uploaded a video from Peter’s presentation about the multitouch prototype that he and Dave Kammeyer and Robert Kern have developed over the past few months.  It not only showcases what a few brilliant guys can pull off in their spare time, it shows the power of the open source tool stack that [...]</description>
	<pubDate>Thu, 03 Apr 2008 20:38:57 +0000</pubDate>
</item>
<item>
	<title>Matthieu Brucher: Dimensionality reduction: explicit optimization of a cost function</title>
	<guid>http://matt.eifelle.com/2008/04/02/dimensionality-reduction-explicit-optimization-of-a-cost-function/</guid>
	<link>http://matt.eifelle.com/2008/04/02/dimensionality-reduction-explicit-optimization-of-a-cost-function/</link>
	<description>&lt;p&gt;Analytical solutions to the dimensionality reduction problem are only possible for quadratic cost functions, like Isomap, LLE, Laplacian Eigenmaps, &amp;#8230; All these solutions are sensitive to outliers. The issue with the quadratic hypothesis is that there is no outilers, but on real manifolds, the noise is always there.&lt;/p&gt;
&lt;p&gt;Some cost functions have been proposed, also known as stress functions as they measure the difference between the estimated geodesic distance and the computed Euclidien distance in the &amp;#8220;feature&amp;#8221; space. Every metric MDS can be used as stress functions, here are some of them.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-39&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The oldest function is Sammon&amp;#8217;s NonLinear Mapping. Originally based on Euclidien distances, I implemented it with the approximated geodesic distances described in the &lt;a href=&quot;http://matt.eifelle.com/2008/01/25/dimensionality-reduction-isomap/&quot;&gt;Isomap ticket&lt;/a&gt;. The goal of this function is to add a weight (the inverse of the geodesic distance), leading to less weight for the greatest distances, but also an important weight for small distances.&lt;/p&gt;
&lt;p&gt;Here is the cost function for the distances (&lt;strong&gt;y&lt;/strong&gt; are the coordinates in the original space and &lt;strong&gt;x&lt;/strong&gt; in the feature/reduced  space) :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://matt.eifelle.com/wp-content/uploads/2008/03/ssam.png&quot; alt=&quot;Sammond’s cost function&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Optimizing this function with a conjugate-gradient descent from a random start can give this result :&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;Geodesic NonLinear Mapping compression of the Swissroll&quot; href=&quot;http://matt.eifelle.com/wp-content/uploads/2008/03/swissrollcoords2gnlm08nonoise00test.png&quot;&gt;&lt;img src=&quot;http://matt.eifelle.com/wp-content/uploads/2008/03/swissrollcoords2gnlm08nonoise00test.thumbnail.png&quot; alt=&quot;Geodesic NonLinear Mapping compression of the Swissroll&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another function that is present and cited in the litterature is Desmartines&amp;#8217; one from the Curvilinear Component Analysis :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://matt.eifelle.com/wp-content/uploads/2008/03/scca.png&quot; alt=&quot;CCA cost function&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The F() function is 1 when the argument is small (less than an arbitrary value lambda), and else 0.&lt;/p&gt;
&lt;p&gt;As a consequence, this function is not convex, not even continuous. The algorithm proposed in the associated paper is not great, I never managed to make it work on a SwissRoll, even with few points. So here are the step I use to optimize the function :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start from a random position&lt;/li&gt;
&lt;li&gt;Optimize 10 points (lambda infinite)&lt;/li&gt;
&lt;li&gt;Optimize one more point :
&lt;ul&gt;
&lt;li&gt;Move only this point with lambda infinite (gradient descent)&lt;/li&gt;
&lt;li&gt;Move every point with a decreasing lambda (I start with lambda = greatest geodesic distance in the data set and linearly decrease it until lambda is the limit of 5% of he smallest geodesic distances)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each time, the new point is moved according to every already placed point, then when every point is moving, only the local stresses are used. But the optimization can still go wrong and some points that should be close can end far one from another, because their associated stress is zero.&lt;/p&gt;
&lt;p&gt;Here is the result for this optimization :&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;CCA compression of the Swissroll&quot; href=&quot;http://matt.eifelle.com/wp-content/uploads/2008/04/swissrollcoords2cca08nonoise00test.png&quot;&gt;&lt;img src=&quot;http://matt.eifelle.com/wp-content/uploads/2008/04/swissrollcoords2cca08nonoise00test.thumbnail.png&quot; alt=&quot;CCA compression of the Swissroll&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The cost function I use is a robust one, not &amp;#8220;recursive&amp;#8221; as Desmartines qualifies it (the weight is not a function of the estimated distance as it is the case from the CCA cost function) :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://matt.eifelle.com/wp-content/uploads/2008/03/sp.png&quot; alt=&quot;Robust cost function&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The first term is the robust term, derivable when the (geodesic estimated and Euclidien computed) distances are equals, the second term allows for a fast convergence when the distances are not correctly estimated (useful at the beginning of the optimization, less afterwards) and the last term gives a small weight for small distances, as they can be polluted by noise for noisy manifolds. Gamma should only be a small value, Tau is set to be equal to 80% of the geodesic distances and sigma to 5%. This gives good results in every case.&lt;/p&gt;
&lt;p&gt;Here is the result with this cost function :&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;Robust compression of the SwissRoll&quot; href=&quot;http://matt.eifelle.com/wp-content/uploads/2008/03/swissrollcoords2cf08nonoise00test.png&quot;&gt;&lt;img src=&quot;http://matt.eifelle.com/wp-content/uploads/2008/03/swissrollcoords2cf08nonoise00test.thumbnail.png&quot; alt=&quot;Robust compression of the SwissRoll&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Its optimization is not easy as it can give folded reduced space as an answer. I proposed two algorithms to solve the issue :&lt;/p&gt;
&lt;p&gt;The first one :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Optimize every point
&lt;ul&gt;
&lt;li&gt;Add some noise to the computed coordinates depending on the global cost and the iteration (at the end, the added noise must be very small)&lt;/li&gt;
&lt;li&gt;Optimize with a simple gradient descent and a Fibonacci line search&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second one :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Optimize 10 points with a gradient descent from a random start&lt;/li&gt;
&lt;li&gt;Optimize with one new point
&lt;ul&gt;
&lt;li&gt;Move only this point with a gradient descent&lt;/li&gt;
&lt;li&gt;Move every points&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second algorithm is slower than the first, but it works every time.&lt;/p&gt;
&lt;p&gt;Stay tuned for the results&amp;#8230;&lt;/p&gt;</description>
	<pubDate>Wed, 02 Apr 2008 07:15:08 +0000</pubDate>
</item>
<item>
	<title>Titus Brown: Rockstar Programmers -- 10-20x more efficient?</title>
	<guid>http://ivory.idyll.org/blog/2008/04/01/rockstar-programmers</guid>
	<link>http://ivory.idyll.org/blog/apr-08/rockstar-programmers</link>
	<description>&lt;div class=&quot;document&quot;&gt;
&lt;p&gt;From &lt;a class=&quot;reference&quot; href=&quot;http://meganmcardle.theatlantic.com/archives/2008/04/wages_or_shortage_1.php&quot;&gt;Wages or Shortage&lt;/a&gt;, this comment&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
&amp;quot;&amp;quot;&amp;quot;
A-grade engineers are unfortunately similar to Welsh
longbowmen: devastatingly potent compared to their peers, but you
have to start their training at age 10 or so.  Simply upping the
salaries of A-grade engineers won't magically create more of them.
We know this, as we tried exactly that experiment in the boom.&amp;quot;
&amp;quot;&amp;quot;&amp;quot;
&lt;/pre&gt;
&lt;p&gt;and this comment&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
&amp;quot;&amp;quot;&amp;quot;
... the notion of &amp;quot;best practices&amp;quot; is widely misunderstood in IT. It
is not organizational best practices that most improve the output,
it's best engineering practices. And those are accepted first by the
&amp;quot;rockstar&amp;quot; types and least understood, why, most often resisted, by
the management and subsistence engineers. Where do you think that
10-20x gap comes from, lightning-fast typing skill? ;-)
&amp;quot;&amp;quot;&amp;quot;
&lt;/pre&gt;
&lt;p&gt;and this one&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
&amp;quot;&amp;quot;&amp;quot;
... such practices often fall victim to the hero mentality that is
the odious legacy of the dot-com boom. It basically says that for a
tech company to do well, it has to find some rockstars, clear the
decks for them, and sell the gold that trickles out of their
foosball-table equipped office. It fosters a warlike mentality in
the workplace and sacrifices long term growth for short term market
share. It also happily sacrifices a vast middle ground of engineers
who would improve and be profitably productive with a positive
environment and some solid mentoring so it can lavish luxury on the
super-productive who may not, as Dave seems to concede, necessarily
add business value. Contrary to Dave's assertions, I've also seen
good engineers get better in such an environment.
&amp;quot;&amp;quot;&amp;quot;
&lt;/pre&gt;
&lt;p&gt;all ring true.&lt;/p&gt;
&lt;p&gt;--titus&lt;/p&gt;
&lt;/div&gt;</description>
	<pubDate>Wed, 02 Apr 2008 04:03:05 +0000</pubDate>
</item>
<item>
	<title>OpenOpt (Dmitrey Kroshko): Fortress v. 1.0 has been released</title>
	<guid>tag:blogger.com,1999:blog-6210259640013469958.post-6543953887970600477</guid>
	<link>http://openopt.blogspot.com/2008/04/fortress-v-10-has-been-released.html</link>
	<description>Today Fortress language v. 1.0 (Fortran successor from Sun Microsystems, sponsored in DARPA HPCS project along with IBM X10 and Cray Chapel) has been released. I don't know how stable is the one - IIRC in 2006 fortress developers had promised rather stable one in 2009-2010 only. Note that this is still Java-based version, native code compilation is intended to be done some time later.&lt;br /&gt;&lt;br /&gt;Here's a letter from mail list below. Note also that along with Emacs plugin mentioned here Fortress has plugins for Eclipse and NetBeans already.&lt;br /&gt;&lt;br /&gt;---------------------------&lt;br /&gt;Fortress Community Members:&lt;br /&gt;&lt;br /&gt;Today, we are releasing the first version of the Fortress specification with a compliant implementation: Fortress 1.0. Both the new specification and the implementation are available from the project website:&lt;br /&gt;&lt;br /&gt;http://projectfortress.sun.com&lt;br /&gt;&lt;br /&gt;The 1.0 implementation is available both as a stand-alone download and through a Subversion repository. Please follow the instructions on the website to get it.&lt;br /&gt;&lt;br /&gt;Our tandem release of a specification and matching interpreter is a major milestone for the project; it is a goal we have been working toward for some time.  All Fortress source code appearing in this specification has been tested by executing it with the open source Fortress implementation. Moreover, all code has been rendered automatically with the tool Fortify, also ! included s distribution. (In case you haven't used it yet, Fortify is an open source tool contributed by Guy Steele that converts Fortress source code to LaTeX.) Also note that this release includes a Fortress mode for Emacs, contributed by Yuto Hayamizu, and over 10,000 lines of Fortress library code, contributed both by Sun and by Fortress community member Michael Spiegel.&lt;br /&gt;&lt;br /&gt;Our reference implementation has evolved gradually, in parallel with the evolution of the language specification and the development of the core libraries.  In order to synchronize the specification with the implementation, it was necessary both to add features to the implementation and to drop features from the specification. Most significantly, most static checks in the implementation are currently turned off, as we are in the process of completing the static type checker and the type inference&lt;br /&gt;engine. Static constraints are still included in the specification as documentation. Contrary to the Fortress Version 1.0.beta, inference of static parameter instantiations is based on the runtime types of the arguments to a functional call. Support for syntactic abstraction is not included in this release. We do not yet support nontrivial distributions, nor parallel nested transactions.  Moreover, many other language features defined in the Fortress Language Specification, Version 1.0.beta have been elided. Many of these features require additional research before they can be implemented reliably; this research and development is a high priority.&lt;br /&gt;&lt;br /&gt;With this release, our goal in moving forward is to incrementally add back features taken out of the specification as they are implemented. In particular, all language features included in the Fortress Specification version 1.0 beta remain goals for eventual inclusion in the language (perhaps with additional modification and evolution of their design). By proceeding in this manner, we hope that our implementation will be useful for more ta ill comply with the public specification. Moreover, the Fortress community will be better able to evaluate the design of new features, as users will be able to use them immediately, and developers will be able to contribute to the implementation effort more easily, as they will be able to build off of a relatively stable and well-specified base.&lt;br /&gt;&lt;br /&gt;Moving forward with the implementation, in concert with the open source community, our goal is to build off of the infrastructure of our interpreter to construct an optimizing Fortress compiler and to achieve our long-standing goal of constructing a new programming language with high performance and high programmer productivity, owned by the community that uses it, and able to grow gracefully with the tasks it is applied to.&lt;br /&gt;&lt;br /&gt;Thanks to all those who sent feedback on earlier versions; many of your suggestions have influenced changes in this new version. Please keep the feedback coming!&lt;br /&gt;&lt;br /&gt;Watch this space for future news from &gt;-- Eric Allen&lt;br /&gt;&lt;br /&gt;Check out Fortress!                http://projectfortress.sun.com &lt;br /&gt;---------------------------&lt;br /&gt;&lt;br /&gt;See also: my &lt;a href=&quot;http://openopt.blogspot.com/2008/01/jan-2008-python-continue-to-grow-tiobe.html&quot;&gt;impressions&lt;/a&gt; of Python, Fortress and some other langueges</description>
	<pubDate>Tue, 01 Apr 2008 07:49:34 +0000</pubDate>
	<author>noreply@blogger.com (Dmitrey)</author>
</item>
<item>
	<title>Ga&amp;#235;l Varoquaux: Of travels and sprints</title>
	<guid>http://gael-varoquaux.info/blog/?p=26</guid>
	<link>http://gael-varoquaux.info/blog/?p=26</link>
	<description>&lt;p&gt;This month I have traveled a bit for scientific-computing related reasons, and of course it was pure delight.&lt;/p&gt;
&lt;h1&gt;In England&lt;/h1&gt;
&lt;p&gt;First of all, I was speaking at the OKcon, &lt;a href=&quot;http://www.okfn.org/okcon/&quot;&gt;open knowledge conference&lt;/a&gt; in London, about Scientific tools in Python in general, and Mayavi in particular. I jumped on the occasion to visit the Airbus campus in Bristol. We have had some contacts with these guys, because they use Mayavi in some of their homegrown applications, and I was curious to put faces on friendly names on the mailing list. In addition, I was eager to find out how they were using Mayavi and Python scientific tools in an industrial environment, as I have never worked in another place than a physics lab.&lt;/p&gt;
&lt;h2&gt;Visiting the Airbus campus&lt;/h2&gt;
&lt;p&gt;The Airbus visit was enlightening: the Bristol campus is a major research facility (several thousands people) dedicated to wing design. A good part of the work is done through simulations deployed on big clusters. These calculations have historically been run in Fortran and C, but apparently the engineers are switching to a mix of compiled languages and Python. Moreover, steering of these simulations, through mesh-design, visualization of the results, analysis of the data, is done mainly through an interact program, &amp;#8216;flightpad&amp;#8217;, that is developed fully in Python, using the Envisage framework to couple together a bunch of scientific components, including Mayavi. I got to spend a fair amount of time with the guys doing this, and it was great to see how they did it. They have a good approach to scientific software design (loosely coupled components, reuse of all the existing libraries), eventhough their goal (automatic generation of Python scripts from user interaction) is way more ambitious than anything I have in mind. I was pleased to see that they where using Mayavi in a way completely consistent with its design, and did not have to hack around limitation.&lt;/p&gt;
&lt;p&gt;It was really very encouraging to talk with the software strategist.  He obviously completely got it as far as how an open-source model can be profitable to a company like Airbus. See so many people using open source tools as their main tools, as well as a manager ready to back this position, and explaining how it can be beneficial to contribute to an open-source project, really filled me with hope.&lt;/p&gt;
&lt;p&gt;Of course visiting the Airbus campus was not only about software, it was also about planes (I got a drive around the campus, and it is quite fun to ride a mini cooper between to 747), and beers (reinventing the world to make it a better place at the pub, after work). I must say there is something special about the scientific Python community, it is the nicest community I know (with the sailing one :-&amp;gt;). You meet people that you have never seen before, and you immediately feel at ease.&lt;/p&gt;
&lt;h2&gt;Open Knowledge conference&lt;/h2&gt;
&lt;p&gt;The Open Knowledge conference was fun. Not too much like the geek conferences I am used to, as here the focus was on the data, and not the tools , aka the software (for instance, the big deal is when you can get access to the complete public transport time-tables, and you can make maps of poorly connected areas). I met &lt;a title=&quot;malb::blog&quot; href=&quot;http://www.informatik.uni-bremen.de/cgi-bin/cgiwrap/malb/blosxom.pl&quot;&gt;Martin Albrecht&lt;/a&gt; from the &lt;a href=&quot;http://www.sagemath.org/&quot;&gt;sage project&lt;/a&gt;. It was very interesting to discuss with him. I generally consider myself as doing rather fundamental research (Bose-Einstein condensation), but for him I was in the applied science section, because I use math and computers to do applied things. This distinction between applied and fundamental maths yields a distinction in the application of the code, and therefore the way an open-source scientific project can survive. It was very interesting to see the way sage&amp;#8217;s development process therefore differed from scipy&amp;#8217;s. I think that both Martin&amp;#8217;s talk on sage, and mine on Python and interactive visualization had a lot of success: the room was full of scholars, and they wanted tools to do their work.&lt;/p&gt;
&lt;p&gt;In London, I had the occasion to catch up with my brother, and Rob, a former colleague. That was nice too (and yielded more beers).&lt;/p&gt;
&lt;h1&gt;Paris&lt;/h1&gt;
&lt;h2&gt;Nipy Sprint&lt;/h2&gt;
&lt;p&gt;The week after, I was attending a sprint in Paris on &lt;a href=&quot;http://neuroimaging.scipy.org/&quot;&gt;nipy&lt;/a&gt;: neuroimaging in Python. We were a bunch of enthusiastic scientific Python users crammed in a small room during the day. There was the team from Berkeley with including Jarrod and Fernando, and all their friends. I got to make new friends, and catch up with old ones. The goal of the nipy effort is to build a complete processing pipeline for neuroimaging data, especially fMRI, in Python. This is a lot of work, as many transformations are applied to the raw data to make it useful for scientific publications. As the field matures, these transformations pile up, and the processing pipeline gets more and more complex. There already exists a good pipeline under MatLab (&lt;a href=&quot;http://www.fil.ion.ucl.ac.uk/spm/&quot;&gt;SPM&lt;/a&gt;), the problem is that, due to the poor language features of MatLab, it is a codebase hard to extend and to modify. One of the goals of the nipy project is to make a pluggable architecture, for researcher to be able to replace part of the pipeline by their own code, and thus explore new methods while comparing them to the reference one. This means that there are some interesting software engineering problems in here (pluggable pipelines, framework&amp;#8230;, the kind of stuff I like), however the current focus is to get the algorithms right, before trying to do software over-engineering.&lt;/p&gt;
&lt;p&gt;The Berkeley group got an NSF grant to work on the project and has been able to hire two developers for two years (Chris Burns and Tom Waite). The effort is lead by Jarrod Millman, and they have put a lot of work in making the underlying libraries better (that is improving numpy and scipy).&lt;/p&gt;
&lt;p&gt;I had difficulties contributing any useful code, as I don&amp;#8217;t know neuroimaging, but I had the pleasure of seeing people pick up the mayavi API and use it to quickly build domain-specific tools for displaying brains and activation regions. As usual this also revealed some shortcomings in the mlab API that I plan to address ASAP.&lt;/p&gt;
&lt;h2&gt;IPython Sprint&lt;/h2&gt;
&lt;p&gt;The week end after Fernando, Laurent Dufréchou, Stefan van der Waalt and myself crashed at my parent&amp;#8217;s place to work on ipython1 and the front ends. My mother cooked us some fabulous food and I had a great time.&lt;/p&gt;
&lt;p&gt;Unfortunately we did get as far as I would have like. The right abstraction for talking between the ipython1 execution engine, and the front end are not really easy to get right, as the engine is nothing more than an abstract execution engine, that basically only has a namespace and knows how to execute stuff in a non-blocking mode (that&amp;#8217;s where it gets hard: how do you know what is going on with your engine and the commands you have sent to it? How do you deal with introspections requests such as tab-completion or docstring exploration). We want as little logics in the front ends as possible: let us not duplicate tab-completion or history. This is why we are progressively building an object, that Fernando dubbed &amp;#8220;InputStateManager&amp;#8221; that is doing the impedance matching between the front end and the engine. I am starting to believe that the best way to connect this object (ISM) to the front end is via a callback-based mechanism: the front-end calls the ISM methods and gives them a callback to call when finished (for instance if running in a different thread, a Wx frontend would pass something based on Wx.CallAfter to display the result). That way the mechanism is very general, can adapt to event-driven front ends or readline-based one, and knows nothing about the front end. Of course not much code got written, because I am way too slow, and it took me ages to figure this out.&lt;/p&gt;
&lt;p&gt;We had a lot of fun, and for me the highlight of the week end was when my girlfriend joined us to do some hacking on a really cool project trying to use the scipy.org wiki to edit the numpy docstring.&lt;/p&gt;
&lt;p&gt;Fernando has pictures of all these happy moments. and I hope he will publish them somewhere (Fernando, get a blog :-&amp;gt;). Next time I hope there will be more of us.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit: &lt;/strong&gt; &lt;a href=&quot;http://gael-varoquaux.info/physics/slides_okcon.pdf&quot;&gt;my slides at OKcon&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 01 Apr 2008 01:13:11 +0000</pubDate>
</item>
<item>
	<title>Prabhu Ramachandran: Uniform deviates on the surface of a sphere</title>
	<guid>tag:blogger.com,1999:blog-3878550364089796940.post-7546091570667104159</guid>
	<link>http://prabhuramachandran.blogspot.com/2008/03/uniform-deviates-on-surface-of-sphere.html</link>
	<description>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