<?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-3550570499618792354</id><updated>2011-11-28T17:37:11.268-05:00</updated><category term='Introduction'/><category term='virtualization'/><category term='javascript'/><category term='SQL'/><category term='debugging'/><category term='VirtualBox'/><category term='funding'/><category term='hosting'/><category term='citeseerX'/><category term='open source'/><category term='Brownie'/><category term='Postgres'/><category term='ants'/><category term='Leopard'/><category term='superdouble'/><category term='presentation'/><category term='google maps api'/><category term='EOL'/><category term='Flash'/><category term='reference parsing'/><category term='uptime'/><category term='treetapper'/><category term='outage'/><category term='Mac'/><category term='Processing'/><category term='OS X server'/><category term='MacPorts'/><category term='Evolution 2008'/><category term='post-tree analysis'/><category term='visualization'/><category term='charts'/><category term='growth of phylogenetics'/><category term='citations'/><category term='downtime'/><category term='datatable'/><category term='Subversion'/><category term='REST'/><category term='audience'/><category term='reCAPTCHA'/><category term='Google Summer of Code'/><category term='schema'/><category term='10.5'/><category term='Design choices'/><category term='YUI'/><category term='UTK'/><category term='Google'/><category term='actual science'/><category term='PHP'/><category term='Connotea'/><category term='captcha'/><category term='big trees'/><category term='bibutils'/><category term='Firebug'/><category term='Missing methods'/><category term='optimization'/><category term='nsf'/><category term='GraphViz'/><category term='Ubuntu'/><category term='methods'/><category term='WebDot'/><category term='progress'/><category term='R'/><category term='dbgraphnav'/><title type='text'>TreeTapper-Dev</title><subtitle type='html'>A blog describing the development of the TreeTapper.org website.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>43</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-7407248977006110712</id><published>2011-11-28T17:36:00.001-05:00</published><updated>2011-11-28T17:37:11.274-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outage'/><title type='text'>TreeTapper down Dec. 26-28</title><content type='html'>TreeTapper will be down Dec. 26-28, 2011, due to the upgrade process to UTK's infrastructure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-7407248977006110712?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/7407248977006110712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=7407248977006110712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7407248977006110712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7407248977006110712'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2011/11/treetapper-down-dec-26-28.html' title='TreeTapper down Dec. 26-28'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-215945883473065693</id><published>2011-05-16T10:47:00.000-04:00</published><updated>2011-05-16T10:47:00.244-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='MacPorts'/><category scheme='http://www.blogger.com/atom/ns#' term='OS X server'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><title type='text'>OS X upgrade recovery</title><content type='html'>Once OS X server is upgraded, TreeTapper no longer connects to a database because php it is using no longer has postgres support. The solution:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Install macports (probably already done)&lt;/li&gt;&lt;li&gt;sudo port install php5-postgresql&lt;/li&gt;&lt;li&gt;cd /usr/libexec/apache2/&lt;/li&gt;&lt;li&gt;sudo cp libphp5.so libphp5.so_ORIGINAL&lt;/li&gt;&lt;li&gt;sudo cp /opt/local/apache2/modules/libphp5.so . &lt;i&gt;[note the period]&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;Restart apache (aka turn off and turn on the web in Server Admin)&lt;/li&gt;&lt;/ul&gt;An OS X upgrade moves apache back to its base settings, apparently.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-215945883473065693?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/215945883473065693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=215945883473065693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/215945883473065693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/215945883473065693'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2011/05/os-x-upgrade-recovery.html' title='OS X upgrade recovery'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-8902635687957960141</id><published>2011-05-13T13:05:00.002-04:00</published><updated>2011-05-13T13:05:35.432-04:00</updated><title type='text'>Momentarily down</title><content type='html'>A recent OS X server update broke php-postgres again. Now fixing....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-8902635687957960141?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/8902635687957960141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=8902635687957960141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8902635687957960141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8902635687957960141'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2011/05/momentarily-down.html' title='Momentarily down'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-2886518354177830678</id><published>2011-05-09T13:02:00.001-04:00</published><updated>2011-05-09T13:23:26.654-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='downtime'/><title type='text'>Planned outage</title><content type='html'>From Sunday, May 15, 8:00pm to Monday, May 16, 9:30am, TreeTapper will be offline. University of Tennessee, Knoxville, will be turning off power to much of campus in order to wire some renovated buildings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-2886518354177830678?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/2886518354177830678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=2886518354177830678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2886518354177830678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2886518354177830678'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2011/05/planned-outage.html' title='Planned outage'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-7031044928307465124</id><published>2011-04-06T15:19:00.000-04:00</published><updated>2011-04-06T15:19:18.884-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='Design choices'/><category scheme='http://www.blogger.com/atom/ns#' term='hosting'/><title type='text'>Merge codebase</title><content type='html'>When I left NESCent, I deposited TreeTapper's code in Google Code ( &lt;a href="http://code.google.com/p/treetapper/"&gt;http://code.google.com/p/treetapper/&lt;/a&gt; ). Subsequent development happened on a privately-hosted version of that code (I was worried about accidentally committing a file with database access passwords). I've since learned a lot more about SVN and have svn:ignored the dangerous files, as well as files that aren't really things to put in version control, such as cached images. Now, changes made on the Google Code repository will be made live on the site. This should make it easier to collaborate with others going forward.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-7031044928307465124?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/7031044928307465124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=7031044928307465124' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7031044928307465124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7031044928307465124'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2011/04/merge-codebase.html' title='Merge codebase'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-5636869259011524732</id><published>2011-03-11T15:25:00.000-05:00</published><updated>2011-03-11T15:25:33.054-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uptime'/><category scheme='http://www.blogger.com/atom/ns#' term='UTK'/><title type='text'>Impending downtime</title><content type='html'>UTK's Office of Information Technology will be performing some work on the network that will result in the main university website, department websites, individual sites, and many campus buildings to be completely offline from the afternoon of Friday March 18 until sometime March 20. TreeTapper will sadly be included in this outage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-5636869259011524732?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/5636869259011524732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=5636869259011524732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/5636869259011524732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/5636869259011524732'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2011/03/impending-downtime.html' title='Impending downtime'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-8717957556632409689</id><published>2011-02-24T13:46:00.000-05:00</published><updated>2011-02-24T13:46:06.055-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='MacPorts'/><category scheme='http://www.blogger.com/atom/ns#' term='OS X server'/><category scheme='http://www.blogger.com/atom/ns#' term='hosting'/><title type='text'>TreeTapper hosting moving</title><content type='html'>Today, TreeTapper is moving from hosting at NESCent to hosting at the U of Tennessee. NESCent hosting has been excellent (I remember one occasion during a weekend snow storm when NESCent's sysadmin braved Durham's poorly-treated streets and spinning drivers to go in and take care of servers that were, ironically enough, overheating). However, it will be a bit easier for me to maintain if TreeTapper is hosted locally, as I'll be able to directly log in to the production server and change things without needing to worry as much about other sites (though other O'Meara lab sites, like &lt;a href="http://www.myrmecocystus.org"&gt;http://www.myrmecocystus.org&lt;/a&gt;, are also hosted on the server). So far the move has gone well, now to see if the DNS starts pointing properly. TreeTapper may be down for a few hours while the move completes. MacPorts has been helpful for things like recompiling a version of PHP that can talk to a database.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-8717957556632409689?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/8717957556632409689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=8717957556632409689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8717957556632409689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8717957556632409689'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2011/02/treetapper-hosting-moving.html' title='TreeTapper hosting moving'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-4291411065447390658</id><published>2010-06-14T11:26:00.004-04:00</published><updated>2010-06-14T11:38:12.421-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nsf'/><category scheme='http://www.blogger.com/atom/ns#' term='funding'/><title type='text'>NSF grant submitted</title><content type='html'>I have applied to NSF's &lt;a href="http://www.nsf.gov/pubs/2010/nsf10551/nsf10551.htm"&gt;Software Infrastructure for Sustained Innovation&lt;/a&gt; program for a developer for TreeTapper and some salary support for me. Consistent with TreeTapper's open way of doing science, you can see the submitted proposal (minus the legalese pages and my CV/other grants pages) &lt;a href="http://brianomeara.info/sites/default/files/TreeTapperProposal_June2010.pdf"&gt;here (PDF)&lt;/a&gt;. The goals are threefold: 1) improve the basic TreeTapper &lt;a href="http://code.google.com/p/treetapper/"&gt;code &lt;/a&gt; to make it more sustainable, secure, and faster, 2) improve usability, esp. with generation of the missing methods/software diagrams and with user login (implement &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt;), hopefully making it easier for others to get involved, and 3) make the code base deployable in other fields -- imagine a TreeTapper for methods in astronomy or ecology. &lt;br /&gt;&lt;br /&gt;Continued thanks to NESCent for funding initial development of TreeTapper (feeding me, hosting the site, providing extensive expertise) [NSF grant EF-0423641] and Google Summer of Code for funding a student to create code for visual database traversal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-4291411065447390658?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/4291411065447390658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=4291411065447390658' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/4291411065447390658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/4291411065447390658'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2010/06/nsf-grant-submitted.html' title='NSF grant submitted'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-2029305743202047069</id><published>2010-03-11T16:04:00.003-05:00</published><updated>2010-03-11T16:07:54.155-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualization'/><category scheme='http://www.blogger.com/atom/ns#' term='VirtualBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>VirtualBox?</title><content type='html'>Getting everything working on Mac OS 10.5 was an issue, and there's also the security concerns of having one's primary machine also acting as a web server. I'm not exploring putting TreeTapper on a Sun VirtualBox on my mac. I'm downloading Ubuntu Server now and will give it a try. Suggestions welcome, of course.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-2029305743202047069?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/2029305743202047069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=2029305743202047069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2029305743202047069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2029305743202047069'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2010/03/virtualbox.html' title='VirtualBox?'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-7625390581082191351</id><published>2009-08-31T15:11:00.004-04:00</published><updated>2009-08-31T15:14:17.271-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='10.5'/><category scheme='http://www.blogger.com/atom/ns#' term='Leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='Postgres'/><title type='text'>Installing on Leopard</title><content type='html'>I'm moving my hosting from NESCent's servers to a server in my lab (running Mac OS 10.5). Having immediate access to the database structure will be helpful in continuing TreeTapper's development. Installing and configuring postgres on the Mac has taken some work. One useful site so far is &lt;a href="http://shifteleven.com/articles/2008/03/21/installing-postgresql-on-leopard-using-macports#more-43"&gt;here&lt;/a&gt; (though note that the latest version of postgres is 8.4, not 8.3). I'll post more as progress is made...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-7625390581082191351?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/7625390581082191351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=7625390581082191351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7625390581082191351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7625390581082191351'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2009/08/installing-on-leopard.html' title='Installing on Leopard'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-6107301433635459606</id><published>2009-07-30T23:10:00.004-04:00</published><updated>2009-07-30T23:13:44.305-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='treetapper'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>TreeTapper code now available</title><content type='html'>The code for TreeTapper (the website's mostly PHP code) is now &lt;a href="http://code.google.com/p/treetapper/source/browse/#svn/trunk"&gt;available&lt;/a&gt;. I'll be continuing to modify it, but please feel free to look it over and suggest (or submit) corrections, esp. regarding security.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-6107301433635459606?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/6107301433635459606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=6107301433635459606' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/6107301433635459606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/6107301433635459606'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2009/07/treetapper-code-now-available.html' title='TreeTapper code now available'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-2609390151548541139</id><published>2009-06-18T15:08:00.005-04:00</published><updated>2009-06-18T15:14:58.347-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='treetapper'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Moving code to Google Code</title><content type='html'>I'm shortly (&lt;1 month) going to be posting TreeTapper's backend code to Google Code hosting (final site at &lt;a href="http://code.google.com/p/treetapper/"&gt;http://code.google.com/p/treetapper/&lt;/a&gt;). I'll have all the relevant php files (except the one that has the database login information [I hope]) but not basic images. If anyone has any advice about things to watch out for when posting code of  this sort, please let me know [I'm concerned about exposing security vulnerabilities -- don't want to rely on "security through obscurity", but if it helps...].&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-2609390151548541139?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/2609390151548541139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=2609390151548541139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2609390151548541139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2609390151548541139'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2009/06/moving-code-to-google-code.html' title='Moving code to Google Code'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-4539418532467473754</id><published>2008-11-05T13:36:00.006-05:00</published><updated>2008-11-05T13:49:36.855-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='growth of phylogenetics'/><category scheme='http://www.blogger.com/atom/ns#' term='charts'/><category scheme='http://www.blogger.com/atom/ns#' term='audience'/><title type='text'>Growth of phylogenetics, or at least phylogen*</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_d_GbbmZu7dM/SRHoUl_XhHI/AAAAAAAACvo/EEJFKpMbDxU/s1600-h/phylogen.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 304px;" src="http://1.bp.blogspot.com/_d_GbbmZu7dM/SRHoUl_XhHI/AAAAAAAACvo/EEJFKpMbDxU/s400/phylogen.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5265244879865742450" /&gt;&lt;/a&gt;&lt;br /&gt;I'm working on slides for a job talk. I made one that might be of interest to readers of this blog, a plot of number of references with "phylogen*" in any field in &lt;a href="http://www.scopus.com/scopus/home.url"&gt;Scopus&lt;/a&gt; through time (line on the figure, also the position of the blue circles). I also found the number of references with "evolution" or "ecolog*" as well as all combinations of these three terms to make &lt;a href="http://en.wikipedia.org/wiki/Venn_Diagram"&gt;Venn diagrams&lt;/a&gt; of the overlap of the terms (using &lt;a href="http://code.google.com/apis/chart/types.html#venn"&gt;Google Charts&lt;/a&gt;). It's interesting to see how the three areas overlap and change in size through time: "phylogen*" is now much more common (up to 38% of the frequency of "evolution") and now overlaps more with references with "ecolog*" than with references with "evolution". I'm sure there are all sort of artifacts and biases, but interesting to look at nonetheless. It does suggest that I should start thinking more about ecologists using &lt;a href="http://www.treetapper.org/"&gt;TreeTapper&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-4539418532467473754?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/4539418532467473754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=4539418532467473754' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/4539418532467473754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/4539418532467473754'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/11/growth-of-phylogenetics.html' title='Growth of phylogenetics, or at least phylogen*'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_d_GbbmZu7dM/SRHoUl_XhHI/AAAAAAAACvo/EEJFKpMbDxU/s72-c/phylogen.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-8641058234982338869</id><published>2008-11-03T10:14:00.007-05:00</published><updated>2008-11-03T10:53:26.597-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design choices'/><category scheme='http://www.blogger.com/atom/ns#' term='Processing'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='YUI'/><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Missing methods'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Summer of Code'/><category scheme='http://www.blogger.com/atom/ns#' term='dbgraphnav'/><title type='text'>Viewing missing methods/software, part VII: PHP+GD</title><content type='html'>I was getting dissatisfied with &lt;a href="http://www.processing.org/"&gt;Processing&lt;/a&gt; for visualizing missing methods. It was nice to have animation of the diagrams, but it was just too brittle: it would only work in certain browsers, it stopped working sometimes when you moved between tabs or windows, it was hard to update and keep working. This is probably more due to my lack of experience in the language and the odd way I was using it (read a variable stored in Javascript on a page to talk to a PHP script to talk to a Postgres database and display the results in real time) than any inherent flaws in it. I had thought about &lt;a href="http://treetapper-dev.blogspot.com/2008/09/flash-rather-than-processing.html"&gt;going to Flash&lt;/a&gt;, but that also involved learning a new programming language. I had recently started using PHP with GD to visualize &lt;a href="http://www.brianomeara.info/other"&gt;progress of my jobs&lt;/a&gt; on Duke's computing cluster and found it easy to use (though I'm having issues with transparency). I decided to try this with the method visualization (I wanted to get TreeTapper cleaned up a bit more before a job interview next week). I wrote a script that reads information stored in GET variables and saves an image and image map. In front of this I wrote a controller script that only calls the drawing script when an entry in the database is newer than the saved image and image map (using ideas from my Google Summer of Code student Paul McMillan, who put sophisticated caching in his DBGraphNav). The image and image map are displayed in an iframe in the calling page. There's a Javascript function that calls the controller script as a user chooses which options to display. There's also a Javascript function that uses a &lt;a href="http://developer.yahoo.com/yui/container/panel/"&gt;Panel&lt;/a&gt; object from &lt;a href="http://developer.yahoo.com/yui/"&gt;YUI&lt;/a&gt; to display a lot of information about each node on the diagram on mouseover in a floating panel. This is a lot more flexible than the Processing implementation. For example, you can now go to a summary page for each node or click on an entry in the floating panel to go to an info page on just that item (such as a program).  Caching the images makes display a lot faster, though only a subset of possible combinations can be cached. The cache of images also provides some nice pictures for screen savers or talks.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can try out the new interface &lt;a href="http://www.treetapper.org/findneed.php"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's a picture of the new display:&lt;/div&gt;&lt;div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 370px; height: 400px;" src="http://1.bp.blogspot.com/_d_GbbmZu7dM/SQ8bqfSGmhI/AAAAAAAACvg/ZoGZZ2dlgy4/s400/newdisplay.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5264456906185284114" /&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;And some of the cached images:&lt;/div&gt;&lt;div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 135px;" src="http://2.bp.blogspot.com/_d_GbbmZu7dM/SQ8bFqHm4AI/AAAAAAAACvQ/H4ru1gXqq_M/s400/Picture+4.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5264456273438892034" /&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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-8641058234982338869?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/8641058234982338869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=8641058234982338869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8641058234982338869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8641058234982338869'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/11/viewing-missing-methodssoftware-part.html' title='Viewing missing methods/software, part VII: PHP+GD'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_d_GbbmZu7dM/SQ8bqfSGmhI/AAAAAAAACvg/ZoGZZ2dlgy4/s72-c/newdisplay.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-1217194160979619537</id><published>2008-10-17T10:33:00.009-04:00</published><updated>2008-10-17T13:52:30.267-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='big trees'/><category scheme='http://www.blogger.com/atom/ns#' term='schema'/><category scheme='http://www.blogger.com/atom/ns#' term='superdouble'/><category scheme='http://www.blogger.com/atom/ns#' term='Brownie'/><category scheme='http://www.blogger.com/atom/ns#' term='post-tree analysis'/><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Using large trees is surprisingly difficult</title><content type='html'>There has been a lot of effort and interest in phylogenetics in getting big trees (1000+ taxa). This should be the most difficult problem in phylogenetics -- after all, finding the best tree is generally (under most optimization criteria) &lt;a href="http://en.wikipedia.org/wiki/NP-hard"&gt;NP-hard&lt;/a&gt;. My interest, and therefore that of TreeTapper, is in what happens after you get the big tree: using it for understanding biological processes. This should be relatively simple. After searching an enormous tree space to get the best tree, doing something like estimating ancestral states is easy, just a downpass (postorder traversal) and uppass (preorder traversal) calculating probabilities at each node for just one character. In practice, it seems many of the programs in this area fail with large trees, often due to rounding or underflow errors (inferred from my own experiences, and those of NESCent postdocs or visitors &lt;a href="http://www.nescent.org/dir/postdoctoral_fellow.php?id=00022"&gt;Sam Price&lt;/a&gt;, &lt;a href="http://blackrim.org/"&gt;Stephen Smith&lt;/a&gt;, and &lt;a href="http://www.yale.edu/eeb/people/frstyear.htm"&gt;Jeremy Beaulieu&lt;/a&gt;). Most computer programs use numbers with finite precision -- a number smaller in magnitude than around 10E-308 can't be stored as a double, for example. That's a really small number, but if it's a likelihood (probability of the data given the tree and model), a probability of 10E-308 is just a -lnL of 706.9, a number that isn't that unusual for our sort of problems. Many calculations can just be done using ln likelihoods rather than untransformed likelihoods, but for some calculations this is more difficult (certainly more difficult to code). &lt;a href="http://www.r-project.org/"&gt;R&lt;/a&gt; apparently quietly rounds things to zero with small numbers, leading to erroneous results [from reports from others -- I haven't verified this]. My program &lt;a href="http://code.google.com/p/brownie/"&gt;Brownie&lt;/a&gt;, which in the development branch can do discrete character reconstruction, failed on a tree of ~1600 taxa due to underflow errors, so I made a new class for really small or small numbers that basically stores numbers in scientific notation, using a double for the mantissa and an int for the exponent (code available &lt;a href="http://code.google.com/p/superdouble/"&gt;here&lt;/a&gt;). Other programs might need similar kludges to work. It seems odd to me, doing programming as a biologist without much formal CS training, that common programming languages don't do this sort of thing automatically (in the same way that needing to manage memory in C++ feels surprising), but it is an issue that may become more frequently encountered by us.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The relevance to TreeTapper is how and whether to record information about how programs perform with large trees. The first question is whether it's meaningful. For a simple program with one function, it's possible that it always fails if trees are over &lt;span class="Apple-style-span" style="font-style: italic;"&gt;N&lt;/span&gt; taxa in size or if likelihoods get below &lt;span class="Apple-style-span" style="font-style: italic;"&gt;X&lt;/span&gt;. But for complex programs like Mesquite, they might fail for some trees for some methods but work for others, so just storing a single number might be misleading. A second issue is that gathering the data might be difficult: for a typical user, deciding whether a program crashed with a tree with &lt;span class="Apple-style-span" style="font-style: italic;"&gt;N&lt;/span&gt; taxa due to the tree size or some other bug will be hard. It also seems unreasonable to expect people to report to TreeTapper every time a program works or fails for them and under what conditions (&lt;span class="Apple-style-span" style="font-style: italic;"&gt;I&lt;/span&gt; wouldn't make the time to do so). On the other hand, it would be helpful to users to know that a certain program just can't work with trees of a certain size and helpful for developers to know which programs need tweaking for large trees. I guess for now I won't have a separate field for this and will just rely on user comments on each program page, but let me know if you have any suggestions.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-1217194160979619537?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/1217194160979619537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=1217194160979619537' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/1217194160979619537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/1217194160979619537'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/10/using-large-trees-is-surprisingly.html' title='Using large trees is surprisingly difficult'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-8742893211229232000</id><published>2008-10-14T11:47:00.009-04:00</published><updated>2008-10-17T10:33:33.840-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='big trees'/><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><title type='text'>Visualizing trees</title><content type='html'>We recently had a community summit at NESCent on directions for the future. As part of the biodiversity and phylogenetics breakout group (see notes &lt;a href="https://www.nescent.org/community_summit/CommunitySummit_Phylogenetics"&gt;here&lt;/a&gt;), one thing that came up was a need for better ways of visualizing trees [one good idea was inviting &lt;a href="http://benfry.com/"&gt;Ben Fry&lt;/a&gt; to NESCent to work on this]. &lt;a href="http://iphylo.blogspot.com/"&gt;Rod Page&lt;/a&gt; suggested putting tree visualization in TreeTapper as a category, which is a great idea, as there are dozens of programs (see partial list at Felsenstein's &lt;a href="http://evolution.genetics.washington.edu/phylip/software.html#Plotting"&gt;site&lt;/a&gt;). But why, with so many programs, do people feel that so much more work is needed?&lt;br /&gt;&lt;br /&gt;Well, based on behavior, it's obvious that current solutions don't work. NESCent has a fairly sophisticated set of users and builders of trees. When they need to view a large tree (hundreds to thousands of taxa), they don't use any sort of cool tree stretching or zooming program -- they find an old Mac, open Paup in Classic, and print out a tree over multiple pages, which they then assemble using tape and scissors. I think the reason they do this comes down to resolution of paper versus monitors (see some of &lt;a href="http://www.edwardtufte.com/tufte/"&gt;Edward Tuft&lt;/a&gt;e's books for a more general and informed discussion of this). My 1920 x 1200 pixel giant Apple Cinema display monitor (a perk loaned to all NESCent postdocs) can display fewer than 600 distinguishable horizontal lines (one pixel thick with one pixel between them). Our laser printer has a resolution of ~1200 DPI, suggesting that it could print this many lines in about one inch (I might be slightly off if there are some sort of constraints on dot geometry, but the basic idea still holds). By this calculation, my entire monitor display can be reproduced pixel by pixel in a few square inches. Plus, a printed tree can be arbitrarily large (&lt;a href="http://www.phylodiversity.net/donoghue/"&gt;Michael Donoghue&lt;/a&gt; described one several feet in diameter). Speed of visually parsing such a tree is related to how quickly the eye can move around a page: focus closely on one section to read the taxon names, jump to look at the overall picture, etc. On a screen, one would have to  move the mouse around and wait for the screen to update. Even with tremendous zoom, there are only 1200 vertical positions my cursor can occupy (assuming cursor resolution == screen resolution) -- a tree larger than this, and there's no way to display even a cartoon of the whole tree on one screen in such a way that moving the mouse can select just one taxon (other than a nesting of zooms within zooms). In contrast, even on a 11" high piece of paper, with half inch margins and default line spacing, I can print a column of 155 taxon names (using 4 point Times font, about the size used on insect labels), all easily readable. Just a few pieces of paper provide much more resolution than possible on a costly monitor. It's similar to the comparison between a paper map and a GPS navigation system (or Google Maps/Earth): in a given area, the paper map has much more detail. The advantage of the navigation system (besides the whole navigation bit) is that it allows you to zoom in and out for an unlimited amount of information. For looking at a tree, though, as for visualizing a trip, seeing the entire thing with a great amount of detail rather than zooming in and out constantly can be much easier.&lt;br /&gt;&lt;br /&gt;One solution is to have even higher resolution displays (see &lt;a href="http://loco.biosci.arizona.edu/"&gt;Mike Sanderson&lt;/a&gt;'s wall of monitors [taken from his web page] at the end of this post, for example). I think that there will be limits to this, and we might have to wait for other fields to advance first. Instead, it might be worthwhile to work on better ways to print out large trees on tiled pieces of paper. Imagine software that takes a set of bootstrap trees and can create a PDF you can print out and stitch together showing support values and branch lengths, perhaps with reconstruction of characters in color at the nodes, too. It seems appallingly low-tech and yet rather useful. As far as I know, Classic Paup is the only program that can do this, though Mesquite has some options for tree printing that might allow this [this will be much easier to know once this section of TreeTapper's database has been filled in]. The downside is that this doesn't help much the issue of displaying trees in papers, but there, perhaps some summary graphic would work better.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_d_GbbmZu7dM/SPTI2ybeCtI/AAAAAAAACvI/HUMumHOEnFg/s1600-h/wall.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_d_GbbmZu7dM/SPTI2ybeCtI/AAAAAAAACvI/HUMumHOEnFg/s320/wall.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5257047508623690450" /&gt; &lt;/a&gt;&lt;center&gt; image from &lt;a href="http://loco.biosci.arizona.edu/"&gt;http://loco.biosci.arizona.edu&lt;/a&gt;&lt;a&gt;&lt;/a&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-8742893211229232000?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/8742893211229232000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=8742893211229232000' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8742893211229232000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8742893211229232000'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/10/visualizing-trees.html' title='Visualizing trees'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_d_GbbmZu7dM/SPTI2ybeCtI/AAAAAAAACvI/HUMumHOEnFg/s72-c/wall.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-841305287094270201</id><published>2008-10-10T16:56:00.003-04:00</published><updated>2008-10-10T17:05:08.846-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design choices'/><title type='text'>Better input</title><content type='html'>I've been adding methods and software to the DB slowly, I think due to a somewhat awkward interface. TreeTapper is currently configured so that various traits of a method or program (criterion, character type, etc.) are selected from pull down menus or tables. If an element isn't there (such as a particular format of tree file), I currently have to go to a separate page, add the item, and then reload the first page. I'd been playing a bit with having popup panels for this entry and have decided to just do them. This will simplify, for a user, adding things to a database: she or he can just go to the add method, add software, or add reference pages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-841305287094270201?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/841305287094270201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=841305287094270201' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/841305287094270201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/841305287094270201'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/10/better-input.html' title='Better input'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-2778957358682873755</id><published>2008-09-23T16:27:00.005-04:00</published><updated>2008-09-23T16:45:53.292-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design choices'/><category scheme='http://www.blogger.com/atom/ns#' term='Processing'/><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Missing methods'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Flash rather than Processing?</title><content type='html'>I'm now wondering whether Processing was a bad choice for visualizing missing methods (though it's still better than the horribly slow Google Maps implementation). It results in Java applets, which can take quite some time to load on a page (see other general criticisms &lt;a href="http://abeautifulwww.com/2007/02/22/flash-vs-processing/"&gt;here&lt;/a&gt;). I had to do some hacky things (use Java code rather than stuff built into Processing) to get the applet to talk to Javascript on the page to find what items a user wants to examine, which might not be stable as Processing develops [and it probably prevents me from just converting to &lt;a href="http://ejohn.org/blog/processingjs/"&gt;Processing.js&lt;/a&gt; or the like]. Also, on the stable site (&lt;a href="http://www.treetapper.org"&gt;http://www.treetapper.org&lt;/a&gt;, rather than &lt;a href="http://treetapper.nescent.org"&gt;http://treetapper.nescent.org&lt;/a&gt;), the existing Java applet I made doesn't work (to see a working version, go &lt;a href="http://treetapper.nescent.org/findneed.php"&gt;here&lt;/a&gt;). I've tried playing with the &lt;a href="http://treetapper.nescent.org/processing_findmissingdynamic/applet/processing_findmissingdynamic.pde"&gt;code&lt;/a&gt; (changing it to point to the stable site, of course, and looking at other potential issues) and it still doesn't work. Flash animations seem to work much faster and more stably across many browsers. Some versions (&gt;4.0.5, &lt;5.3.0) &lt;a href="http://us2.php.net/manual/en/intro.ming.php"&gt;create&lt;/a&gt; Flash animations (the code's been moved into a separate install for later versions of PHP), so I could use that. I could just code it in ActionScript and somehow compile it. Either way, I don't know anything about coding Flash animations, how they can connect to the database and page elements, how to write them without depending on expensive software, etc., so it'd mean a bit of work to learn a new language. Any ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-2778957358682873755?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/2778957358682873755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=2778957358682873755' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2778957358682873755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2778957358682873755'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/09/flash-rather-than-processing.html' title='Flash rather than Processing?'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-2627741483316034708</id><published>2008-08-21T15:57:00.004-04:00</published><updated>2008-08-21T16:17:33.120-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GraphViz'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Summer of Code'/><category scheme='http://www.blogger.com/atom/ns#' term='dbgraphnav'/><title type='text'>dbgraphnav up</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_d_GbbmZu7dM/SK3KfOO-ZRI/AAAAAAAAB3Y/wG4YLFbg5DE/s1600-h/71f47e8e3aaab9c589511567007e1c76ddba682c.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_d_GbbmZu7dM/SK3KfOO-ZRI/AAAAAAAAB3Y/wG4YLFbg5DE/s400/71f47e8e3aaab9c589511567007e1c76ddba682c.png" alt="" id="BLOGGER_PHOTO_ID_5237064579447416082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Paul McMillan has been working hard at his &lt;a href="http://code.google.com/p/dbgraphnav/"&gt;dbgraphnav&lt;/a&gt; Google Summer of Code project, and it's now pretty much ready to use. I've installed it on TreeTapper (see an example &lt;a href="http://treetapper.nescent.org/person/49"&gt;here&lt;/a&gt;). This allows navigation of author and reference relationships, a visual complement to the coauthor and reference tables already  present. It's a general tool allowing navigation of relational databases with a lot of user configuration options. After all Paul's work, and our frequent IRC conversations, it's good to see it running. One nice aspect of it is caching: GraphViz takes a long time to draw graphs, and there's a user-set option to cache by time or by using diff to only update graphs that have changed (the latter works remarkably fast). I'll be firing off a few scripts tonight to generate cached files for all the people and references in the database to make it easier for people to use.&lt;br /&gt;&lt;br /&gt;One aspect of the project I've been disappointed by is GraphViz itself. When I proposed this project, it seemed like the logical choice to use, but I've been  amazed at some of its limitations. For example, on graphs with many nodes, using "neato" layout (an undirected graph layout), some nodes are far from the rest of the graph (see &lt;a href="http://treetapper.nescent.org/person/71"&gt;Michael Donoghue's TreeTapper page&lt;/a&gt; for an example). This results in nodes in the center being tightly clumped while nodes at the edges have far too much whitespace around them. No matter what options we've tried for desired edge length, spring parameter, etc., we just can't make GraphViz pull those far off nodes in. Any suggestions? Other than that sort of annoyance, though, this should be a very useful addition to TreeTapper and perhaps other websites as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-2627741483316034708?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/2627741483316034708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=2627741483316034708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2627741483316034708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2627741483316034708'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/08/dbgraphnav-up.html' title='dbgraphnav up'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_d_GbbmZu7dM/SK3KfOO-ZRI/AAAAAAAAB3Y/wG4YLFbg5DE/s72-c/71f47e8e3aaab9c589511567007e1c76ddba682c.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-640494059371420590</id><published>2008-07-11T16:28:00.005-04:00</published><updated>2008-07-11T16:43:57.500-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='progress'/><category scheme='http://www.blogger.com/atom/ns#' term='Subversion'/><title type='text'>Status</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_d_GbbmZu7dM/SHfFxX4ji_I/AAAAAAAABK4/UIps65RfF40/s1600-h/TreeTapperCommits.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_d_GbbmZu7dM/SHfFxX4ji_I/AAAAAAAABK4/UIps65RfF40/s400/TreeTapperCommits.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5221859744974867442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've been quiet on the blog lately. I was prepping for the Evolution meetings; since coming back, I've been mostly focusing on a revision of a paper. Paul McMillan's Google Summer of Code project is running along well (&lt;a href="http://code.google.com/p/dbgraphnav/"&gt;dbgraphnav&lt;/a&gt;) -- a beta might be on TreeTapper as early as next week. Already, it can be used to navigate from author to paper to author again -- since the database has many authors and papers already (~2000), it's pretty useful.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I just made something to parse a series of &lt;a href="http://subversion.tigris.org/"&gt;subversion&lt;/a&gt; logs to look at commits over time (so I can see how I'm allocating effort between projects). Here's a plot of TreeTapper commits. Some of the commits are automated backups of the DB, so it gives an overestimate of my productivity. However, it only tracks changes to the code, not additions to the database itself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-640494059371420590?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/640494059371420590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=640494059371420590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/640494059371420590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/640494059371420590'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/07/status.html' title='Status'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_d_GbbmZu7dM/SHfFxX4ji_I/AAAAAAAABK4/UIps65RfF40/s72-c/TreeTapperCommits.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-7581006267727146509</id><published>2008-05-20T11:33:00.001-04:00</published><updated>2008-05-20T14:35:53.808-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Processing'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='YUI'/><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Postgres'/><title type='text'>Viewing missing methods/software, part VI: Processing done!</title><content type='html'>I've written the code to generate the missing methods/software tree diagram using Processing. The relevant page is &lt;a href="http://treetapper.nescent.org/findneed.php"&gt;http://treetapper.nescent.org/findneed.php&lt;/a&gt; . I've designed it so that as data streams back from the database via a PHP script, Processing draws this on the diagram in real time. As users update the sortable list of options (tree type, general question, etc.) (using YUI drag and drop), a Javascript function updates the string (stored in a Javascript variable) that is passed to the PHP script. Processing checks this string (so, Java talking to a Javascript object), and if it has changed, Processing closes its old connection to the PHP script and opens a new one using the new options. It thus dynamically updates the chart and is far faster than Google Maps API. It's also easy to do sophisticated animations easily in Processing: currently, I have the nodes flying out of their parents, zooming and shifting the image, and point highlighting on mouseover. These actually don't slow down the rendering: I have the script written so that it only adds a new node to the diagram once the previous node has reached its destination, which sets an upper limit on rendering speed, but I override this and put many nodes on the tree at once if there's a backlog (&gt;10 nodes read from the server but not drawn yet). There is rarely such a backlog, indicating that nodes are being drawn as fast as the server is passing them to Processing. It's pretty cool to be able to visualize where our field needs work (or, rather, where I need to fill in the database) using a dynamic interface, and also surprising that it wasn't too bad to program (especially considering I didn't know Processing/Java, Javascript, PHP, or Postgres when I started this in November 2007). Here is a video showing the new site being used (also available &lt;a href="http://www.screencast.com/t/8ZHHUTSgy"&gt;here&lt;/a&gt;); you may need to widen your browser window to see it all. As always, suggestions are encouraged.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="958" height="960"&gt; &lt;param name="movie" value="http://content.screencast.com/bootstrap.swf"&gt; &lt;param name="quality" value="high"&gt; &lt;param name="bgcolor" value="#FFFFFF"&gt; &lt;param name="flashVars" value="thumb=http://content.screencast.com/media/a0075516-6ebb-46cf-9c0c-6a7585444969_7b5807ec-6cea-4d1a-a15c-e22201cf7c9c_static_0_0_Thumbnail.gif&amp;amp;content=http://content.screencast.com/media/86399d7f-f252-4678-9b0e-99b3160ed98d_7b5807ec-6cea-4d1a-a15c-e22201cf7c9c_static_0_0_00000001.swf&amp;amp;width=958&amp;amp;height=960"&gt; &lt;param name="allowFullScreen" value="true"&gt; &lt;param name="scale" value="showall"&gt; &lt;param name="allowScriptAccess" value="always"&gt;  &lt;embed src="http://content.screencast.com/bootstrap.swf" quality="high" bgcolor="#FFFFFF" width="958" height="960" type="application/x-shockwave-flash" allowscriptaccess="always" flashvars="thumb=http://content.screencast.com/media/a0075516-6ebb-46cf-9c0c-6a7585444969_7b5807ec-6cea-4d1a-a15c-e22201cf7c9c_static_0_0_Thumbnail.gif&amp;amp;content=http://content.screencast.com/media/86399d7f-f252-4678-9b0e-99b3160ed98d_7b5807ec-6cea-4d1a-a15c-e22201cf7c9c_static_0_0_00000001.swf&amp;amp;width=958&amp;amp;height=960" allowfullscreen="true" scale="showall"&gt;&lt;/embed&gt; &lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-7581006267727146509?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/7581006267727146509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=7581006267727146509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7581006267727146509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7581006267727146509'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/05/viewing-missing-methodssoftware-part-vi.html' title='Viewing missing methods/software, part VI: Processing done!'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-7665933138295428571</id><published>2008-05-08T18:08:00.011-04:00</published><updated>2008-05-08T18:35:57.628-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design choices'/><category scheme='http://www.blogger.com/atom/ns#' term='Processing'/><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps api'/><category scheme='http://www.blogger.com/atom/ns#' term='optimization'/><title type='text'>Viewing missing methods/software, part V: Processing</title><content type='html'>&lt;div style="text-align: left;"&gt;In my previous &lt;a href="http://treetapper-dev.blogspot.com/2008/05/viewing-missing-methodssoftware-part-iv.html"&gt;post&lt;/a&gt;, I was  bemoaning the slow speed of the visualization chart using Google Maps. Looking around in the &lt;a href="http://groups.google.com/group/Google-Maps-API"&gt;Google Maps group&lt;/a&gt;, it seemed that there wasn't a good way to speed up the drawing of many markers, except for drawing them in another program first and storing them on image tiles. Since I was going to have to draw markers in a different program anyway, I decided to try using such a program by itself without involving Google Maps. First, I thought to create a static image using GD with PHP and then do an image map on top of that with javascript, but GD wasn't working on the NESCent server (this was fixed in just a couple of hours, as is common with NESCent's great tech support). While it was being fixed, I decided to learn Processing — I've been impressed by the quality of some of the diagrams it creates, and having a dynamic diagram might be more useful for users. It has good documentation and can parse XML, so within a few hours, I learned enough to be able to create the diagram below. &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_d_GbbmZu7dM/SCN9z1F4NBI/AAAAAAAABKc/H1lUK3dSeto/s400/processing.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5198136724294218770" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Following advice from the TreeTapper design consultant (my wife), I made the nodes smaller and changed the color slightly, but otherwise it is the same as the Google diagram (though I don't have popups or mouseovers working yet), and is much faster to create. It does require users to have Java installed in their browsers, but might allow cool features later on.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-7665933138295428571?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/7665933138295428571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=7665933138295428571' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7665933138295428571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7665933138295428571'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/05/viewing-missing-methodssoftware-part-v.html' title='Viewing missing methods/software, part V: Processing'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_d_GbbmZu7dM/SCN9z1F4NBI/AAAAAAAABKc/H1lUK3dSeto/s72-c/processing.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-7341662798816498227</id><published>2008-05-08T10:24:00.005-04:00</published><updated>2008-05-08T12:27:23.075-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Design choices'/><category scheme='http://www.blogger.com/atom/ns#' term='charts'/><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps api'/><category scheme='http://www.blogger.com/atom/ns#' term='optimization'/><title type='text'>Viewing missing methods/software, part IV: Sort of working</title><content type='html'>&lt;div&gt;Well, I sort of have the visualization working. Users can choose which elements to graph (on Firefox) by dragging boxes to move them above or below a plotting line, and they can choose to limit to plotting only one of many options. See below.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_d_GbbmZu7dM/SCMOWVF4M5I/AAAAAAAABJc/khVq5-pJRFU/s400/ChartTop.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5198014171697394578" /&gt;&lt;div&gt;On clicking the  update chart button, a tree is plotted using the Google Maps API, with branches colored based on whether they have no methods or software, methods but not software, or both methods and software [I originally had it update the map automatically on any change, but this is too slow]. Users can click on nodes to get an info window showing the choices made going from the tree root to the tips and links to any relevant software or methods. Just mousing over a node tells a user what option that node represents (i.e., "Treetype: Unrooted, polytomies, incomplete tree"). If a user has chosen just one setting for an option (as for criterion, below), the edge leading to that node is shorter and light gray edges are shown to indicate the options not examined.  See below (click to make larger).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_d_GbbmZu7dM/SCMNJFF4M4I/AAAAAAAABJU/HI75V4TQjrI/s1600-h/ScreenShot.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_d_GbbmZu7dM/SCMNJFF4M4I/AAAAAAAABJU/HI75V4TQjrI/s400/ScreenShot.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5198012844552500098" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;div style="text-align: left;"&gt;The end product is beautiful and information-rich. It's also VERY slow. It takes literally minutes to generate the plot, and then &gt;10 seconds between clicking on a node and getting the info window. Zooming in or out or moving the plot also take an agonizingly slow time. Getting info from the script that talks to the database to make code for the map takes a while, about 30 seconds, but the real slowdown comes when drawing the map. Google maps are slow with many markers and polylines: the map above has 221 markers and even more polylines, with the three circle polylines having 360 points each (using fewer makes a plot that's too rough). I'll have to decide what to do. I'd stayed away from &lt;a href="http://processing.org/"&gt;Processing&lt;/a&gt; due to usability concerns, but it seems Google Maps isn't so great, either. I've read a little about generating image tiles rather than markers to speed up the map -- I'll look into this and other options. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-7341662798816498227?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/7341662798816498227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=7341662798816498227' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7341662798816498227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7341662798816498227'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/05/viewing-missing-methodssoftware-part-iv.html' title='Viewing missing methods/software, part IV: Sort of working'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_d_GbbmZu7dM/SCMOWVF4M5I/AAAAAAAABJc/khVq5-pJRFU/s72-c/ChartTop.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-1260848233339864498</id><published>2008-04-24T14:33:00.003-04:00</published><updated>2008-04-24T14:45:56.849-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actual science'/><category scheme='http://www.blogger.com/atom/ns#' term='ants'/><category scheme='http://www.blogger.com/atom/ns#' term='Brownie'/><title type='text'>Actual science</title><content type='html'>One thing that bothers me is that so far, my project seems to be about database and website design and coding, not science. However, the science comes later: adding items to the DB is at least related to scientific methods, and once the DB is full enough, I'll be able to use it to figure out what new methods need to be created to answer questions (the real goal of the project). I'm also still doing science, despite the impression blog readers might get: this week, I have done a series of likelihood bootstraps on my ant data (I had to move a couple of intron boundaries based on info from genbank, which then required a new partitioned analysis), started doing the power/bias tests for new methods of trait evolution I've developed, worked on analyses for a paper on fish evolution with &lt;a href="http://www.oeb.harvard.edu/faculty/losos/collar/"&gt;Dave Collar&lt;/a&gt; using new methods in my program &lt;a href="http://www.brianomeara.info/brownie/"&gt;Brownie&lt;/a&gt;, talked to a student about models of gene evolution [see my &lt;a href="http://www.pubmedcentral.nih.gov/articlerender.fcgi?tool=pubmed&amp;amp;pubmedid=18039874#id2751780"&gt;published authored appendix&lt;/a&gt; on this], and twiddled my thumbs waiting for reviews on a species delimitation paper (&gt;9 weeks in review so far [but at least it's in review]). &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-1260848233339864498?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/1260848233339864498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=1260848233339864498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/1260848233339864498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/1260848233339864498'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/04/actual-science.html' title='Actual science'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-6015305853408230047</id><published>2008-04-24T14:00:00.004-04:00</published><updated>2008-04-24T14:47:12.007-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='schema'/><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Missing methods'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Viewing missing methods/software, part III: Table views</title><content type='html'>Repeat of the design goals for viewing missing methods/software: &lt;div&gt;&lt;ol&gt;&lt;li&gt;Allow users to see on a tree (using branch coloring) which questions don't have methods, which methods aren't in software, etc.&lt;/li&gt;&lt;li&gt;Allow users to arrange the order in which things are displayed: question-&gt;criterion-&gt;method, or question-&gt;character type 1 -&gt; tree type -&gt; branch length type -&gt; data format -&gt; software&lt;/li&gt;&lt;li&gt;Allow users to filter by option (only show methods relating to DNA data, for example)&lt;/li&gt;&lt;li&gt;Make it fast, intuitive, etc.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;I think a way to address these is to create table &lt;a href="http://www.postgresql.org/docs/8.3/interactive/tutorial-views.html"&gt;views&lt;/a&gt;; one has all the available methods ("actualmethods"), one has all the available methods and software ("actualsoftware"), and one could have all the imaginable combinations of all options ("biggie"). That way, all the database logic for combining the primitive tables (method-&gt;methodtotreetypetobranchlengthtype-&gt;treetype, for example) is taken care of at the view creation step, rather than requiring it all to be created on the fly when a user re-orders options. [Aha: so this is a reason for using &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;MVC&lt;/a&gt;]. To draw the tree of methods/software based on user choice, one gets the tree structure by looking in the [actually hypothetical] "biggie" table; combinations (edges on the display tree) present in the "actualsoftware" table are shown in the "+methods +software" color (&lt;span class="Apple-style-span" style="color: rgb(102, 0, 204);"&gt;purple&lt;/span&gt;?), combinations not present there but in the "actualmethods" table get the "+methods -software" color (black?), and others get the "-methods -software" color (&lt;span class="Apple-style-span" style="color: rgb(153, 153, 153);"&gt;gray&lt;/span&gt;?). The only problem with this is the size of the "biggie" table view: except for built-in relations between general and posed questions and posed questions and relevant combinations of characters (see schema), it's basically a massive &lt;a href="http://en.wikipedia.org/wiki/Join_(SQL)#Cross_join"&gt;cross join&lt;/a&gt;. That means that if there are 2 data formats, 6 tree formats, and 7 platforms, the table has 2 x 6 x 7 = 84 rows.  The actual "biggie" table, having info on all the imaginable options (input formats, tree types, character types, criteria, etc.) would currently have 1,361,817,600 (1.3 billion) distinct rows. Instead of creating such a huge table, I will have a view ("generaltoposedtochartype") containing the essential relations between general question, posed question, and character combinations (only 2,480 rows currently) and then just have the program returning possible branches for the tree know that all the other options can essentially be cross joined.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I had a bit of trouble creating the initial "actualmethods" view efficiently; &lt;a href="https://www.nescent.org/wg_phyloinformatics/User:Hlapp"&gt;Hilmar Lapp&lt;/a&gt;, an IT guru here at NESCent (codes for BioPerl, organizes hackathons, organizes people) edited the query to make it more efficient and eliminate return of duplicate rows (without using "distinct"). Below I've posted the sql statement used to make these views in case it's useful for others (or for me in the future).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;-- All actual methods&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;CREATE VIEW &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualmethods&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualmethods_generalquestion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualmethods_posedquestion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualmethods_char1,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualmethods_char2,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualmethods_char3,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualmethods_treetype,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualmethods_branchlengthtype,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualmethods_criterion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualmethods_method&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AS&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;pq.posedquestion_generalquestion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;pq.posedquestion_id,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;cc.charactercombination_char1, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;cc.charactercombination_char2, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;cc.charactercombination_char3,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;mttblt.methodtotreetypetobranchlengthtype_treetype,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;mttblt.methodtotreetypetobranchlengthtype_branchlengthtype,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;mc.methodtocriterion_criterion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;mttblt.methodtotreetypetobranchlengthtype_method&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtotreetypetobranchlengthtype mttblt,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtocriterion mc,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtocharactercombination mcc,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtoposedquestion mpq,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestion pq,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;charactercombination cc,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestiontocharactercombination pqcc&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtocriterion_method=methodtotreetypetobranchlengthtype_method&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtocharactercombination_method=methodtotreetypetobranchlengthtype_method&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtocharactercombination_charactercombination=charactercombination_id&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtoposedquestion_method=methodtotreetypetobranchlengthtype_method&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtoposedquestion_posedquestion=posedquestion_id&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestiontocharactercombination_posedquestion=posedquestion_id&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestiontocharactercombination_charactercombination=charactercombination_id&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;-- all actual methods and software&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;CREATE VIEW &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_generalquestion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_posedquestion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_char1,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_char2,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_char3,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_treetype,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_branchlengthtype,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_criterion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_method,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_dataformat,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_treeformat,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_applicationkind,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_platform,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;actualsoftware_program&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AS&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;pq.posedquestion_generalquestion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;pq.posedquestion_id,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;cc.charactercombination_char1, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;cc.charactercombination_char2, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;cc.charactercombination_char3,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;mttblt.methodtotreetypetobranchlengthtype_treetype,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;mttblt.methodtotreetypetobranchlengthtype_branchlengthtype,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;mc.methodtocriterion_criterion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;mttblt.methodtotreetypetobranchlengthtype_method,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;pdf.programtodataformat_dataformat, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ptf.programtotreeformat_treeformat, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ppak.programtoplatformappkind_applicationkind, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ppak.programtoplatformappkind_platform, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;pmcc.programtomethodtocharactercombination_program&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtotreetypetobranchlengthtype mttblt,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtocriterion mc,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtocharactercombination mcc,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtoposedquestion mpq,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestion pq,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;charactercombination cc,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestiontocharactercombination pqcc,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;programtodataformat pdf,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;programtotreeformat ptf,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;programtomethodtocharactercombination pmcc,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;programtoplatformappkind ppak&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtocriterion_method=methodtotreetypetobranchlengthtype_method&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtocharactercombination_method=methodtotreetypetobranchlengthtype_method&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtocharactercombination_charactercombination=charactercombination_id&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtoposedquestion_method=methodtotreetypetobranchlengthtype_method&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;methodtoposedquestion_posedquestion=posedquestion_id&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestiontocharactercombination_posedquestion=posedquestion_id&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestiontocharactercombination_charactercombination=charactercombination_id&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;programtomethodtocharactercombination_methodtocharactercombination=methodtocharactercombination_id&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;programtomethodtocharactercombination_program=programtodataformat_program&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;programtodataformat_program=programtotreeformat_program&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;programtotreeformat_program=programtoplatformappkind_program&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;-- all general+posedquestions+chartypes&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;CREATE VIEW&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;generaltoposedtochartype&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;generaltoposedtochartype_generalquestion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;generaltoposedtochartype_posedquestion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;generaltoposedtochartype_char1,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;generaltoposedtochartype_char2,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;generaltoposedtochartype_char3&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AS&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;generalquestion_id,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestion_id, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;charactercombination.charactercombination_char1, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;charactercombination.charactercombination_char2, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;charactercombination.charactercombination_char3&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;charactercombination,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestiontocharactercombination,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;generalquestion&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestion_generalquestion=generalquestion_id&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestiontocharactercombination_charactercombination=charactercombination_id&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AND&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;posedquestiontocharactercombination_posedquestion=posedquestion_id&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;-- all conceivable combinations of parameters other than question and chartype (a massive cross join, probably not used)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;CREATE VIEW&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;crossjoinoptions&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;crossjoinoptions_treetype,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;crossjoinoptions_branchlengthtype,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;crossjoinoptions_criterion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;crossjoinoptions_dataformat,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;crossjoinoptions_treeformat,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;crossjoinoptions_applicationkind,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;crossjoinoptions_platform&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;AS&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;SELECT &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;treetype_id, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;branchlengthtype_id, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;criterion_id,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;dataformat_id,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;treeformat_id,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;applicationkind_id,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;platform_id&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;treetype,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;branchlengthtype,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;criterion,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;dataformat,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;treeformat,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;applicationkind,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;platform&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&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/3550570499618792354-6015305853408230047?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/6015305853408230047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=6015305853408230047' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/6015305853408230047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/6015305853408230047'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/04/viewing-missing-methodssoftware-part.html' title='Viewing missing methods/software, part III: Table views'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-531372371382098968</id><published>2008-04-23T12:20:00.003-04:00</published><updated>2008-04-23T12:22:12.677-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Evolution 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='presentation'/><title type='text'>Evolution talk</title><content type='html'>I'm giving a talk at &lt;a href="http://www.cce.umn.edu/conferences/evolution/"&gt;Evolution 2008&lt;/a&gt; in June on TreeTapper and information learned about missing methods/software so far (the idea is that there will be something learnable by that point, besides the proper use of YUI APIs). No word on time/session yet. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-531372371382098968?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/531372371382098968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=531372371382098968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/531372371382098968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/531372371382098968'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/04/evolution-talk.html' title='Evolution talk'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-8244781576388004461</id><published>2008-04-23T12:06:00.003-04:00</published><updated>2008-04-23T12:19:02.513-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='YUI'/><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps api'/><title type='text'>Viewing missing methods/software, part II</title><content type='html'>It appears the strategy of using Google Maps with YUI display of items to add to the map will basically work. Rather than doing drag and drop between YUI datatables, I'm using just the drag and drop YUI code on a list of options, each with the possibility of limiting it to one item (for example, one can first organize by optimality criterion, deciding to show all or just likelihood). The interface is based on the YUI &lt;a href="http://developer.yahoo.com/yui/examples/dragdrop/dd-reorder.html"&gt;example&lt;/a&gt;, but with just one list, with one element of a different color so that options placed above this element appear on the tree while ones below do not (inspired by "the line" on Google Summer of Code's mentorship application). I originally thought of having two lists side by side, allowing people to move elements from one list to the other, but this was too wide for some screens once the possibility of options selection was added. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've also gotten a plain white Google Map (to replace traditional geographic maps) working, as well as overlays. Google maps have a wrapper for &lt;a href="http://en.wikipedia.org/wiki/XMLHttpRequest"&gt;XmlHttpRequest&lt;/a&gt; called &lt;a href="http://code.google.com/apis/maps/documentation/services.html#XML_Requests"&gt;GXmlHttp&lt;/a&gt; that should make refreshing the chart based on user-sorted options possible. Now the question is how to efficiently recover information from the database to draw the tree, highlighting which branches lead to software+methods, just methods, or nothing.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-8244781576388004461?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/8244781576388004461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=8244781576388004461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8244781576388004461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8244781576388004461'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/04/viewing-missing-methodssoftware-part-ii.html' title='Viewing missing methods/software, part II'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-4446089974946605906</id><published>2008-04-22T09:46:00.003-04:00</published><updated>2008-04-22T10:26:03.098-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GraphViz'/><category scheme='http://www.blogger.com/atom/ns#' term='WebDot'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Summer of Code'/><title type='text'>Google summer of code</title><content type='html'>For &lt;a href="http://code.google.com/soc/2008/"&gt;Google Summer of Code&lt;/a&gt;, &lt;a href="http://www.nescent.org"&gt;NESCent&lt;/a&gt; had 11 project ideas, 31 applicants, and just 5 slots. &lt;a href="http://thefire.us/"&gt;Paul McMillan&lt;/a&gt;, an undergraduate student at UC Berkeley, was one of the applicants and proposed working on the &lt;a href="http://www.graphviz.org/webdot/"&gt;WebDot&lt;/a&gt; navigation of databases project (though he might end up using &lt;a href="http://www.graphviz.org/"&gt;GraphViz&lt;/a&gt; directly, rather than &lt;a href="http://www.graphviz.org/webdot/"&gt;WebDot&lt;/a&gt;). His application was detailed and showed good background knowledge; more impressive were his conversations (over &lt;a href="http://en.wikipedia.org/wiki/Internet_Relay_Chat"&gt;IRC&lt;/a&gt;) regarding the problem, where it became evident that he had given it a lot of thought and certainly had the background to do this. This project should help with TreeTapper navigation (looking at coauthor networks, for example) and become an easy-to-use solution for other website developers. Congrats to Paul. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This was my first year with Google Summer of Code. I was impressed by the quality of the applications NESCent-affiliated projects received and how passionate the students are about them (several whose projects didn't get funding have volunteered to work on them anyway, which is amazing (since they'll have to do something else for money, and  so will have less time)).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-4446089974946605906?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/4446089974946605906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=4446089974946605906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/4446089974946605906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/4446089974946605906'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/04/google-summer-of-code.html' title='Google summer of code'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-3204116103288097358</id><published>2008-04-21T09:46:00.009-04:00</published><updated>2008-04-21T10:26:40.667-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Missing methods'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps api'/><title type='text'>Viewing missing methods/software</title><content type='html'>The key interesting thing about TreeTapper for me is the ability to find missing methods or software. Any list of software and methods will tell you what's available (and isn't trivial to make), but for developers, finding what doesn't exist yet is key. At first, I was just doing a typical treeview (not in the phylogeny sense, but in the nested series of folders sense):&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_d_GbbmZu7dM/SAycAdx3QZI/AAAAAAAABI4/6UWthEknR0Y/s320/TreeView.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5191696002259042706" /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;I started adding the beginnings of  bar plots (the red squares above) to show the number of techniques/question available for each topic. The problem with this is that it's very hard to get a quick overview of what's missing: a user has to drill down into each section and remember what's there (sensible display of some of this in with bar plots might help, but it's still not great).  But thinking about it, what would be good to show is an actual &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;tree&lt;/span&gt;: for a given starting point (such as a topic: speciation rate), and then all possible descendants (such as all possible questions for this topic). Those descendants available in methods/software get one branch color (say, black), those not get another branch color (gray) [though it might be good to distinguish those present in methods but not software]. Here's a hand-drawn example for the basic idea:&lt;/div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_d_GbbmZu7dM/SAyeINx3QaI/AAAAAAAABJA/NmRQkNL2AeQ/s400/Picture+4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5191698334426284450" /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;And with colors and labels:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_d_GbbmZu7dM/SAyeudx3QbI/AAAAAAAABJI/YyDAektIWbs/s400/Picture+3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5191698991556280754" /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Under this approach, it's easy to distinguish areas with methods/software available (black/solid) from those lacking methods or software (gray/translucent). In the example above, the central dot represents a topic, the first circle represents questions, the second circle criteria, the third perhaps character type, etc. Derrick Zwickl had the good suggestion to allow users to set the order in which options are plotted; I'd also like to allow users to fix certain values (only look for missing methods under a likelihood criterion, for example).&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;The problem is that this is just a dummy layout, drawn in Apple Keynote, not actually a working image. The question becomes how to make it. I'm thinking of first having a YUI table with the various options to plot (criterion, method, character types, etc.), and then having a second table (or allowing ranking on the first table) where users can drag the options to plot them on the tree in the given order (see an example of something grossly similar &lt;a href="http://satyam.com.ar/yui/2.5.0/invoice.html"&gt;here&lt;/a&gt;). One problem may be writing the logic to be able to look at all the options for variable Y when it descends from variable X, including which ones are and are not available, when what X and Y are is up to the user (perhaps comparing a cross-join and a left-join postgres table, or something like that, would be the key). Another question is how to actually generate the plot. There are  various Java libraries for interactive data plotting (the first thing I would try if I went this route would be generating an interface with &lt;a href="http://processing.org/"&gt;Processing&lt;/a&gt;), but many of them failed when I tried them with the most recent version of Mac's Safari, and Java online (and on the desktop, too) always feels a bit clunky to me. There are various ways to make plots on the web (such as &lt;a href="http://code.google.com/apis/chart/"&gt;Google Charts&lt;/a&gt; and &lt;a href="http://developer.yahoo.com/yui/charts/"&gt;Yahoo Charts&lt;/a&gt;), but they only have a few mouseover options. I'm actually thinking of using the &lt;a href="http://code.google.com/apis/maps/"&gt;Google Maps API &lt;/a&gt;for this. Using that, plotting points, lines, and areas is now possible, and users can get information on nodes by clicking on them and one can add various javascript functions called onmouseover, onclick, etc. Users will be able to zoom in on parts of a tree. Finally, one can add custom map tiles to replace the Google tiles; in my case, I'd just have a white background, and do all the plotting with polylines and the like. This sort of use of Google Maps been done before; I remember Katy Böhner mentioning this in a talk (though I couldn't find anything on her lab's &lt;a href="http://ivl.slis.indiana.edu/"&gt;website&lt;/a&gt;), and there are other examples online. &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Well, we'll see how it goes. As with all posts, please feel free to make suggestions in the comments.&lt;/div&gt;&lt;div style="text-align: center;"&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/3550570499618792354-3204116103288097358?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/3204116103288097358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=3204116103288097358' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/3204116103288097358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/3204116103288097358'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/04/viewing-missing-methodssoftware.html' title='Viewing missing methods/software'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_d_GbbmZu7dM/SAycAdx3QZI/AAAAAAAABI4/6UWthEknR0Y/s72-c/TreeView.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-7562376045736995760</id><published>2008-04-08T16:33:00.002-04:00</published><updated>2008-04-08T16:37:04.509-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='citations'/><category scheme='http://www.blogger.com/atom/ns#' term='citeseerX'/><title type='text'>CiteSeerX launched</title><content type='html'>An alpha version of &lt;a href="http://citeseerx.ist.psu.edu/"&gt;CiteSeerX&lt;/a&gt; has launched. This is cool, because it provides a way to get citation counts by crawling the web (unlike Thompson ISI or Google Scholar). Its database is limited to computer science (which includes many phylogeny articles, but not enough), so I'd have to get a copy of the source code (not evident where to download this yet) and start crawling on my own.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-7562376045736995760?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/7562376045736995760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=7562376045736995760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7562376045736995760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7562376045736995760'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/04/citeseerx-launched.html' title='CiteSeerX launched'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-6532972790856220958</id><published>2008-03-26T17:23:00.003-04:00</published><updated>2008-04-30T13:56:59.805-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GraphViz'/><category scheme='http://www.blogger.com/atom/ns#' term='WebDot'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Summer of Code'/><title type='text'>Google summer of code</title><content type='html'>&lt;a href="http://www.nescent.org/"&gt;NESCent&lt;/a&gt; is a hosting organization for &lt;a href="http://code.google.com/soc/2008"&gt;Google Summer of Code&lt;/a&gt;; I've proposed a &lt;a href="https://www.nescent.org/wg/phyloinformatics/index.php?title=Phyloinformatics_Summer_of_Code_2008#WebDot_navigation_of_databases"&gt;project&lt;/a&gt; to make a tool to allow databases to be navigated visually (essentially by combining &lt;a href="http://www.graphviz.org/webdot"&gt;WebDot&lt;/a&gt; (part of &lt;a href="http://www.graphviz.org/"&gt;GraphViz&lt;/a&gt;) with something like &lt;a href="http://search.cpan.org/~jrobinson/SQL-Translator-0.0900/bin/sqlt-diagram"&gt;sqlt-diagram,&lt;/a&gt; but for navigating table entries rather than just looking at the schema). Only one interested student so far; if it's not funded, I'll likely do it myself later for TreeTapper.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-6532972790856220958?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/6532972790856220958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=6532972790856220958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/6532972790856220958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/6532972790856220958'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/03/google-summer-of-code.html' title='Google summer of code'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-5834858720483961470</id><published>2008-03-21T10:17:00.002-04:00</published><updated>2008-03-21T10:31:49.663-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='methods'/><category scheme='http://www.blogger.com/atom/ns#' term='YUI'/><title type='text'>Progress update</title><content type='html'>I've started adding some methods to the database. It always feels a bit odd to shoehorn a method into a database like this, but it should be useful in the end. I'm also working on a better (i.e., working) findmethod/tool page. As users select options, the table of methods will automatically update. Maybe. I've also updated to YUI 2.5.1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-5834858720483961470?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/5834858720483961470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=5834858720483961470' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/5834858720483961470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/5834858720483961470'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/03/progress-update.html' title='Progress update'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-985219663257374346</id><published>2008-02-29T11:26:00.002-05:00</published><updated>2008-02-29T11:31:09.305-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='captcha'/><category scheme='http://www.blogger.com/atom/ns#' term='EOL'/><category scheme='http://www.blogger.com/atom/ns#' term='reCAPTCHA'/><title type='text'>Captcha</title><content type='html'>To prevent bots from registering for the site and adding spam, &lt;a href="http://en.wikipedia.org/wiki/Captcha"&gt;captchas&lt;/a&gt; are useful, so I know I'll have to add them to TreeTapper before allowing users to register. While signing up for the new &lt;a href="http://www.eol.org/"&gt;Encyclopedia of Life&lt;/a&gt; site, I found they use the &lt;a href="http://recaptcha.net"&gt;reCAPTCHA&lt;/a&gt; service. This uses scanned words from books as images for people to interpret (people receive a pair of words, one known and one unknown). Free captcha service, plus gets people to help digitize books -- sounds like something I'll use for TreeTapper.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-985219663257374346?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/985219663257374346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=985219663257374346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/985219663257374346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/985219663257374346'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/02/captcha.html' title='Captcha'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-7532110702825345411</id><published>2008-02-22T17:52:00.005-05:00</published><updated>2008-02-22T18:17:33.096-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='YUI'/><category scheme='http://www.blogger.com/atom/ns#' term='datatable'/><title type='text'>Upgrading to YUI 2.5.0</title><content type='html'>I'm upgrading the site to use YUI 2.5.0 (the previous version was 2.4.1). I decided to do this because the new version has many more features in data tables, and much of the utility of the TreeTapper site comes from interaction with data tables. The process of upgrading isn't too bad: the only problem has been needing to either add a "?" at the end of datasource files and then using initialRequest, or at least setting initialRequest to "" rather than the new default of "null" [under 2.4.1,&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;this.myDataSource = new YAHOO.util.DataSource("templates/vocabtable_js.php? table=applicationkind");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;worked, while under 2.5.0, it is transmitted as&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;[URL]/templates/vocabtable_js.php?table=applicationkind&lt;span style="font-weight: bold;"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;which won't work. The solution is to do either&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;    this.myDataSource = new YAHOO.util.DataSource("templates/vocabtable_js.php?");&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt; [...]&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:78%;"&gt;    this.myDataTable = new YAHOO.widget.DataTable( "applicationkind", myColumnDefs,this.myDataSource, {initialRequest:"table=applicationkind"});&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;or&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;this.myDataSource = new YAHOO.util.DataSource( "templates/vocabtable_js.php?table=applicationkind" );&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;[...]&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt; this.myDataTable = new YAHOO.widget.DataTable("applicationkind", myColumnDefs,this.myDataSource, {initialRequest:""});&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The first option seems better].&lt;br /&gt;&lt;br /&gt;The new version also has &lt;a href="http://developer.yahoo.com/yui/datasource/#parsers"&gt;parsers&lt;/a&gt; (perhaps they were there before, but I missed them) that allow text coming over XHR to be converted to numbers, allowing numerical sorting.&lt;br /&gt;&lt;br /&gt;The new version has at least a couple of downsides. First, making the tables seems slower (see this &lt;a href="http://tech.groups.yahoo.com/group/ydn-javascript/message/25852"&gt;discussion&lt;/a&gt;), which is a problem when you need big tables, as TreeTapper does, and column headers are now drawn separately, and it can take a long time (&gt;5 seconds) for them to line up with the corresponding column in the table.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-7532110702825345411?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/7532110702825345411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=7532110702825345411' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7532110702825345411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/7532110702825345411'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/02/upgrading-to-yui-250.html' title='Upgrading to YUI 2.5.0'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-2592942496525329297</id><published>2008-02-19T15:15:00.005-05:00</published><updated>2008-02-19T15:25:06.015-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='YUI'/><category scheme='http://www.blogger.com/atom/ns#' term='charts'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Google charts</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_d_GbbmZu7dM/R7s7A8WFHoI/AAAAAAAABHM/a0zsCWunuRg/s1600-h/Picture+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_d_GbbmZu7dM/R7s7A8WFHoI/AAAAAAAABHM/a0zsCWunuRg/s400/Picture+1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5168789884722552450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;I've added some &lt;a href="http://code.google.com/apis/chart/"&gt;Google charts&lt;/a&gt; to the front page of the &lt;a href="http://www.treetapper.org/"&gt;TreeTapper&lt;/a&gt; site. I'm using &lt;a href="http://code.google.com/p/googlechartseasyphpclass/"&gt;googlechartseasyphpclass v 1.02&lt;/a&gt; to more easily generate the code to call the charts (it involves converting numbers to letters for plotting, for one thing), though it does limit flexibility a bit (but the source code for the PHP script can be modified easily). &lt;a href="http://developer.yahoo.com/yui/"&gt;YUI&lt;/a&gt; also has a new &lt;a href="http://developer.yahoo.com/yui/charts/"&gt;charts API&lt;/a&gt;, but it requires a very recent version of Flash for people to use (more recent than I had in FireFox) -- Google can simply create a png, which is convenient. The code to make the data to pass to the charts takes a little while to work (dozens of postgres calls): I might just update this daily and have the site call a saved version of the data. The charts I've made allow tracking of how much the database has grown in the previous month as well as breakdowns of references by year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-2592942496525329297?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/2592942496525329297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=2592942496525329297' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2592942496525329297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2592942496525329297'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/02/google-charts.html' title='Google charts'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_d_GbbmZu7dM/R7s7A8WFHoI/AAAAAAAABHM/a0zsCWunuRg/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-6817488511142381258</id><published>2008-02-19T11:01:00.004-05:00</published><updated>2008-02-19T11:18:33.010-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design choices'/><category scheme='http://www.blogger.com/atom/ns#' term='citations'/><title type='text'>Citation counts</title><content type='html'>When deciding which method to use, or on what areas to focus development, the popularity of related references matters. For example, if method A is used 20 times more frequently to answer a given question than method B, in the absence of other information, a naive user should probably use method A. Just counting total citations could be misleading, though: a good new method only available in the last year will take some time to gain as many citations as a poorer older method, despite acquiring citations at a faster rate. Thus, both number and rate matter. I'm thinking of showing both the total number of citations and rate of gain of citations over a year or so; another way of displaying related info would be comparing the number of citations for a paper with the median number of citations for papers published in the same year (perhaps limiting the papers in the reference set to those similar in scope to the paper of interest). To get this info, I'll need citation info, which is not generally available (see earlier &lt;a href="http://treetapper-dev.blogspot.com/2008/01/updated-schema.html"&gt;post&lt;/a&gt;). I'm using the number of hits in Yahoo, using its search API (which gives slightly different numbers than its html form search results) for both all pages and only PDF-formatted pages with an article's title phrase, last name of first author, and publication year. The tricky things getting this to work were converting apostrophes to html characters and making sure to include the title as a phrase, rather than as a string of words. This approach has a few disadvantages: while web hits probably correlate with how many times a paper is cited (early work suggests this is roughly true), it is not wonderfully correlated (but it can pick up hits for interesting new papers faster than waiting for later citing papers to appear), plus it is easier to mislead (I could add my papers' titles, authors, and years as signatures to all my posts and then start posting on various forums: TreeTapper would see my papers as very popular). Perhaps with the upcoming release of the new &lt;a href="http://www2006.org/programme/files/xhtml/p187/pp187-li/pp187-li-xhtml.html"&gt;CiteSeerX&lt;/a&gt;, I can use that system to track citations better. I've set up TreeTapper to store the number of hits for each paper every two weeks; this will allow me to track how the popularity of articles changes through time to recover rate rather than just number of citations. As this recording is new, I'm now only showing total hits until the data are recorded over more time intervals.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-6817488511142381258?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/6817488511142381258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=6817488511142381258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/6817488511142381258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/6817488511142381258'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/02/citation-counts.html' title='Citation counts'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-5117195443906826448</id><published>2008-02-13T16:54:00.000-05:00</published><updated>2008-02-13T14:14:57.054-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='bibutils'/><category scheme='http://www.blogger.com/atom/ns#' term='reference parsing'/><title type='text'>Added people</title><content type='html'>I've gotten the reference parsing to work and have added 1545 references, from which 1840 authors were extracted. To get the references, I looked through various online reference databases (&lt;a href="http://www.ncbi.nlm.nih.gov/PubMed/"&gt;PubMed&lt;/a&gt;, &lt;a href="http://isiknowledge.com/"&gt;ISI Web of Science&lt;/a&gt;) to select articles about methods (searching for particular authors, looking in particular journals (for example, issues of &lt;a href="http://www.systbiol.org/"&gt;Systematic Biology&lt;/a&gt; over the past several years and articles in &lt;a href="http://bioinformatics.oxfordjournals.org/"&gt;Bioinformatics&lt;/a&gt; that mentioned phylogenies), etc.) based on the article titles, downloaded these citations, imported them with their various formats into EndNote, and then exported a RIS-formatted file that I then uploaded to the website (in several chunks) and parsed using &lt;a href="http://www.scripps.edu/~cdputnam/software/bibutils/"&gt;bibutils&lt;/a&gt; conversion and then a custom XML parser written using &lt;a href="http://www.php.net/simplexml"&gt;SimpleXML&lt;/a&gt; in PHP. The XML from bibutils is also saved with each reference in the database, making conversion of user-selected references for export in various formats easier (I hope, but we'll see when I code that). I've also created templates on the development site to automatically display information on the included authors in a &lt;a href="http://en.wikipedia.org/wiki/REST"&gt;RESTful&lt;/a&gt; way: &lt;a href="http://treetapper.nescent.org/person"&gt;http://treetapper.nescent.org/person&lt;/a&gt; will display a paginated table of all the authors in the database with the number of references, methods, and software each has in the database; clicking on an author's name will go to a page listing her or his coauthors (ranked by number of papers in common) and references. For example, going to &lt;a href="http://treetapper.nescent.org/person/23"&gt;http://treetapper.nescent.org/person/23&lt;/a&gt; will go to a page for Mike Sanderson. You can then link from person to person in this way. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Left to do: add XML output as an option, rather than just the html output with datatables; get the datatables to sort properly (currently, &lt;a href="http://developer.yahoo.com/yui/"&gt;Yahoo User Interface&lt;/a&gt; &lt;a href="http://developer.yahoo.com/yui/datatable/"&gt;datatables&lt;/a&gt; (version 2.4.1) sort lexically: sorting [5, 200, 12] gives [12, 200, 5], but author names also aren't sorting properly); and do tables and a REST interface for references (I also want to be able to autocomplete on an author's name and then just display the relevant references). It might be interesting at some point to add a way to output files to visualize author relationships (perhaps with &lt;a href="http://www.graphviz.org/"&gt;Graphviz&lt;/a&gt;); this could also provide another way to &lt;a href="http://www.graphviz.org/webdot/hnodes.html"&gt;navigate&lt;/a&gt; the database.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-5117195443906826448?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/5117195443906826448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=5117195443906826448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/5117195443906826448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/5117195443906826448'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/02/added-people.html' title='Added people'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-8352816894490561341</id><published>2008-02-11T13:24:00.000-05:00</published><updated>2008-02-11T10:41:26.198-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='citations'/><category scheme='http://www.blogger.com/atom/ns#' term='bibutils'/><category scheme='http://www.blogger.com/atom/ns#' term='reference parsing'/><category scheme='http://www.blogger.com/atom/ns#' term='Connotea'/><title type='text'>Parsing references</title><content type='html'>I'm using the same table for authors and users of the site, so that when a new person logs in, that person can see which papers/software are listed with her/him as an author and correct any mistakes. I also want people to be able to search for author names in the database. Both require being able to extract author names from submitted references. I'd originally written a simple RIS parser, but it didn't deal well with input files that had slightly odd formatting. I've thought of using &lt;a href="http://www.connotea.org/"&gt;Connotea&lt;/a&gt; to parse references (its API allows submission of references or just URLs/DOIs, and can return author names, article titles, etc.) but I've found problems with latency (it can take a few minutes for it to load submissions into its database). There is also a problem with its strong URL focus -- I found when uploading a batch of references from Endnote in RIS format, it only loaded one  Bioinformatics citation: somewhere in each RIS record, there was a generic URL for Bioinformatics, so Connotea saw them all as pointing to the same resource. Connotea also has the complementary problem (referred to as "&lt;a href="http://www.nodalpoint.org/2006/12/15/buggotea_redundant_links_in_connotea"&gt;buggotea&lt;/a&gt;") of having the same reference with different URLs (PMID with one submission, DOI with another, for example) entered multiple times in its database. I'll export tagged articles to Connotea, but it probably won't work for reference parsing. Thus, I'm now playing with using Christopher Putnam's &lt;a href="http://www.scripps.edu/~cdputnam/software/bibutils/"&gt;bibutils&lt;/a&gt;, which convert from/to Endnote, RIS, Bibtex, ISI, and other reference formats using an XML intermediate: parsing this XML intermediate for author names should be fairly easy. Once the author names are identified, I have the code for adding authors to the database, including author order, and expanding author names when more information is available (for example, if entering a paper by "M. Sanderson", otherwise unknown in the database, his first name is stored as just "M"; when a later paper by "Michael Sanderson" is entered to the database, the script changes "M Sanderson" to "Michael Sanderson" in the database, assuming that they are the same author). Currently, the only problem with bibutils is having it called correctly by PHP on our server, but that's being addressed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-8352816894490561341?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/8352816894490561341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=8352816894490561341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8352816894490561341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8352816894490561341'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/02/parsing-references.html' title='Parsing references'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-8227660435517831164</id><published>2008-01-31T14:25:00.000-05:00</published><updated>2008-01-31T11:29:38.472-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='Firebug'/><title type='text'>Firebug debugger</title><content type='html'>Treetapper will be fairly Ajax-rich (though with more RESTful interfaces, too, and with concern for accessibility). I didn't know any Javascript (or PHP) when starting, so having a good debugger is handy. I first tried a "Javascript Debugger" plugin for Firefox, but it seemed a bit clunky. I've now installed &lt;a href="http://www.getfirebug.com/"&gt;Firebug&lt;/a&gt;, and I am so far quite happy with it. It allows debugging/inspection of the Javascript, CSS, and HTML of the page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-8227660435517831164?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/8227660435517831164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=8227660435517831164' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8227660435517831164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8227660435517831164'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/01/firebug-debugger.html' title='Firebug debugger'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-2122826512317092381</id><published>2008-01-16T14:25:00.000-05:00</published><updated>2008-01-16T11:34:16.810-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='schema'/><category scheme='http://www.blogger.com/atom/ns#' term='citations'/><category scheme='http://www.blogger.com/atom/ns#' term='Postgres'/><title type='text'>Updated schema</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_d_GbbmZu7dM/R44wpp4CxdI/AAAAAAAABHE/7SV7hTmE95U/s1600-h/db-graph.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_d_GbbmZu7dM/R44wpp4CxdI/AAAAAAAABHE/7SV7hTmE95U/s400/db-graph.png" alt="" id="BLOGGER_PHOTO_ID_5156112115559482834" border="0" /&gt;&lt;/a&gt;I've updated the schema slightly, keeping tracks of citations in different tables rather than just keeping one citation field in the reference table. This way, the number of citations over time can be stored (so the rate of increase of citations can be recovered, as well as the number at any point in time). For right now, "citations" will be the number of hits in Yahoo for the title, year, and lead author last name of a reference, since ISI and CrossRef both require payment to use for citation info and Google Scholar's terms of use prohibit display of info from that site (see Rod Page's &lt;a href="http://ispecies.blogspot.com/2006/05/why-google-is-good-for-sciencemaybe.html"&gt;post&lt;/a&gt; about this).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-2122826512317092381?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/2122826512317092381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=2122826512317092381' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2122826512317092381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/2122826512317092381'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/01/updated-schema.html' title='Updated schema'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_d_GbbmZu7dM/R44wpp4CxdI/AAAAAAAABHE/7SV7hTmE95U/s72-c/db-graph.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-3333165531906477474</id><published>2008-01-11T13:24:00.000-05:00</published><updated>2008-01-11T10:31:02.110-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='schema'/><category scheme='http://www.blogger.com/atom/ns#' term='treetapper'/><category scheme='http://www.blogger.com/atom/ns#' term='Postgres'/><title type='text'>Database schema</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_d_GbbmZu7dM/R4eK9J4CxbI/AAAAAAAABG0/1QFEXvViMAM/s1600-h/TreeTapperSchema.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_d_GbbmZu7dM/R4eK9J4CxbI/AAAAAAAABG0/1QFEXvViMAM/s400/TreeTapperSchema.png" alt="" id="BLOGGER_PHOTO_ID_5154241081776457138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here is the schema for the TreeTapper database. Entries are only shown after being verified by a DB curator (the approved field in each table): this (I hope) will allow users to add missing terms while allowing me to keep the list of terms from getting too disorganized.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-3333165531906477474?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/3333165531906477474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=3333165531906477474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/3333165531906477474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/3333165531906477474'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2008/01/database-schema.html' title='Database schema'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_d_GbbmZu7dM/R4eK9J4CxbI/AAAAAAAABG0/1QFEXvViMAM/s72-c/TreeTapperSchema.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-1461679850732575974</id><published>2007-12-18T15:39:00.000-05:00</published><updated>2007-12-18T12:39:38.745-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design choices'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='YUI'/><category scheme='http://www.blogger.com/atom/ns#' term='Postgres'/><title type='text'>Progress so far</title><content type='html'>&lt;a href="http://www.treetapper.org/"&gt;TreeTapper&lt;/a&gt; is hosted by &lt;a href="http://www.nescent.org/"&gt;NESCent&lt;/a&gt; and uses a &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; database as a backend, an assortment of PHP scripts for generating pages, and the &lt;a href="http://developer.yahoo.com/yui/"&gt;Yahoo User Interface Library&lt;/a&gt; (YUI) for a front end. Reasons for these decisions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;NESCent hosting: Free, stable, well-supported, appropriate for the project, and allows things like use of mod_rewrite to make creating RESTful site easier.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Postgres: NESCent supports this rather than MySQL; triggers and views will be useful (though now also allowed in MySQL). I had thought about using arrays for some fields (a Postgres-only feature), such as when a particular bit of software can read multiple tree formats, but will instead use additional tables, following recommendations from NESCent's IT staff.&lt;/li&gt;&lt;li&gt;PHP scripts: I had looked into using Ruby on Rails, CakePHP, or other frameworks for development, but there seemed to be a lot of overhead in learning them for the benefit I'd receive.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;YUI: This is one of the many libraries for Ajax development. YUI is feature-rich and has both great documentation (with many examples) and an active user forum, both important for me.&lt;/li&gt;&lt;/ul&gt;I've also created the database schema and a way to securely log in (using PHP sessions). Next, I'm adding the ability to store and look up references in &lt;a href="http://www.connotea.org/"&gt;Connotea&lt;/a&gt; (using a Perl &lt;a href="http://www.connotea.org/wiki/WebAPI"&gt;API&lt;/a&gt;) and other reference-parsing tools so that I can start adding papers to the database; I'll also create forms for adding methods and software and start actually adding information.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-1461679850732575974?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/1461679850732575974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=1461679850732575974' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/1461679850732575974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/1461679850732575974'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2007/12/progress-so-far.html' title='Progress so far'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3550570499618792354.post-8836091246691397154</id><published>2007-12-18T14:58:00.000-05:00</published><updated>2007-12-18T12:01:02.527-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Introduction'/><title type='text'>First post</title><content type='html'>Part of my NESCent project is the creation of &lt;a href="http://www.treetapper.org/"&gt;TreeTapper.org&lt;/a&gt;, a site dedicated to methods and software that use trees to understand biology. It has two main aims: 1) allowing users from fields as diverse as genomics, ecology, paleontology, and phylogenetics to identify methods and software that will allow them to answer interesting questions using phylogenetic trees, and 2) allowing developers to identify areas where methods are not yet available or where methods need to implemented in software. I wanted a way to keep track of progress and issues involved in the development of the site; since this process might be of interest to others, I'm using this blog to do so. Any feedback is welcome. Also, though the site is (barely) live now, it's not yet ready for users: a formal announcement of its release will be made later (through EvolDir, Ecolog, and perhaps a journal).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3550570499618792354-8836091246691397154?l=treetapper-dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://treetapper-dev.blogspot.com/feeds/8836091246691397154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3550570499618792354&amp;postID=8836091246691397154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8836091246691397154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3550570499618792354/posts/default/8836091246691397154'/><link rel='alternate' type='text/html' href='http://treetapper-dev.blogspot.com/2007/12/first-post.html' title='First post'/><author><name>Brian O'Meara</name><uri>http://www.blogger.com/profile/02450575101806778825</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://bp1.blogger.com/_d_GbbmZu7dM/SC3JBy0r0PI/AAAAAAAABKo/J9dIktx8kkQ/S220/headshot.jpg'/></author><thr:total>0</thr:total></entry></feed>
