<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-705646438436706806</id><updated>2011-07-31T00:18:00.965-07:00</updated><category term='cocoa'/><category term='scikits'/><category term='UI'/><category term='scipy'/><title type='text'>Mad science</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://physionconsulting.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://physionconsulting.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Barry</name><uri>http://www.blogger.com/profile/00054473023383838527</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-705646438436706806.post-3966800222141267582</id><published>2009-05-18T09:38:00.000-07:00</published><updated>2009-05-18T09:39:46.146-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scipy'/><title type='text'>Moving...</title><content type='html'>The Physion Consulting blog will be moving to &lt;a href="http://blog.physionconsulting.com"&gt;blog.physionconsulting.com&lt;/a&gt;. Please join us there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/705646438436706806-3966800222141267582?l=physionconsulting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://physionconsulting.blogspot.com/feeds/3966800222141267582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=705646438436706806&amp;postID=3966800222141267582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/3966800222141267582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/3966800222141267582'/><link rel='alternate' type='text/html' href='http://physionconsulting.blogspot.com/2009/05/moving.html' title='Moving...'/><author><name>Barry</name><uri>http://www.blogger.com/profile/00054473023383838527</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-705646438436706806.post-4860416239819753563</id><published>2008-09-23T11:38:00.000-07:00</published><updated>2008-09-23T11:40:57.494-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scipy'/><title type='text'>SciPy 2008 Proceedings online</title><content type='html'>The proceedings of the 2008 SciPy conference are now &lt;a href="http://conference.scipy.org/proceedings/SciPy2008/"&gt;online&lt;/a&gt;. The articles provide a snapshot of some of the great work being done using SciPy as well as valuable references for SciPy users. Gaël Varoquaux has done a great job getting the whole collection in shape. Thanks Gaël!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/705646438436706806-4860416239819753563?l=physionconsulting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://physionconsulting.blogspot.com/feeds/4860416239819753563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=705646438436706806&amp;postID=4860416239819753563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/4860416239819753563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/4860416239819753563'/><link rel='alternate' type='text/html' href='http://physionconsulting.blogspot.com/2008/09/scipy-2008-proceedings-online.html' title='SciPy 2008 Proceedings online'/><author><name>Barry</name><uri>http://www.blogger.com/profile/00054473023383838527</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-705646438436706806.post-116678246657652494</id><published>2008-03-16T15:52:00.000-07:00</published><updated>2008-03-16T22:45:20.140-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><title type='text'>Data type and byte order conversions for NSData using the STL</title><content type='html'>We've been spoiled working in Python's &lt;a href="http://numpy.scipy.org/"&gt;numpy&lt;/a&gt; array library. Converting data types or byte order for numeric data in a numpy array is trivial (thanks to the work of numpy's authors of course). When we're in Objective-C land, the inability to change data types or byte orders on NSData instances is frustrating. So we've written a short C++ header that provides templated functions for converting the data type and/or byte order of numeric data stored in NSData/NSMutableData instances. I think it might be useful for others who don't want to (re)learn C++ and the STL. Writing code in Objective-C to accomplish the same functionality is a mess of if/then/else or switch statements. Every job has a tool and C++ templates seem to be the best tool for this job (numpy's authors have a similar solution using a code generator to keep things all in C).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the brave and or insterested, take a look at &lt;a href="http://rieke-server.physiol.washington.edu/~barry/code/NumericDataTypeConversions.h"&gt;NumericDataTypeConversions.h &lt;/a&gt; (BSD license). Bug reports or patches are welcome. Since it's a C++ header, any Objetive-C file that includes it will have to have the .mm extension (or otherwise ensure that the file is compiled as Objective-C++). Happy coding.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/705646438436706806-116678246657652494?l=physionconsulting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://physionconsulting.blogspot.com/feeds/116678246657652494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=705646438436706806&amp;postID=116678246657652494' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/116678246657652494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/116678246657652494'/><link rel='alternate' type='text/html' href='http://physionconsulting.blogspot.com/2008/03/data-type-and-byte-order-conversions.html' title='Data type and byte order conversions for NSData using the STL'/><author><name>Barry</name><uri>http://www.blogger.com/profile/00054473023383838527</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-705646438436706806.post-3026741156103020910</id><published>2008-01-30T18:58:00.001-08:00</published><updated>2008-01-30T19:01:39.830-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scikits'/><category scheme='http://www.blogger.com/atom/ns#' term='scipy'/><title type='text'>scikits.ann in PyPI</title><content type='html'>After several folks had trouble getting the scikits.ann egg from the server listed in previous posts, I've uploaded the source and OS X 10.5 egg to PyPI. You can now install it via easy_install. Of course, you can still get it via the &lt;a href="http://scipy.org/scipy/scikits/wiki"&gt;scikits&lt;/a&gt; SVN.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/705646438436706806-3026741156103020910?l=physionconsulting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://physionconsulting.blogspot.com/feeds/3026741156103020910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=705646438436706806&amp;postID=3026741156103020910' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/3026741156103020910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/3026741156103020910'/><link rel='alternate' type='text/html' href='http://physionconsulting.blogspot.com/2008/01/scikitsann-in-pypi.html' title='scikits.ann in PyPI'/><author><name>Barry</name><uri>http://www.blogger.com/profile/00054473023383838527</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-705646438436706806.post-5422347649023445048</id><published>2008-01-29T16:36:00.000-08:00</published><updated>2008-01-29T16:39:56.431-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scikits'/><category scheme='http://www.blogger.com/atom/ns#' term='scipy'/><title type='text'>ANN namespace madness</title><content type='html'>I hadn't checked the scikits Developer's Trac recently. Apparently it's now OK to use non-BSD (but OSI approved) licenses in the scikits namespace. So I've moved our ANN wrapper back. You can get it from the &lt;a href="http://scipy.org/scipy/scikits"&gt;scikits&lt;/a&gt; SVN or via&lt;div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;easy_install -f http://rieke-server.physiol.washington.edu/~barry/python/ scikits.ann&lt;/blockquote&gt;if you're on OS X 10.5.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/705646438436706806-5422347649023445048?l=physionconsulting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://physionconsulting.blogspot.com/feeds/5422347649023445048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=705646438436706806&amp;postID=5422347649023445048' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/5422347649023445048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/5422347649023445048'/><link rel='alternate' type='text/html' href='http://physionconsulting.blogspot.com/2008/01/ann-namespace-madness.html' title='ANN namespace madness'/><author><name>Barry</name><uri>http://www.blogger.com/profile/00054473023383838527</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-705646438436706806.post-5560988354735652893</id><published>2008-01-29T13:01:00.000-08:00</published><updated>2008-01-29T13:17:12.334-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scikits'/><category scheme='http://www.blogger.com/atom/ns#' term='scipy'/><title type='text'>ANN wrapper (v0.2) now LGPL, OS X egg available</title><content type='html'>With help and suggestions from Rob Hetland, I've made many changes to the API of our Approximate Nearest Neighbor wrapper for scipy. The API is now hides much of the SWIG-yness of the old version and feels (I hope) more pythonic. On Rob's suggestion we've also added C++ code to make querying multiple points much faster. Because the ANN library is LGPL, I've relicensed our wrapper as LGPL to avoid any LGPL/BSD conflicts and have moved the wrapper to the scigpl namespace from scikits (too bad, scikits looks so much flashier).&lt;br /&gt;&lt;br /&gt;I've also made an egg for OS X that statically links the ANN library. You should be able to install via (one line):&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;easy_install -f http://rieke-server.physiol.washington.edu/~barry/python scigpl.ann&lt;/blockquote&gt;&lt;br /&gt;Of course, you can still get it via the &lt;a href="http://scipy.org/scipy/scikits"&gt;scikits&lt;/a&gt; SVN.&lt;br /&gt;&lt;br /&gt;Here's how the new API looks:&lt;br /&gt;&lt;blockquote&gt;&gt;&gt;&gt; import scigpl.ann as ann&lt;br /&gt; &lt;br /&gt;   &gt;&gt;&gt; import numpy as np&lt;br /&gt;&lt;br /&gt;   &gt;&gt;&gt; k=ann.kdtree(np.array([[0.,0],[1,0],[1.5,2]]))&lt;br /&gt;&lt;br /&gt;   &gt;&gt;&gt; k.knn([0,.2],1)&lt;br /&gt;   (array([[0]]), array([[ 0.04]]))&lt;br /&gt;&lt;br /&gt;   &gt;&gt;&gt; k.knn([0,.2],2)&lt;br /&gt;   (array([[0, 1]]), array([[ 0.04,  1.04]]))&lt;br /&gt;&lt;br /&gt;   &gt;&gt;&gt; k.knn([[0,.2],[.1,2],[3,1],[0,0]],2)&lt;br /&gt;   (array([[0, 1],&lt;br /&gt;          [2, 0],&lt;br /&gt;          [2, 1],&lt;br /&gt;          [1, 2]]), array([[ 0.04,  1.04],&lt;br /&gt;          [ 1.96,  4.01],&lt;br /&gt;          [ 3.25,  5.  ],&lt;br /&gt;          [ 1.  ,  6.25]]))&lt;br /&gt;&lt;br /&gt;   &gt;&gt;&gt; k.knn([[0,.2],[.1,2],[3,1],[0,0]],3)&lt;br /&gt;   (array([[ 0,  1,  2],&lt;br /&gt;          [ 2,  0,  1],&lt;br /&gt;          [ 2,  1,  0],&lt;br /&gt;          [ 1,  2, -1]]), array([[  4.00000000e-002,   1.04000000e+000,   5.49000000e+000],&lt;br /&gt;          [  1.96000000e+000,   4.01000000e+000,   4.81000000e+000],&lt;br /&gt;          [  3.25000000e+000,   5.00000000e+000,   1.00000000e+001],&lt;br /&gt;          [  1.00000000e+000,   6.25000000e+000,   1.79769313e+308]]))&lt;/blockquote&gt; &lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/705646438436706806-5560988354735652893?l=physionconsulting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://physionconsulting.blogspot.com/feeds/5560988354735652893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=705646438436706806&amp;postID=5560988354735652893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/5560988354735652893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/5560988354735652893'/><link rel='alternate' type='text/html' href='http://physionconsulting.blogspot.com/2008/01/ann-wrapper-v02-now-lgpl-os-x-egg.html' title='ANN wrapper (v0.2) now LGPL, OS X egg available'/><author><name>Barry</name><uri>http://www.blogger.com/profile/00054473023383838527</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-705646438436706806.post-7278127315209062007</id><published>2008-01-18T23:07:00.000-08:00</published><updated>2008-01-18T23:15:10.158-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scikits'/><category scheme='http://www.blogger.com/atom/ns#' term='scipy'/><title type='text'>scikits.ann part deux</title><content type='html'>I've updated our Python wraper for David Mount and Sunil Arya's Approximate Nearest Neighbor (ANN) library. It now handles searching the tree for the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;k&lt;/span&gt;-nearest neighbors of a set of points. Since it's all done in C, this should be &lt;span class="Apple-style-span" style="font-style: italic;"&gt;much&lt;/span&gt; faster than looping in Python for large sets of points. Along the way, I was able to clean up the API significantly--I got rid of the SWIG-isms and the whole thing feels much more Pythonic now.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you need to do &lt;span class="Apple-style-span" style="font-style: italic;"&gt;k&lt;/span&gt;-nearest neighbor searches, have a look. It's in the &lt;a href="http://scipy.org/scipy/scikits"&gt;scikits&lt;/a&gt; SVN.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/705646438436706806-7278127315209062007?l=physionconsulting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://physionconsulting.blogspot.com/feeds/7278127315209062007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=705646438436706806&amp;postID=7278127315209062007' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/7278127315209062007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/7278127315209062007'/><link rel='alternate' type='text/html' href='http://physionconsulting.blogspot.com/2008/01/scikitsann-part-deux.html' title='scikits.ann part deux'/><author><name>Barry</name><uri>http://www.blogger.com/profile/00054473023383838527</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-705646438436706806.post-2269901221396193265</id><published>2008-01-01T18:20:00.000-08:00</published><updated>2008-01-01T18:26:24.679-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scikits'/><category scheme='http://www.blogger.com/atom/ns#' term='scipy'/><title type='text'>scikits.ann</title><content type='html'>Our Python wrapper for David Mount and Sunil Arya's Approximate Nearest Neighbor (ANN) library is now in the &lt;a href="http://scipy.org/scipy/scikits/wiki"&gt;scikits&lt;/a&gt; repository at scipy.org. The scikits.ann module is a SWIG-generated Python wrapper for the ANN library. It provides a numpy-compatible immutable &lt;span class="Apple-style-span" style="font-style: italic;"&gt;k&lt;/span&gt;d-tree implementation which can perform &lt;span class="Apple-style-span" style="font-style: italic;"&gt;k-&lt;/span&gt;nearest neighbor and approximate &lt;span class="Apple-style-span" style="font-style: italic;"&gt;k&lt;/span&gt;-nearest neighbor searches. It currently builds on unix/OS X and I'm working to incorporate Jose Martin's contributions to get things building on Windows with MinGW.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;ANN is licensed under the LGPL and we've licensed the scikits.ann wrapper under the BSD license. If you need a &lt;span class="Apple-style-span" style="font-style: italic;"&gt;k&lt;/span&gt;d-tree implementation for Python/numpy, check it out.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/705646438436706806-2269901221396193265?l=physionconsulting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://physionconsulting.blogspot.com/feeds/2269901221396193265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=705646438436706806&amp;postID=2269901221396193265' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/2269901221396193265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/2269901221396193265'/><link rel='alternate' type='text/html' href='http://physionconsulting.blogspot.com/2008/01/our-python-wrapper-for-david-mount-and.html' title='scikits.ann'/><author><name>Barry</name><uri>http://www.blogger.com/profile/00054473023383838527</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-705646438436706806.post-3508838021281585476</id><published>2008-01-01T17:58:00.000-08:00</published><updated>2008-01-01T18:15:56.584-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scipy'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><title type='text'>What is a UI?</title><content type='html'>This year, I'd like to say a big &lt;span class="Apple-style-span" style="font-style: italic;"&gt;thank you&lt;/span&gt; to the writers of &lt;a href="http://numpy.scipy.org/"&gt;numpy&lt;/a&gt; and &lt;a href="http://scipy.org/"&gt;scipy&lt;/a&gt;, the numerical and scientific libraries for Python. We use these open source projects very heavily in our work. The combined efforts of all of the contributors to these projects has made Python a premier language for numerical computation. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;The author of numpy, Travis Oliphant recently moved from Utah to Texas to work with Enthought. One of the many contributions Enthought has made to the scientific software community is developing a whole suite of tools (in Python) that make developing cross-platform scientific applications &lt;span class="Apple-style-span" style="font-style: italic;"&gt;much &lt;/span&gt;easier. In a recenet &lt;a href="http://blog.enthought.com/?p=17"&gt;post&lt;/a&gt;, Travis talks at length about what makes a "good" UI. Travis has obviously thought a lot about UI's for scientific computing and his discussion is very interesting. Definitely worth a read. Briefly, Travis notes that the user interface of an app is not just the buttons and menus, but the entire application framework—persistence, undo/redo, safe exploration, workflow, etc. &lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;In scientific software, I think "workflow" is the most important part of an application's user interface. Application frameworks such as Apple's Cocoa, Microsoft's .NET, Trolltech's Qt, etc. have solved many of the applicaiton framework UI issues that Travis mentions (in fact, this is why we use Cocoa and Qt for most of our work at Physion). Apple's Cocoa framework is particularly impressive in this regard. An application with undo/redo, persistence to an SQLite database, automatic network discovery of distributed computing resources, you-name-it, is virtually code-free for the developer. &lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;But&lt;/span&gt;, none of these frameworks have solved the scientific workflow problem. That's because we know how undo/redo should work. We've known for decades how a database should work (for the most part), but science is about the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;new&lt;/span&gt; and very often discovering something new involves creating the entire workflow anew. &lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;One reason why new workflow and new experiments often go together is because a workflow implicitly defines a world model—an idea about what objects in the world mater and how they interact—and new experiments also define a new world model. Therefore, new experiment, new workflow. Only by matching the workflow to the experiment, can we make software that becomes invisible to the researcher while facilitating new discoveries.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We certainly haven't solved the workflow problem either, but we're working on it. Here's to one more year of trying.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/705646438436706806-3508838021281585476?l=physionconsulting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://physionconsulting.blogspot.com/feeds/3508838021281585476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=705646438436706806&amp;postID=3508838021281585476' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/3508838021281585476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/3508838021281585476'/><link rel='alternate' type='text/html' href='http://physionconsulting.blogspot.com/2008/01/what-is-ui.html' title='What is a UI?'/><author><name>Barry</name><uri>http://www.blogger.com/profile/00054473023383838527</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-705646438436706806.post-8150852194884514517</id><published>2007-12-24T11:23:00.000-08:00</published><updated>2008-01-01T18:16:45.224-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><title type='text'>Database vs. scientist</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;One of the founding principles of Physion Consultants is to bring cutting edge technology to scientists. When the computational tools cease to be a bottleneck in the scientific process, we feel that we've done our job. For many scientific applications, a relational database system (RDBMS) is the appropriate data repository. After all, great database engineers have already solved many of the data storage and query problems typically faced by custom-written scientific software. &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;When I start a project, I often first consider the data repository. As a scientist, the data is &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;everything&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; so it makes sense to start there. The project requirements often include searching, indexing, and retrieving data collected across many experiments or observations. Clients can often tell me pretty clearly what entities they expect to be measuring. "Well," I think, "a RDMS sounds ideal." Inevitably, I run right into the RDBMS brick wall when I realize that the flexibility a scientist wants is directly at odds with the rigid certainty that a RDBMS needs to do its job.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;As a researcher, I want to have unlimited flexibility in the parameters of my experiment. These parameters, of course, have to go into whatever data store I choose. We can't store arbitrary key=&gt;value pairs in a table in the database because the database engine needs to know the type (and size) of the key and value columns. Sure we could dump a huge list of key=&gt;value pairs into a binary BLOB in the database, but then &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;blamo&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, we've lost all ability to easily query those parameters in the database engine. And the database engine is the right place to do the query. Darn. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;I spent the weekend working on a dictionary-like construct for Apple's CoreData framework. It defines a class/entity cluster headed by an entity called a KeyValuePair that, you guessed it, stores a key and a value. The idea to provide an API for the app developer that allows creation of an NSDictionary (key=&gt;value map) from a set of KeyValueEntities and visa versa. In addition, the developer/user can query KeyValuePairs directly via a SUBQUERY expression in a CoreData predicate. The only hitch is that the query must specify the type of the value (like 'key == "myKey" AND intValue==3'). It's a hack at this point, but I haven't found any better solution out there. If anyone knows other ways to solve this problem, I'm all ears. In the mean time, we'll get this code cleaned up make it available in case it saves some folks a few days of hair pulling. Stay tuned.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/705646438436706806-8150852194884514517?l=physionconsulting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://physionconsulting.blogspot.com/feeds/8150852194884514517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=705646438436706806&amp;postID=8150852194884514517' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/8150852194884514517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/705646438436706806/posts/default/8150852194884514517'/><link rel='alternate' type='text/html' href='http://physionconsulting.blogspot.com/2007/12/database-vs-scientist.html' title='Database vs. scientist'/><author><name>Barry</name><uri>http://www.blogger.com/profile/00054473023383838527</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
