<?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-19457310</id><updated>2012-01-17T09:24:36.917-08:00</updated><category term='polargrid polar grid'/><category term='emacs mac os x'/><category term='Grid computing'/><title type='text'>Marlon Pierce's Community Grids Lab Blog</title><subtitle type='html'>Some typing equivalents to down-hill skiing: I start at the top of the page and type all the way to the bottom.
&lt;p&gt;

&lt;center&gt;&lt;i&gt;Caution:&lt;/i&gt; Inflammatory Content!&lt;/center&gt;&lt;/p&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default?start-index=101&amp;max-results=100'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>193</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-19457310.post-910629504195454943</id><published>2011-08-08T12:02:00.000-07:00</published><updated>2011-08-08T12:02:06.860-07:00</updated><title type='text'>Security Flaw with IU CAS-Enabled Web Sites</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;There is a security flaw in many of IU's online services (such as the time off system and the document workflow approval system--see &lt;a href="http://kb.iu.edu/data/akui.html"&gt;http://kb.iu.edu/data/akui.html&lt;/a&gt;): they use CAS for single-sign on but don't provide a CAS "log off". If you log into one of these services, you are logged into every CAS-enabled service until your session expires, perhaps without realizing it. &amp;nbsp;The only way I know to log off after CAS login is to go through IU's OneStart portal, which does have a CAS log-off.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, if you login to the EPTO service to record your time off, you are also logged into OneStart and everything else. &amp;nbsp;If you leave your laptop or workstation unattended while the CAS session is still valid, I can sneak over and access all of your private employee information by pointing your browser to OneStart.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-910629504195454943?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/910629504195454943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=910629504195454943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/910629504195454943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/910629504195454943'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2011/08/security-flaw-with-iu-cas-enabled-web.html' title='Security Flaw with IU CAS-Enabled Web Sites'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-135612027217397540</id><published>2011-07-27T17:28:00.001-07:00</published><updated>2011-07-27T17:28:48.796-07:00</updated><title type='text'>GCE11 Workshop Scheduled</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;The Gateway Computing Environments 2011 workshop will be at Supercomputing 2011. &amp;nbsp;Submissions are open and welcome. &amp;nbsp;See&amp;nbsp;&lt;a href="http://www.collab-ogce.org/gce11/index.php/Main_Page"&gt;http://www.collab-ogce.org/gce11/index.php/Main_Page&lt;/a&gt;&amp;nbsp; for more information.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-135612027217397540?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/135612027217397540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=135612027217397540' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/135612027217397540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/135612027217397540'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2011/07/gce11-workshop-scheduled.html' title='GCE11 Workshop Scheduled'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-5338458580659266012</id><published>2011-07-27T10:08:00.000-07:00</published><updated>2011-07-27T10:16:30.179-07:00</updated><title type='text'>Changing Apache Rave's backing database</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;a href="http://incubator.apache.org/rave/"&gt;Apache Rave&lt;/a&gt;&amp;nbsp;provides software for running a social networking portal. The default download uses the H2 in-memory relational database on the backend. To change this to MySQL, PostgreSQL or another external database, you need to do the following:&lt;br /&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Edit the file&amp;nbsp;rave-portal/src/main/webapp/WEB-INF/dataContext.xml to use the desired JDBC driver; and&lt;/li&gt;&lt;li&gt;Download the appropriate database driver jar file and place it in the WEB-INF/lib directory of your portal's tomcat server.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;If you are starting the server with "mvn cargo:start", this is rave-portal/target/tomcat6x/webapps/portal/WEB-INF/lib/|&lt;/li&gt;&lt;li&gt;You probably will want to install the JDBC driver jar in your local Maven repository and put the dependency in rave-portal/pom.xml.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;It is also worth reviewing the dataContext.xml file. &amp;nbsp;The H2 database default user name and password are here (you may want to update) and has a console running on port 11111. &amp;nbsp;You can point your browser to http://localhost:1111/ and login. &amp;nbsp;You can also change the default behavior of H2 to use files for persistence. &lt;br /&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/19457310-5338458580659266012?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/5338458580659266012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=5338458580659266012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5338458580659266012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5338458580659266012'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2011/07/changing-apache-raves-backing-database.html' title='Changing Apache Rave&apos;s backing database'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-1500578364055541034</id><published>2011-06-23T11:09:00.000-07:00</published><updated>2011-06-23T11:09:59.129-07:00</updated><title type='text'>Implementing account creation in Apache Rave</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Apache Rave (&lt;a href="http://incubator.apache.org/rave"&gt;http://incubator.apache.org/rave&lt;/a&gt;/) is an Apache Incubator project to build a Web portal and services on top of Google's OpenSocial and W3C's Widget specifications. &amp;nbsp;We're writing Rave from scratch using the Spring (version 3) framework. &amp;nbsp;These are notes on adding a basic user registration feature. The code described below is open source and will soon be in Rave's SVN. &amp;nbsp;I'll assume general familiarity with Spring. &amp;nbsp;If not, check out Rave's source code and walk through it. &amp;nbsp;The notes below will tell you were to look, but I won't include all the code.&lt;br /&gt;&lt;br /&gt;Rave's user management is built around the following classes:&lt;br /&gt;&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;User: &lt;/b&gt;&amp;nbsp;this is a data model class that represents a user (name, password, etc). &amp;nbsp;Spring (and JPA) manage the object-relational mappings between User objects and the relational database storage.&lt;/li&gt;&lt;li&gt;&lt;b&gt;UserService: &amp;nbsp;&lt;/b&gt;this is an interface that allows you to interact with the User data model.&lt;/li&gt;&lt;li&gt;&lt;b&gt;UserRepository: &lt;/b&gt;this is an interface that allows you to interact with the backend database. We use JPA for object-relational mapping.&lt;/li&gt;&lt;li&gt;&lt;b&gt;DefaultUserService: &lt;/b&gt;this implements the UserService interface and interacts with the UserRepository (and thus the JpaUserRepository).&lt;/li&gt;&lt;li&gt;&lt;b&gt;JpaUserRepository: &lt;/b&gt;&amp;nbsp;this implements the UserRepository interface and provides access to the javax.persistence.EntityManager, which handles the database persistence.&lt;/li&gt;&lt;/ol&gt;There are similar classes and interfaces for Rave's widget, page, and region data models. &amp;nbsp;Spring of course handles all the dependency injection (makes sure DefaultUserService has an instance of the UserRepository implementation, for example). &amp;nbsp;JPA takes care of the crud.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We'll now need to implement two pieces of code: an account registration form (&lt;b&gt;newaccount.jsp&lt;/b&gt;) and a Spring controller class to intercept our form actions (&lt;b&gt;NewAccountController.java&lt;/b&gt;). &amp;nbsp;The registration form and associated action URL both need to be accessed by unauthenticated users, so we modify Rave's &lt;b&gt;applicationContext-security.xml&lt;/b&gt; file accordingly (see Rave code for full example).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;NewAccountController needs to do three things: get access to the UserService implementation (Spring injects this), create a new User object, and use the UserService to insert the new User object into the repository. &amp;nbsp;Once a user is registered, NewAccountController redirects to the login page.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is pretty basic functionality, and there's a lot left to do. As an Apache Software Foundation incubator project, Rave is not only open source but community driven. &amp;nbsp;If you want to participate, checkout the code from SVN, create an account on Rave's Jira system (&lt;a href="https://issues.apache.org/jira/browse/rave"&gt;https://issues.apache.org/jira/browse/rave&lt;/a&gt;), create issues and submit patches. &amp;nbsp;Frequent contributors can become full project members. &amp;nbsp;&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/19457310-1500578364055541034?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/1500578364055541034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=1500578364055541034' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1500578364055541034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1500578364055541034'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2011/06/implementing-account-creation-in-apache.html' title='Implementing account creation in Apache Rave'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-6211622887954817962</id><published>2011-05-11T06:41:00.000-07:00</published><updated>2011-05-11T06:42:12.323-07:00</updated><title type='text'>Chembiogrid and Chembiocloud</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;We had some adventures in domain hosting. &amp;nbsp;If you are looking for the correct version of the ChemBioGrid website, please see &lt;a href="http://www.chembiogrid.info/"&gt;http://www.chembiogrid.info &lt;/a&gt;or &lt;a href="http://www.chembiocloud.org/"&gt;http://www.chembiocloud.org&lt;/a&gt;. &amp;nbsp;This contains links to Web services, databases, and other useful stuff from the NIH funded CICC project. &amp;nbsp;The chembiogrid.org site is currently outside our control.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-6211622887954817962?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/6211622887954817962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=6211622887954817962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6211622887954817962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6211622887954817962'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2011/05/chembiogrid-and-chembiocloud.html' title='Chembiogrid and Chembiocloud'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-224469082675638765</id><published>2010-12-13T10:59:00.000-08:00</published><updated>2010-12-13T11:03:42.336-08:00</updated><title type='text'>A Jersey REST Example with Maven</title><content type='html'>I finally got around to trying out Jersey for REST services. &amp;nbsp;Below is an end-to-end example that will build a war file that can be deployed into a Tomcat server. &amp;nbsp;I'm using Java 1.6 and Tomcat 6.0.20.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Assumption:&lt;/b&gt; I will assume you can create and compile a project with Apache Maven. &amp;nbsp;I used Maven 2.2.1 below.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installing:&lt;/b&gt;&amp;nbsp;Jersey doesn't have to be installed in a conventional sense. &amp;nbsp;You just need to have the correct jars in your web application's $CLASSPATH. &amp;nbsp;Maven will automate this for you. &amp;nbsp;Here is your POM file:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;yourGroup&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;yourExample&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;name&amp;gt;${artifactId}&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;repositories&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;!--These are needed for Jersey --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;repository&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;id&amp;gt;maven2-repository.dev.java.net&amp;lt;/id&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;name&amp;gt;Java.net Repository for Maven&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;url&amp;gt;http://download.java.net/maven/2/&amp;lt;/url&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;layout&amp;gt;default&amp;lt;/layout&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;/repository&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;repository&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;id&amp;gt;maven-repository.dev.java.net&amp;lt;/id&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;name&amp;gt;Java.net Maven 1 Repository (legacy)&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;url&amp;gt;http://download.java.net/maven/1&amp;lt;/url&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;layout&amp;gt;legacy&amp;lt;/layout&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;/repository&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/repositories&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;dependencies&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;!-- These are the Jersey dependencies --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;groupId&amp;gt;com.sun.jersey&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;artifactId&amp;gt;jersey-server&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;version&amp;gt;1.4&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;groupId&amp;gt;com.sun.grizzly&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;artifactId&amp;gt;grizzly-servlet-webserver&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;version&amp;gt;1.9.18-i&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;groupId&amp;gt;com.sun.jersey.jersey-test-framework&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;artifactId&amp;gt;jersey-test-framework-grizzly&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;version&amp;gt;1.4&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Configuring&lt;/b&gt;: There seem to be a few options for your web.xml file. &amp;nbsp;The following worked for me. &amp;nbsp;You have to change the line in bold.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;?xml version="1.0" encoding="ISO-8859-1"?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;!DOCTYPE web-app&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;web-app&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;servlet&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;servlet-name&amp;gt;Jersey Web Application&amp;lt;/servlet-name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;servlet-class&amp;gt;com.sun.jersey.spi.container.servlet.ServletContainer&amp;lt;/servlet-class&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;param-name&amp;gt;com.sun.jersey.config.property.packages&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&amp;lt;--You need to change this line to match your package name --&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&amp;lt;param-value&amp;gt;org.yourproject.restservices&amp;lt;/param-value&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/servlet&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;servlet-mapping&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;servlet-name&amp;gt;Jersey Web Application&amp;lt;/servlet-name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/servlet-mapping&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/web-app&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;The Code: &lt;/b&gt;The following is a simple Java code that takes supports both GET and POST operations with arbitrary key-value pairs. &amp;nbsp;It doesn't however support parameters with multiple values. &amp;nbsp;I show a sample code snippet below. &amp;nbsp;From other examples that I've seen, the UriInfo class seems to be the easiest way to get a Map of the request parameters with GET methods. &amp;nbsp;With POST, you have more direct access to the map.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;//This package declaration should match what you used in the web.xml above.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;package&amp;nbsp;org.yourproject.restservices;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;//These are Jersey jars&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;import javax.ws.rs.GET;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;import javax.ws.rs.POST;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;import javax.ws.rs.Produces;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;import javax.ws.rs.Consumes;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;import javax.ws.rs.Path;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;import javax.ws.rs.QueryParam;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;import javax.ws.rs.core.Context;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;import javax.ws.rs.core.MultivaluedMap;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;import javax.ws.rs.core.UriInfo;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;import java.net.URLEncoder;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;import java.util.Iterator;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;/span&gt;@Path("/echo") public class MyService{&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; @GET&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; @Produces("text/html")&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; public String get(@Context UriInfo ui) {&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;MultivaluedMap&lt;string,string&gt; queryParams=ui.getQueryParameters();&lt;/string,string&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;return showQueryParams(queryParams);&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; @POST&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; @Consumes("application/x-www-form-urlencoded")&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; @Produces("text/html")&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; public String post(MultivaluedMap&lt;string,string&gt; queryParams) {&lt;/string,string&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;return showQueryParams(queryParams);&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; //Extract the parameters.&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; protected String showQueryParams(MultivaluedMap queryParams) {&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Iterator it=queryParams.keySet().iterator();&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;String theKey=null;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;String returnString="";&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;try {&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(it.hasNext()) {&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;theKey=(String)it.next();&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;returnString += URLEncoder.encode(theKey,"UTF8")&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; +" &amp;nbsp;"&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; +URLEncoder.encode((String)queryParams.getFirst(theKey),"UTF-8");&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;catch (Exception ex) {&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//This will probably be an UnsupportedEncodingException.&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Handle more approrpriately.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ex.printStackTrace();&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; returnString=ex.getMessage();&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;return returnString;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; font-size: small;"&gt;&lt;b&gt;Compile and Invoke&lt;/b&gt;: Use "mvn clean install" to generate a war file, then copy this from your project's target directory to a waiting Tomcat server. &amp;nbsp;Better yet, add the clean up and installation code to your POM using Ant tasks. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;You can invoke this service any number of ways: directly call it in a web browser, write an HTML page that uses it as a FORM action, or invoke on the command line with curl or wget. &amp;nbsp;Here is a curl example that uses POST:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;curl http://your.server.org:8080/yourExample/echo -d "hollow=world&amp;amp;true=false"&lt;/span&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/19457310-224469082675638765?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/224469082675638765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=224469082675638765' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/224469082675638765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/224469082675638765'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2010/12/jersey-rest-example-with-maven.html' title='A Jersey REST Example with Maven'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2358163968023462165</id><published>2010-10-04T11:26:00.000-07:00</published><updated>2010-10-04T11:26:42.361-07:00</updated><title type='text'>Plotting with dygraphs JavaScript</title><content type='html'>I stumbled across &lt;a href="http://www.danvk.org/dygraphs/"&gt;dygraphs&lt;/a&gt; at lunch. &amp;nbsp; This is perfect for plotting line plots--anything you care to export from a spreadsheet. &amp;nbsp;For input, you only need a file with comma separated values. &amp;nbsp;For free, you get mouseover point values and drag-and-zoom.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2358163968023462165?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2358163968023462165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2358163968023462165' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2358163968023462165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2358163968023462165'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2010/10/plotting-with-dygraphs-javascript.html' title='Plotting with dygraphs JavaScript'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2253453202980958290</id><published>2010-10-04T07:50:00.000-07:00</published><updated>2010-10-04T07:51:01.452-07:00</updated><title type='text'>HTML5 Messaging and PMRPC</title><content type='html'>From a suggestion by David Braun, I took a quick look at &lt;a href="http://code.google.com/p/pmrpc/"&gt;PMRPC&lt;/a&gt;&amp;nbsp;as a way to send messages between browser windows and gadgets using HTML5 standards.&amp;nbsp;&amp;nbsp;One of PMRPC's selling points is that it promises to hide the details of the much lower level HTML5 API. &amp;nbsp;Oh, computer science....&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Since I'm not a great JavaScript programmer, I found the provided examples to be a little opaque. &amp;nbsp;Here are simple working examples, at least in Google Chrome on Mac. &amp;nbsp;They did not work for Firefox 3.6.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Window-IFrame Example&lt;/b&gt;&lt;/div&gt;&lt;div&gt;In this example, you have an HTML page that contains an iFrame, and you want to send a message from the container to the child iFrame. &amp;nbsp;Here's the parent's HTML. &amp;nbsp;I dubbed this file frame2.html.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;script src="json2.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;script type="text/javascript" src="pmrpc.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;function dothing() {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;// call the exposed procedure&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;pmrpc.call( {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;destination : window.frames["iFrameA"],&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;publicProcedureName : "HollowPMRPC",&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;params : ["Hollow World!"] } );&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;iframe id="iFrameA" title="iFrameA" src="http://your.server.base/frame1.html"&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;This is Frame B.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;input type="button" name="send message" onClick="dothing()"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The embedded iFrame (called frame1.html above) looks like this:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;script src="json2.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;script type="text/javascript" src="pmrpc.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;//function init(){&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;// expose a procedure&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;alert("Init");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;pmrpc.register( {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;publicProcedureName : "HollowPMRPC",&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;procedure : function(printParam) { alert(printParam); } } );&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;//}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;This is Frame A.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;br /&gt;Click the button and send the alert. &amp;nbsp; Welcome to 2010.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IFrame to IFrame Communication&lt;/b&gt;&lt;br /&gt;To get two peer windows (two embedded iFrames in this case) to send messages to each other, we need to use the "publish" destination in frame1.html. &amp;nbsp;We'll also delete the iframe tag. &amp;nbsp;The new HTML looks like this:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;script src="json2.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;script type="text/javascript" src="pmrpc.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;function dothing() {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;// call the exposed procedure&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;pmrpc.call( {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;destination : "publish",&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;publicProcedureName : "HollowPMRPC",&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;params : ["Hollow World!"] } );&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;This is Frame B.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;input type="button" name="send message" onClick="dothing()"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;We don't need to make any modifications to frame2.html. &amp;nbsp;Finally, we need a simple HTML page to contain the iFrames for frame1.html and frame2.html. &amp;nbsp;I call this container.html:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;iframe id="iFrameA" title="iFrameA" src="http://your.server.base/frame1.html"&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;iframe id="iFrameB" title="iFrameB" src="http://your.server.base/frame2.html"&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&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/19457310-2253453202980958290?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2253453202980958290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2253453202980958290' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2253453202980958290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2253453202980958290'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2010/10/html5-messaging-and-pmrpc.html' title='HTML5 Messaging and PMRPC'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2961612561421437401</id><published>2010-07-27T07:50:00.000-07:00</published><updated>2010-07-27T08:08:22.662-07:00</updated><title type='text'>Using SVN Externals as Organization Links</title><content type='html'>&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Here's the problem: you have a large SVN code base with many sub-projects. &amp;nbsp;Setting up your SVN as a straightforward hierarchical organization (each sub-projects is a sub-folders in your grand scheme) will eventually cause problems, since you will want to significantly reorganize components over time without breaking builds that may be dependent on the older directory layouts.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;We've found SVN externals to be a good way to handle the problem of linking across far-flung directories within the same SVN repository. In this setup, each major sub-component still gets its own directory. The organization appropriate for your current system is a simple organizing/aggregating directory. &amp;nbsp;Sub-components are then linked into this directory using svn:external properties that are defined in a properties file (this is the only file you need in your aggregating directory). &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;The easiest way to do this is to create a file (svn_ext_val.txt) in your new aggregating directory and define properties within it. &amp;nbsp;Call your aggregating directory "myagg". &amp;nbsp;Then for example (from our OGCE project)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;[shell-prompt&amp;gt; svn co http://ogce.svn.sourceforge.net/svnroot/ogce/myagg&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;[shell-prompt&amp;gt; cd myagg&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;[shell-prompt&amp;gt;cat svn_ext_val.txt&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sgfac https://ogce.svn.sourceforge.net/svnroot/ogce/ogce-xsul-services/sgfac/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;xregistry https://ogce.svn.sourceforge.net/svnroot/ogce/ogce-xsul-services/xregistry/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ogce-xbaya https://ogce.svn.sourceforge.net/svnroot/ogce/ogce-xbaya-gui/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;gadget-container https://ogce.svn.sourceforge.net/svnroot/ogce/ShindigOGCE/ishindig-trunk/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;xregistryinterface https://ogce.svn.sourceforge.net/svnroot/ogce/ogce-gadget-interfaces/xregistryinterface/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;experimentbuilder https://ogce.svn.sourceforge.net/svnroot/ogce/ogce-gadget-interfaces/experimentbuilder/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;gadget-sharedlib https://ogce.svn.sourceforge.net/svnroot/ogce/ogce-gadget-interfaces/gadget-sharedlib/gadget-sharedlib/&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Each property points to the appropriate component directory within SVN. &amp;nbsp;Set these for your project with the command&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;svn propset svn:externals -F svn_ext_val.txt &amp;nbsp;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Verify everything is correct with&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;svn propget svn:externals&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Then commit with "svn commit" as usual. &amp;nbsp; Now run "svn update" and it should check out all the external components. &amp;nbsp;If you edit code in any of the subcomponents and commit, the external directory will be updated correctly. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2961612561421437401?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2961612561421437401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2961612561421437401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2961612561421437401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2961612561421437401'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2010/07/using-svn-externals-as-organization.html' title='Using SVN Externals as Organization Links'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-8640261349411581147</id><published>2010-04-26T09:00:00.000-07:00</published><updated>2010-04-26T09:01:30.618-07:00</updated><title type='text'>Calling javac from Ant Inside Maven Using AntRun</title><content type='html'>We ran into a situation where we needed to call Ant's javac task to compile code generated by a legacy Ant task as part of a larger build. &amp;nbsp;This exposed a very confusing feature of Maven: it apparently changes the java.home property to point to the JRE home. This is no problem on Macs but is on Linux. &lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are several possible workarounds. &amp;nbsp;The one that I currently prefer is to exploit the fact that Maven only overrides ${java.home} but not the original ${env.JAVA_HOME}. &amp;nbsp;So your &amp;lt;javac&amp;gt; task inside the antrun plugin should look like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&amp;lt;javac fork="true" executable="${env.JAVA_HOME}/bin/javac" srcdir="${final.src.dir}" destdir="${final.class.dir}"&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&amp;lt;classpath refid="maven.dependency.classpath"/&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&amp;lt;/javac&amp;gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;I&lt;/span&gt;n testing, the fork attribute needed to be set to true, but I don't know why.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;A&lt;/span&gt;nother workaround is to specify the location of tools.jar in the Antrun plugin's dependencies. &amp;nbsp;This introduces a second problem: Mac and Linux put the tools.jar classes in different jars. &amp;nbsp;For Linux, this is just in $JAVA_HOME/lib/tools.jar as you would expect, but Mac embeds these classes in classes.jar, located in $JAVA_HOME/../Classes/classes.jar. &amp;nbsp;Thus you should use&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; &amp;nbsp;&amp;lt;artifactId&amp;gt;maven-antrun-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; &amp;nbsp;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;com.sun&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;tools&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;1.5.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;systemPath&amp;gt;${tools.jar}&amp;lt;/systemPath&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; &amp;nbsp;&amp;lt;!-- Remainder of the antrun configuration and execution --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/plugin&amp;gt;&lt;/div&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;Set ${tools.jar} depending on your operating system as described in the preceding paragraph. &amp;nbsp;Obviously this introduces an undesirable need to either set or detect the operating system of the build.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Perhaps there is some deep reason for Maven to internally overwrite java.home, but I can't guess it. &amp;nbsp;This really should be cleaned up.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-8640261349411581147?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/8640261349411581147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=8640261349411581147' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8640261349411581147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8640261349411581147'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2010/04/calling-javac-from-ant-inside-maven.html' title='Calling javac from Ant Inside Maven Using AntRun'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-4525330472366485042</id><published>2010-02-18T10:34:00.000-08:00</published><updated>2010-02-18T10:34:47.194-08:00</updated><title type='text'>Nagios and HTTPS Monitoring</title><content type='html'>This doesn't seem to be configured in the basic Nagios installation, but it is easy to do. The following was done on a server running RedHat 5.2.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Go to your nagios top level directory, /usr/local/nagios.&lt;/li&gt;&lt;li&gt;Use the check_http command line tool and make sure it works:&amp;nbsp;&amp;nbsp;./libexec/check_http -H your.server.hostname -p 8443 -S &amp;nbsp; Here the port is 8443. &amp;nbsp;-S is the option to use SSL.&lt;/li&gt;&lt;li&gt;Add a command, "check_https", to your etc/objects/commands.cfg file:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 'check_https' command definitiondefine command{&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; command_name &amp;nbsp; &amp;nbsp;check_https&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; command_line &amp;nbsp; &amp;nbsp;$USER1$/check_http -I $ARG1$ -p $ARG2$ -S&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;li&gt;Add the host to be checked to the appropriate config file (see my previous post for an example, or see below). &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Make sure your don't have any typos:&amp;nbsp;/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Reload nagios:&amp;nbsp;/etc/rc.d/init.d/nagios reload&lt;/li&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;You are done. &amp;nbsp;I put all of my Nagios checks into localhost.cfg, which is probably not a good idea, but it was simple to get going. &amp;nbsp;Add the following to the bottom of your cfg file:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;define host{&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;use &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; linux-server &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; Name of host template to use&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;host_name &amp;nbsp; &amp;nbsp; &amp;nbsp;some-host &amp;nbsp;; The name we're giving to this host&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;alias &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Some Host to Check &amp;nbsp;; A longer name associated with the host&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;address &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 123.456.789 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; IP address of the host&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hostgroups &amp;nbsp; &amp;nbsp; &amp;nbsp;linux-servers &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; Host groups this host is associated with&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;define service{&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;use &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; local-service &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; Name of service template to use&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;host_name &amp;nbsp; &amp;nbsp; &amp;nbsp; some-host&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;service_description &amp;nbsp; &amp;nbsp; HTTP&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;check_command &amp;nbsp; check_https!your.server.hostname!8443&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;notifications_enabled &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&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/19457310-4525330472366485042?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/4525330472366485042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=4525330472366485042' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4525330472366485042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4525330472366485042'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2010/02/nagios-and-https-monitoring.html' title='Nagios and HTTPS Monitoring'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-7500916376074002751</id><published>2010-02-10T13:42:00.000-08:00</published><updated>2010-02-10T13:43:53.225-08:00</updated><title type='text'>Resetting Old Media Wiki Passwords in MySQL</title><content type='html'>I needed to reset a forgotten user password in an older version of Mediawiki that predates the changePassword.php utility. Also, email notifications were disabled. &amp;nbsp;These are some clarifications of the instructions from&amp;nbsp;&lt;a href="http://www.mediawiki.org/wiki/Manual:FAQ#How_do_I_reset_a_password.3F"&gt;http://www.mediawiki.org/wiki/Manual:FAQ#How_do_I_reset_a_password.3F&lt;/a&gt;. &amp;nbsp; Here are the steps:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Look at your LocalSettings.php file to remind yourself of the DB name, the DB prefix, user name and password associated with your Mediawiki installation. &amp;nbsp;Let's say they are mywikidb, mywikiprefix, mywikiuser, and mywikipass, respectively. &amp;nbsp;&lt;/li&gt;&lt;li&gt;Login from the command line to your mysql: &amp;nbsp;&amp;nbsp;mysql -u mywikiuser -pmywikipass&lt;/li&gt;&lt;li&gt;Change to the database at the mysql prompt: USE mywikidb;&lt;/li&gt;&lt;li&gt;Verify things: SHOW columns FROM mywikiprefixuser;&lt;/li&gt;&lt;li&gt;Verify more things:&amp;nbsp;SELECT user_name, user_id, user_real_name, user_email FROM mywikiprefixuser;&lt;/li&gt;&lt;li&gt;Change the password: UPDATE mywikiprefixuser SET user_password = MD5(CONCAT(user_id, '-', MD5('newpass'))) WHERE user_name="someuser";&lt;/li&gt;&lt;/ol&gt;In step 6, change&amp;nbsp;mywikiprefix to your prefix, newpass to the desired password, and someuser to the appropriate user of your system. &amp;nbsp;In step 5, you should see the user_name value ("JimboWales"), so this is a useful check.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-7500916376074002751?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/7500916376074002751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=7500916376074002751' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/7500916376074002751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/7500916376074002751'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2010/02/resetting-old-media-wiki-passwords-in.html' title='Resetting Old Media Wiki Passwords in MySQL'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-3598753625835736178</id><published>2010-01-07T14:10:00.000-08:00</published><updated>2010-01-08T06:27:07.618-08:00</updated><title type='text'>Some Nagios Notes for HTTP Monitoring</title><content type='html'>I needed to monitor some non-standard HTTP&amp;nbsp; ports with Nagios.&amp;nbsp; Installation went well, but it took a little fooling around to get the HTTP monitoring the way that I wanted.&amp;nbsp; [&lt;b&gt;N. B. &lt;/b&gt;After writing this, I realized later that the default settings could probably do what I wanted.&amp;nbsp; But here it is anyway.]&lt;br /&gt;&lt;br /&gt;First, make sure your check_http command is working correctly.&amp;nbsp; It is in $NAGIOS_HOME/plugins/check_http.&amp;nbsp; Use --help to see your options.&amp;nbsp; You'll note that there are several, but the actual command that Nagios runs is defined in the file commands.cfg.&amp;nbsp; The default is&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# 'check_http' command definition&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;define command{&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; command_name&amp;nbsp;&amp;nbsp;&amp;nbsp; check_http&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; command_line&amp;nbsp;&amp;nbsp;&amp;nbsp; $USER1$/check_http -I $HOSTADDRESS$ $ARG1$&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I changed the command_line to&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;command_line&amp;nbsp;&amp;nbsp;&amp;nbsp; $USER1$/check_http -I $ARG1$ -p $ARG2$&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You could of course add additional options supported by check_http.&lt;br /&gt;&lt;br /&gt;Next, you need to add hosts to be monitored.&amp;nbsp; I just appended these to localhost.cfg.&amp;nbsp; This is an example for monitoring http://my.machine.indiana.edu:9999 (with IP addres 123.456.789).&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;define host{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; linux-server&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Name of host template to use&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; host_name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my-machine &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; The name we're giving to this host&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CICC Tomcat&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; A longer name associated with the host&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 123.456.789 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; IP address of the host&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hostgroups&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; linux-servers&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Host groups this host is associated with&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;define service{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local-service&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Name of service template to use&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; host_name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my-machine&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; service_description&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HTTP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; check_command&amp;nbsp;&amp;nbsp; check_http!my.machine.indiana.edu!9999&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; notifications_enabled&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That's it.&amp;nbsp; Maybe there is a better way to do this but I could not find it easily.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-3598753625835736178?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/3598753625835736178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=3598753625835736178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3598753625835736178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3598753625835736178'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2010/01/some-natgios-notes-for-http-monitoring.html' title='Some Nagios Notes for HTTP Monitoring'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-8632393911862171325</id><published>2010-01-04T15:46:00.000-08:00</published><updated>2010-01-04T15:46:09.170-08:00</updated><title type='text'>Quick Guide to Using Open Social's Activity API with Google Friend Connect</title><content type='html'>As I've discussed in some previous posts, Google Friend Connect gives you a simple way to access Open Social applications.&amp;nbsp; The JavaScript API is pretty simple and is mainly useful for logging in, setting up small social networks, and rendering social gadgets.&amp;nbsp; You can use&amp;nbsp; the JavaScript API to decorate HTML with various social mini-gadgets for tagging, rating, commenting, and so on. &lt;br /&gt;&lt;br /&gt;In this post, we'll look at how to directly call the Open Social API without going through a pre-existing gadget.&amp;nbsp; Our motivation is the Open Social Activity API.&amp;nbsp; Familiar social networking sites like Facebook and Twitter have "activity streams" in which each user posts status updates. These can also be automatically generated side effects (such as bookmarking a site with Del.icio.us's Twitter interface, for example).&lt;br /&gt;&lt;br /&gt;An Open Social Activity API example using Google Gadgets is here: &lt;a href="http://code.google.com/apis/opensocial/docs/0.8/devguide.html#Activities"&gt;http://code.google.com/apis/opensocial/docs/0.8/devguide.html#Activities&lt;/a&gt;.&amp;nbsp;&amp;nbsp; In addition to being an HTML gadget, this relies on the Gadget API (see &lt;span class="pln"&gt;the call to gadgets&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;util&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;registerOnLoadHandler&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;startActivity&lt;/span&gt;&lt;span class="pun"&gt;) near the bottom). To do the same thing with Google Friend Connect, we need to take the following steps:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="pun"&gt;Load the FriendConnect JavaScript libraries with google.load.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="pun"&gt;Use the FriendConnect libraries to initialize an OpenSocial API call.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="pun"&gt;Pass in a callback function (startActivity() in our example) that the server side (at Google HQ, presumably) will invoke.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="pun"&gt;Implement the callback function using the OpenSocial Activity API.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;The code for doing this is below, with comments. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;!--Shows how to use the Open Social activity API with Google Friend Connect --&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;div id="content_div"&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;!-- Initialize the Google Friend Connect OpenSocial API. --&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;!-- Load the Google AJAX API Loader --&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;script type="text/javascript" src="http://www.google.com/jsapi"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;!-- Load the Google Friend Connect javascript library. --&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;script type="text/javascript"&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; google.load('friendconnect', '0.8');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;script type="text/javascript"&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/* This will dynamically change the content to the new activity */&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var div=document.getElementById("content_div");&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*No caching for development. */ &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;google.friendconnect.container.setNoCache(1);&lt;/span&gt;&lt;br /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Use this to invoke Open Social methods */ &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;google.friendconnect.container.initOpenSocialApi({&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; site: '##########################',&amp;nbsp;&amp;nbsp; /* Replace this with your GFC ID */&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; onload: function(securityToken) { startActivity(); }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;});&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; /* This is a callback invoked when we initial the Open Social libraries. It has a callback method of its own, called callback()&amp;nbsp; */&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; function postActivity(text) {&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var params = {};&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; params[opensocial.Activity.Field.TITLE] = text;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var activity = opensocial.newActivity(params); &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH, callback);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; div.innerHTML = "Activity title is: " + activity.getField(opensocial.Activity.Field.TITLE);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; };&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; /**&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; * Server calls this function to indicate whether the activity post succeeded or failed.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; */&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; function callback(status) {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (status.hadError())&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert("Error creating activity.");&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert("Activity successfully created.");&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; };&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; /**&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; * Start the process of posting an activity.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; */&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; function startActivity() {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; postActivity("This is a sample activity, created at " + new Date().toString());&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; };&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To use this, just save it as an HTML file on a Web server registered to Google Friend Connect and load the page.&amp;nbsp; You will need to change "################" to use your registered site ID.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-8632393911862171325?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/8632393911862171325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=8632393911862171325' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8632393911862171325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8632393911862171325'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2010/01/quick-guide-to-using-open-socials.html' title='Quick Guide to Using Open Social&apos;s Activity API with Google Friend Connect'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-5614802616032869539</id><published>2009-12-30T11:54:00.000-08:00</published><updated>2009-12-30T13:29:00.715-08:00</updated><title type='text'>Quick Guide to Using Google's OpenID</title><content type='html'>These notes are based on some work done by Jun Ji in our group.&amp;nbsp; He's been converting the QuakeSim project's portlets into Google gadgets as a prelude to Open Social integration, as discussed in previous posts.&amp;nbsp; One problem is that the gadgets need to identify and authenticate the user. We don't have excessive security requirements.&amp;nbsp; We just need to save the users' interactions with the web interface as persistent sessions ("projects") so that they can be accessed again in later sessions. &lt;br /&gt;&lt;br /&gt;This identification step is actually pretty simple to do with OpenID and &lt;a href="http://code.google.com/p/openid4java/"&gt;openid4java&lt;/a&gt;, but you may not guess this from Google's documentation (see for example &lt;a href="http://code.google.com/apis/apps/sso/openid_reference_implementation.html"&gt;http://code.google.com/apis/apps/sso/openid_reference_implementation.html&lt;/a&gt;).&amp;nbsp;&amp;nbsp; To start, you will need to download the openid4java tar file (see &lt;a href="http://code.google.com/p/openid4java/"&gt;http://code.google.com/p/openid4java/&lt;/a&gt;) and unpack it. The openid4java jars need to go in your webapps's WEB-INF/lib directory, as usual.&lt;br /&gt;&lt;br /&gt;Next, you need to copy the provided samples consumer_redirect.jsp and consumer_returnurl.jsp to your webapp's directory. They are in ./samples/simple-openid/src/main/webapp/ of the openid4java download.&amp;nbsp;&amp;nbsp; You will need to modify them a little: consumer_redirect.jsp for example has a variable &lt;i&gt;returnToUrl&lt;/i&gt; that needs to be changed to use your webapp's name. For our other modifications to these codes, see the source code at source forge: &lt;a href="http://www.blogger.com/goog_1262197382710"&gt;http://crisisgrid.svn.sourceforge.net/viewvc/crisisgrid/QuakeSim2/portlets_dev/Disloc3/src/main/webapp/&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This completes the setup.&amp;nbsp; You can now make simple login page like the one below (call it index.jsp or whatever).&amp;nbsp; You need to do the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;See if a &lt;i&gt;logout&lt;/i&gt; action has been requested.&amp;nbsp; If so, clean up relevant OpenID session variables.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;See if the &lt;i&gt;openid&lt;/i&gt; attribute has been set.&amp;nbsp; If so, give the user an option of logging out or navigating on to other pages. &lt;/li&gt;&lt;li&gt;Otherwise, redirect the user to the Google OpenID login page.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;Here's what the JSP page looks like:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;%@ page session="true" %&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (request.getParameter("logout")!=null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; session.removeAttribute("openid");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; session.removeAttribute("openid-claimed");&lt;br /&gt;%&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Logged out!&amp;lt;p&amp;gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (session.getAttribute("openid")==null) {&lt;br /&gt;%&amp;gt;&lt;br /&gt;&amp;lt;form method="POST" action="consumer_redirect.jsp"&amp;gt;&lt;br /&gt;&amp;lt;strong&amp;gt;&amp;lt;br&amp;gt;QuakeSim2 OpenID login test page:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="openid" value="https://www.google.com/accounts/o8/id" size="60"/&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;input type="submit" value="log in into google"/&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;} else {&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;br /&gt;Logged in as &amp;lt;%= session.getAttribute("openid") %&amp;gt;&amp;lt;p&amp;gt;&lt;br /&gt;email address &amp;lt;%= session.getAttribute("email")%&amp;gt;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;lt;a href="?logout=true"&amp;gt;Log out&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;% } %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Note the form action sends the user to the consumer_redirect.jsp page we took from openid4java.&amp;nbsp; The hidden parameter &lt;i&gt;openid&lt;/i&gt; is sent to consumer_redirect.jsp and tells it to redirect to the Google login page. The consumer_returnurl.jsp page acts like a callback page and tells the Google login form where to redirect the browser request if login was successful.&amp;nbsp; Your future requests will be filtered through this servlet, which can enforce verification. &lt;br /&gt;&lt;br /&gt;Finally, note that several session variables will be set. Here are some sample name-value pairs (just use session.getAttributeNames() in index.jsp and list):&lt;br /&gt;&lt;br /&gt;&lt;b&gt;openid-disco &lt;/b&gt; OpenID2 OP-endpoint:https://www.google.com/accounts/o8/ud ClaimedID:null Delegate:null&lt;br /&gt;&lt;b&gt;email&lt;/b&gt;  marpierc AT gmail.com&lt;br /&gt;&lt;b&gt;openid-claimed&lt;/b&gt;  https://www.google.com/accounts/o8/id?id=ABCdefg-hIJKLMNop&lt;br /&gt;&lt;b&gt;openid&lt;/b&gt;  https://www.google.com/accounts/o8/id?id=ABCdefg-hIJKLMNop&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;You may want to use these in other applications.&amp;nbsp; We use the email attribute to identify the user for database purposes.&amp;nbsp; You may also want to use these variables to associate a successful OpenID login with a legacy user entry in your database.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-5614802616032869539?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/5614802616032869539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=5614802616032869539' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5614802616032869539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5614802616032869539'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/12/quick-guide-to-using-googles-openid.html' title='Quick Guide to Using Google&apos;s OpenID'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-6594730270407288417</id><published>2009-12-14T14:02:00.000-08:00</published><updated>2009-12-14T14:38:43.671-08:00</updated><title type='text'>Getting Started with Friend Connect</title><content type='html'>This blog post will cover two simple capabilities of Google Friend Connect: creating a social network and rating items in a table.&amp;nbsp; First, however, let's provide some motivation for science portals.&lt;br /&gt;&lt;br /&gt;We've developed the &lt;a href="http://www.quakesim.org/"&gt;QuakeSim&lt;/a&gt; portal for several years to support earthquake modeling research and education. A typical scenario, common in many other gateways, is for a user to set up and launch an application through a Web interface.&amp;nbsp; Web services are needed to both run the modeling code and preserve metadata about the run: the input parameters, the time the code was executed, the URLs of all the input, output, and error files, and so on.&amp;nbsp; We organize these metadata fields as projects owned by a particular user.&amp;nbsp; The metadata is modeled with JavaBeans and stored in object databases, although these are irrelevant technical details here.&amp;nbsp; It is also possible, and appropriate, to model the metadata as Atom/RSS, for example.&lt;br /&gt;&lt;br /&gt;Let's look first at creating a little GFC social network of people who may be interested in looking at the metadata feeds.&amp;nbsp; You will need to create a Google account if you don't have one and register a URL with GFC.&amp;nbsp; Just use your development machine's URL, as you would with Google Maps.&amp;nbsp; Note the Site ID that you are assigned (it will be in the GFC URL of the projects you register).&amp;nbsp; You'll need to use this in your GFC applications.&lt;br /&gt;&lt;br /&gt;To get started, you can generate code for lots of GFC applications.&amp;nbsp; Just save this generated HTML/JavaScript in files that can be loaded from your Web server.&amp;nbsp;&amp;nbsp; If you want to use these as standalone pages, be sure to add &amp;lt;html&amp;gt; and &amp;lt;body&amp;gt; tags to the beginning and end of the document.&amp;nbsp; You can also embed the generated code into existing HTML pages.&amp;nbsp; To wrap the code as a gadget, just paste it in the CDATA section of an "html" gadget.&lt;br /&gt;&lt;br /&gt;First, now, we need a GFC code snippet to manage logins and mini-social networks.&amp;nbsp; The GFC way for doing this is shown below:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;!-- Include the Google Friend Connect javascript library. --&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;script type="text/javascript" src="http://www.google.com/friendconnect/script/friendconnect.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;!-- Define the div tag where the gadget will be inserted. --&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;div id="div-4719709228063302739" style="width:276px;border:1px solid #cccccc;"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;!-- Render the gadget into a div. --&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;var skin = {};&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['BORDER_COLOR'] = '#cccccc';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['ENDCAP_BG_COLOR'] = '#e0ecff';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['ENDCAP_TEXT_COLOR'] = '#333333';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['ENDCAP_LINK_COLOR'] = '#0000cc';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['ALTERNATE_BG_COLOR'] = '#ffffff';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['CONTENT_BG_COLOR'] = '#ffffff';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['CONTENT_LINK_COLOR'] = '#0000cc';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['CONTENT_TEXT_COLOR'] = '#333333';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['CONTENT_SECONDARY_LINK_COLOR'] = '#7777cc';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['CONTENT_SECONDARY_TEXT_COLOR'] = '#666666';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['CONTENT_HEADLINE_COLOR'] = '#333333';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['NUMBER_ROWS'] = '4';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;google.friendconnect.container.setParentUrl('/gadgets-repo/' /* location of rpc_relay.html and canvas.html */);&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;google.friendconnect.container.renderMembersGadget(&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;{ id: 'div-4719709228063302739',&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; site: '16707400350554686557' },&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; skin);&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The site ID in the above example is one of my site IDs.&amp;nbsp; You would need to replace this with your site ID.&lt;br /&gt;&lt;br /&gt;This is just generated code from the GFC site.&amp;nbsp; I only added the (necessary) HTML and BODY tags so that it would work as a standalone&amp;nbsp; page. Load this new HTML page in your browser and use it to sign in and add people to your network.&amp;nbsp; If you are already signed in to a Google site (say to iGoogle) on the same browser, then the GFC widget above should detect this through cookies. Note that this network should apply only to a specific site ID, so you can create multiple social networks.&amp;nbsp; One difficulty here of course is that all of this is external to your legacy portal's authentication system. &lt;br /&gt;&lt;br /&gt;Our next example is a rating widget that can be embedded into an existing page.&amp;nbsp; Recall our motivating problem was an archive list of project metadata associated with a particular user's previous code submissions.&amp;nbsp;&amp;nbsp; In QuakeSim, we render this information using JSF datatables populated with JavaBeans pulled from an object database, but this detail is irrelevant here.&amp;nbsp; In the browser, the generated page would look something like the HTML below:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;!-- Include the Google Friend Connect javascript library. --&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;script type="text/javascript" src="http://www.google.com/friendconnect/script/friendconnect.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;!-- Define the div tag where the gadget will be inserted. --&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;table border="1"&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;th&amp;gt;Project&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Date&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Input File&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Output File&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Recommend&amp;lt;/th&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Northridge&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 123456789&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 08:43 GMT, Dec 14, 2009&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="http://www.quakesim.org/mpierce/northridge/input"&amp;gt;Input&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="http://www.quakeims.org/mpierce/northridge/output"&amp;gt;Output&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="div-1095870898733665271" style="width:100%;"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Plieto&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 987654321&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 10:12 GMT, Dec 12, 2009&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="http://www.quakesim.org/mpierce/plieto/input"&amp;gt;Input&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="http://www.quakeims.org/mpierce/plieto/output"&amp;gt;Output&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="div-123456789" style="width:100%;"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;var skin = {};&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['HEIGHT'] = '21';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['BUTTON_STYLE'] = 'compact';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['BUTTON_TEXT'] = 'Recommend it!';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['BUTTON_ICON'] = 'default';&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;google.friendconnect.container.setParentUrl('/gadgets-repo/' /* location of rpc_relay.html and canvas.html */);&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;google.friendconnect.container.renderOpenSocialGadget(&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;{ id: 'div-1095870898733665271',&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; url:'http://www.google.com/friendconnect/gadgets/recommended_pages.xml',&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; height: 21,&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; site: '16707400350554686557',&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; 'view-params':{"pageUrl":"http://www.quakesim.org/users/mpierce/northridge","pageTitle":"Northridge","docId":"recommendedPages"}&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;},&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; skin);&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;google.friendconnect.container.renderOpenSocialGadget(&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;{ id: 'div-123456789',&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; url:'http://www.google.com/friendconnect/gadgets/recommended_pages.xml',&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; height: 21,&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; site: '16707400350554686557',&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; 'view-params':{"pageUrl":"http://www.quakesim.org/users/mpierce/plieto","pageTitle":"Plieto","docId":"recommendedPages"}&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;},&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; skin);&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The main thing to notice is that each project has been given a URL.&amp;nbsp; I use http://www.quakesim.org/users/mpierce as the base--see the pageUrl parameter in the code above. This assumes a REST style programming model for the metadata services, which unfortunately isn't implemented yet (but now I have some motivation to do it...).&amp;nbsp; The javascript at the end is a slightly modified version of generated GFC code.&amp;nbsp; The values for the view-params (pageURL, pageTitle) are generated and should be taken from entries in your project database.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Each entry in the table will have a button with "Recommend It" in the final column.&amp;nbsp; You can get a list of recommended projects in a page like the one below (again, this is generated by an online GFC tool):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;!-- Include the Google Friend Connect javascript library. --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;script type="text/javascript" src="http://www.google.com/friendconnect/script/friendconnect.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;!-- Define the div tag where the gadget will be inserted. --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;div id="div-6585877907190446397" style="width:300px;border:1px solid #cccccc;"&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;!-- Render the gadget into a div. --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;var skin = {};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['BORDER_COLOR'] = '#cccccc';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['ENDCAP_BG_COLOR'] = '#e0ecff';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['ENDCAP_TEXT_COLOR'] = '#333333';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['ENDCAP_LINK_COLOR'] = '#0000cc';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['ALTERNATE_BG_COLOR'] = '#ffffff';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['CONTENT_BG_COLOR'] = '#ffffff';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['CONTENT_LINK_COLOR'] = '#0000cc';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['CONTENT_TEXT_COLOR'] = '#333333';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['CONTENT_SECONDARY_LINK_COLOR'] = '#7777cc';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['CONTENT_SECONDARY_TEXT_COLOR'] = '#666666';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['CONTENT_HEADLINE_COLOR'] = '#333333';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['HEADER_TEXT'] = 'Recommended stories';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;skin['RECOMMENDATIONS_PER_PAGE'] = '5';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;google.friendconnect.container.setParentUrl('/gadgets-repo/' /* location of rpc_relay.html and canvas.html */);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;google.friendconnect.container.renderOpenSocialGadget(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;{ id: 'div-6585877907190446397',&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; url:'http://www.google.com/friendconnect/gadgets/recommended_pages.xml',&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; site: '16707400350554686557',&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; 'view-params':{"docId":"recommendedPages"}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; skin);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Integration Thoughts:&lt;/b&gt; the main issue I see in the above example is integrating the GFC authentication and authorization system with your portal. We'll look at this next.&amp;nbsp; Also, one of the strengths of GFC is the simplicity of the JavaScript code exposed to the end developer.&amp;nbsp; Gateways have long had a problem integrating in programming-literate computational scientists who just didn't care to learn Enterprise Java and similar things. To retain this advantage of GFC, we would probably need to consider building our own higher level gadget that queries our project database and is rendered with &lt;i&gt;google.friendconnect.container.renderOpenSocialGadget() &lt;/i&gt;GFC call.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-6594730270407288417?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/6594730270407288417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=6594730270407288417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6594730270407288417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6594730270407288417'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/12/getting-started-with-friend-connect.html' title='Getting Started with Friend Connect'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-1824914968379826216</id><published>2009-12-10T08:09:00.000-08:00</published><updated>2009-12-11T14:19:25.700-08:00</updated><title type='text'>Building Simple Social Network Applications with Google Friend Connect</title><content type='html'>Within the academic community, there has been a push by various groups to provide a "Facebook for Scientists", a "Facebook for Scholars", or similar things.&amp;nbsp; This is to sell you something, of course. I am skeptical of this approach, since we already have Facebook, and I don't want to join and contribute to yet another social network, especially if I don't know its long term sustainability. &lt;br /&gt;&lt;br /&gt;Let's try to follow a systematic approach.&amp;nbsp; As a starting point, I would like to point you to a nice &lt;a href="http://portal.acm.org/citation.cfm?id=1658260.1658266&amp;amp;coll=portal&amp;amp;dl=ACM&amp;amp;type=series&amp;amp;idx=SERIES371&amp;amp;part=series&amp;amp;WantType=Proceedings&amp;amp;title=SC&amp;amp;CFID=://www.collab-ogce.org/gce09/index.php/Main_Page&amp;amp;CFTOKEN=www.collab-ogce.org/gce09/index.php/Main_Page"&gt;submission&lt;/a&gt; by Roger Curry, Cameron Kiddle and Rob Simmonds to our recent &lt;a href="http://www.collab-ogce.org/gce09/"&gt;GCE09 workshop&lt;/a&gt;. The authors looked at using Facebook, Ning, and &lt;a href="http://www.blogger.com/"&gt;Elgg&lt;/a&gt; as three social networking platforms.&amp;nbsp; You know Facebook, and you probably know that Ning is a social networking hosting service.&amp;nbsp; Elgg was new to me: it is a downloadable software package, like Drupal or Mambo.&amp;nbsp; Unlike Drupal, however, Elgg is designed from the beginning to be a social networking platform rather than a content management system.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Curry, Kiddle, and Simmonds's paper presents three detailed case studies.&amp;nbsp; I would add some additional remarks on requirements.&amp;nbsp; First, a new social networking site should be compatible with existing social networks and related standards.&amp;nbsp; I should be able to import in my existing profile and social networking information.&amp;nbsp; I should also be able to reuse my identity from another site.&amp;nbsp; I don't want to remember yet another password.&amp;nbsp; Similarly, I should be able to export my social networking information.&amp;nbsp; I don't want to get locked in. OpenID, OpenSocial, OAuth, and related standards may make it easier to share one's identity and information across social networking services. &lt;br /&gt;&lt;br /&gt;Second, development flexibility is important.&amp;nbsp; Of the three social networks Curry et al reviewed, Ning's hosted service was generally the least favored. Part of this was because of the advertisements, but it was also noted that access to Ning source code was limited.&amp;nbsp; If you are considering a hosted service, you need also to consider the development framework that you will be required to use, its strengths, and its weaknesses.&lt;br /&gt;&lt;br /&gt;Third, I want to use the best available implementation of a capability, which may not be the one that comes in the software. For example, there are many wikis and calendaring tools.&amp;nbsp; I want the ability to easily import these tools into a social networking framework.&amp;nbsp; I don't want to rely upon the wiki or calendar plugin that comes with some particular framework.&lt;br /&gt;&lt;br /&gt;For these reasons, I have become very interested in Google Friend Connect (GFC) as a way to build social networking science gateways (and credit goes to Raminder Singh and Gerald Guo in our lab for introducing this to me).&amp;nbsp; Gadgets are particularly interesting in that they are a client-side technology: any Web development framework can be used to develop gadgets.&amp;nbsp; We have developed an open source gadget container (see &lt;a href="http://www.collab-ogce.org/ogce/index.php/OGCE_Gadget_Container"&gt;http://www.collab-ogce.org/ogce/index.php/OGCE_Gadget_Container&lt;/a&gt;) that can be used to host your own gadgets.&amp;nbsp;&amp;nbsp; We discuss these things in more detail and provide an implementation case study in our own &lt;a href="http://portal.acm.org/citation.cfm?id=1658260.1658267&amp;amp;coll=portal&amp;amp;dl=ACM&amp;amp;type=series&amp;amp;idx=SERIES371&amp;amp;part=series&amp;amp;WantType=Proceedings&amp;amp;title=SC&amp;amp;CFID=://www.collab-ogce.org/gce09/index.php/Main_Page&amp;amp;CFTOKEN=www.collab-ogce.org/gce09/index.php/Main_Page"&gt;workshop paper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I have advocated using Open Social and Google Gadgets for some time (see for example &lt;a href="http://grids.ucs.indiana.edu/ptliupages/publications/INGRIDFinal.pdf"&gt;http://grids.ucs.indiana.edu/ptliupages/publications/INGRIDFinal.pdf&lt;/a&gt;), but the JavaScript API is not particularly simple, and of course Facebook (the biggest US social networking site) doesn't participate in Open Social.&amp;nbsp; Thus, while Open Social provides a nice and well documented interface, it is likely that the social network information that it can access is lower quality than Facebook's (at least for US users).&lt;br /&gt;&lt;br /&gt;GFC solves those two problems. First, the developer API, although still in JavaScript, is much simpler than Open Social's. The GFC site provides a number of basic capabilities (chat, comment, rating, polling, etc) that have generated HTML and JavaScript code.&amp;nbsp; You can build up more complicated applications by cutting and pasting these capabilities into a single mash-up, add them to an existing HTML page, or make them into a gadget.&amp;nbsp; Second, GFC applications are linked to Google's single sign-on system.&amp;nbsp; Google may not have the social networking depth of Facebook, but they do have untold millions of accounts through GMail, Groups, and other popular online tools.&amp;nbsp; This allows you to create miniature social networks for a particular GFC application out of your gmail contact list.&amp;nbsp; Each GFC application is associated with a particular URL (and generated site ID), so you can create multiple networks out of the pool of Google accounts.&lt;br /&gt;&lt;br /&gt;In subsequent posts, I'll look at GFC in a little more detail to examine its potential for science gateway social networks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-1824914968379826216?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/1824914968379826216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=1824914968379826216' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1824914968379826216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1824914968379826216'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/12/building-simple-social-network.html' title='Building Simple Social Network Applications with Google Friend Connect'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-804492907696016745</id><published>2009-12-03T12:30:00.000-08:00</published><updated>2009-12-03T12:34:41.232-08:00</updated><title type='text'>Mass Imports of Maven Repositories into Archiva</title><content type='html'>Credit goes to Fugang Wang for this crafty trick.&amp;nbsp; Archiva is a Web-based system for managing your Maven repositories.&amp;nbsp; Unfortunately the Web interface only allows you to upload one jar at a time, and you also need to provide metadata (artifactId, version, group, etc).&amp;nbsp; This isn't very useful if you need to import a few dozen or more jars.&lt;br /&gt;&lt;br /&gt;Here is how to import an existing local repository (that is, your $HOME/.m2 directory) into Archiva:&lt;br /&gt;&lt;br /&gt;1. Create a new named repository, say cyberaide. Then you'll get a directory 'cyberaide' under the archiva installation directory.&lt;br /&gt;2. Move the whole repo directory under the newly created directory.&lt;br /&gt;3. Click the 'Repository scanning' button for your repository. This will 'repair' the artifacts db so the newly added artifacts would show up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-804492907696016745?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/804492907696016745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=804492907696016745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/804492907696016745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/804492907696016745'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/12/mass-imports-of-your-maven-repository.html' title='Mass Imports of Maven Repositories into Archiva'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-8295969718252148606</id><published>2009-07-23T17:41:00.000-07:00</published><updated>2009-07-23T18:03:11.880-07:00</updated><title type='text'>Karajan and GridFTP</title><content type='html'>I owe big thanks to Mihael Hategan for some help here.&lt;br /&gt;&lt;br /&gt;Karajan is a workflow system that is part of the Java COG Kit and also powers the Swift system.  You can get it in the 4.1.5 version of the COG Kit, but this version is out of date, so it is better to get the code from the SourceForge SVN:&lt;br /&gt;&lt;br /&gt;View it: &lt;a href="http://cogkit.svn.sourceforge.net/viewvc/cogkit/trunk/current/src/cog/"&gt;http://cogkit.svn.sourceforge.net/viewvc/cogkit/trunk/current/src/cog/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Get it: svn co https://cogkit.svn.sourceforge.net/svnroot/cogkit/trunk/current/src/cog&lt;br /&gt;&lt;br /&gt;Compile with ant.  Here's an example script that will run gridftp on a remote host and return the file listing and metadata to your screen.  Run it with $COG_INSTALL_PATH/bin/cog-workflow gridftpExample.xml:&lt;br /&gt;&lt;br /&gt;&amp;lt;project&amp;gt;&lt;br /&gt;&amp;lt;include file="cogkit.xml"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;set name="l"&amp;gt;&lt;br /&gt;  &amp;lt;file:list dir="." host="gridftp-hg.ncsa.teragrid.org" provider="gridftp"/&amp;gt;&lt;br /&gt;&amp;lt;/set&amp;gt;&lt;br /&gt;&amp;lt;for name="file" in="{l}"&amp;gt;&lt;br /&gt;  &amp;lt;set names="type,permissions,size,modified"&amp;gt;&lt;br /&gt;  &amp;lt;file:info file="{file}"/&amp;gt;&lt;br /&gt;  &amp;lt;/set&amp;gt;&lt;br /&gt;  &amp;lt;print message="{file} Type:{type} Permissions:{permissions} Size:{size} Modified:{modified}"/&amp;gt;&lt;br /&gt;&amp;lt;/for&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mihael actually added some of these fields on my request (they are part of the underlying code).&lt;br /&gt;&lt;br /&gt;Karajan also has its own scripting language that is much less awkward than XML for expressing the scripts:&lt;br /&gt;&lt;br /&gt;import("sys.k")&lt;br /&gt;import("task.k")&lt;br /&gt;&lt;br /&gt;element(niceType, [type]&lt;br /&gt;  if (&lt;br /&gt;    type == FILETYPE:FILE, "File"&lt;br /&gt;    type == FILETYPE:DIRECTORY, "Directory"&lt;br /&gt;    type == FILETYPE:SOFTLINK, "Softlink"&lt;br /&gt;    type == FILETYPE:DEVICE, "Device"&lt;br /&gt;    "Unknown"&lt;br /&gt;  )&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;files := file:list(dir=".",host="gridftp-hg.ncsa.teragrid.org",provider="GT2")&lt;br /&gt;&lt;br /&gt;for(f, files,&lt;br /&gt;  [type, perm, size, modified] := file:info(f)&lt;br /&gt;  print("name: {f}, type: ", niceType(type), &lt;br /&gt;    " ({type}), size: {size}, modified: {modified}, permissions: {perm}") &lt;br /&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-8295969718252148606?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/8295969718252148606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=8295969718252148606' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8295969718252148606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8295969718252148606'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/07/karajan-and-gridftp.html' title='Karajan and GridFTP'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-1252837638047638479</id><published>2009-07-07T17:23:00.000-07:00</published><updated>2009-07-07T19:45:07.977-07:00</updated><title type='text'>Blogger, Google, and Bing</title><content type='html'>I noticed my inflammatory post on how to use Gaussian on the TeraGrid (&lt;a href="http://communitygrids.blogspot.com/2009/07/running-gaussian-on-big-red.html"&gt;http://communitygrids.blogspot.com/2009/07/running-gaussian-on-big-red.html&lt;/a&gt;) is the #3 match if you google "gaussian teragrid", but it doesn't make the Top 50 if you use Bing.  I suppose Google is weighting the search results to direct you to Blogger/Blogspot content.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-1252837638047638479?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/1252837638047638479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=1252837638047638479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1252837638047638479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1252837638047638479'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/07/blogger-google-and-bing.html' title='Blogger, Google, and Bing'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-3145694527983184994</id><published>2009-07-06T13:03:00.000-07:00</published><updated>2009-10-12T08:15:20.570-07:00</updated><title type='text'>Running Gaussian on TeraGrid</title><content type='html'>These are notes for running &lt;a href="http://www.gaussian.com/"&gt;Gaussian&lt;/a&gt; serially on the TeraGrid.  I'll look at IU's BigRed and NCSA's Abe, Mercury, and Cobalt. Surprisingly this wasn't documented anywhere that I could find with Google (I had to resort to the Help Desk, which was helpful but this is missing the point). And of course running things on each machine requires a different incantation.  You may wonder why the TeraGrid doesn't make its environments more consistent for these common applications.  I suggest posting hypotheses on this subject as comments.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;IU's Big Red&lt;/span&gt;&lt;br /&gt;Gaussian is a famous piece of Quantum Chemistry software.  I'll assume you have an input file, your_input.inp.&lt;br /&gt;&lt;br /&gt;1. Request to be added to the Gaussian group.  I found this through non-standard routes (thanks to Ray Sheppard) but try contacting the TeraGrid help desk.  You have to do this before you can proceed.&lt;br /&gt;&lt;br /&gt;1.5 Add gaussian to your .soft file.  For more on the SoftEnv, see &lt;a href="http://www.teragrid.org/userinfo/jobs/environment.php"&gt;http://www.teragrid.org/userinfo/jobs/environment.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My .soft file looks like this:&lt;br /&gt;more ~/.soft&lt;br /&gt;#  &lt;br /&gt;# This is the .soft file.&lt;br /&gt;# It is used to customize your environment by setting up environment&lt;br /&gt;# variables such as PATH and MANPATH.&lt;br /&gt;# To learn what can be in this file, use 'man softenv'.&lt;br /&gt;#&lt;br /&gt;#&lt;br /&gt;@bigred&lt;br /&gt;@teragrid-basic&lt;br /&gt;@globus-4.0&lt;br /&gt;@teragrid-dev&lt;br /&gt;+gaussian&lt;br /&gt;----------------------&lt;br /&gt;Either type "resoft" or just exit and login again.&lt;br /&gt;&lt;br /&gt;2. Make a Loadleveler script like the one below:&lt;br /&gt;---------------&lt;br /&gt;# @ output=stdout.txt&lt;br /&gt;# @ error=stderr.txt&lt;br /&gt;# @ wall_clock_limit=5:00:00&lt;br /&gt;# @ account_no=YOUR_ACCOUNT_NUMBER&lt;br /&gt;# @ queue=default&lt;br /&gt;&lt;br /&gt;export g03root=/N/soft/linux-sles9-ppc64/gaussian/g03-d.02&lt;br /&gt;. $g03root/g03/bsd/g03.profile&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;g03 $HOME/your_input.inp $HOME/your_output.out&lt;br /&gt;---------------&lt;br /&gt;&lt;br /&gt;A real script would move stuff in and out of scratch space and stuff like that (Gaussian creates very large files while you run it), but I intend to automate this through Globus+Condor-g.  Also this only will submit serial jobs.&lt;br /&gt;&lt;br /&gt;3. Submit with llsubmit, track with llq.  The IU Knowledge Base has a nice comparison of Loadleveler and PBS commands and directives here: &lt;a href="http://kb.iu.edu/data/axpz.html"&gt;http://kb.iu.edu/data/axpz.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NCSA's Abe&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Unlike the other machines, you definitely do not want "+gaussian" in your .soft file on abe. This will produce the following error:&lt;br /&gt;&lt;br /&gt;g03: error while loading shared libraries: /usr/local/intel/mkl/10.0.3.020/lib/em64t/libmkl.so: invalid ELF header&lt;br /&gt;&lt;br /&gt;Make a PBS script like the one below. Again this is only a serial job.&lt;br /&gt;[mpierce@honest2 ~]$ more gaussTest.pbs&lt;br /&gt;#PBS -o stdout.txt&lt;br /&gt;#PBS -e stderr.txt&lt;br /&gt;#PBS -A YOUR_ACCOUNT_NUMBER&lt;br /&gt;#PBS -q normal&lt;br /&gt;#PBS -l walltime=05:00:00&lt;br /&gt;&lt;br /&gt;soft add +intel-mkl&lt;br /&gt;setenv g03root /usr/apps/chemistry/gaussian/g03&lt;br /&gt;source $g03root/g03/bsd/g03.login&lt;br /&gt;g03 $HOME/your_input.inp $HOME/yourOutput.out&lt;br /&gt;----------------------&lt;br /&gt;&lt;br /&gt;Alternatively, I could have added intel-mkl to my .soft file. I had to get the NCSA Help Desk to tell me this (thanks go to John Estabrook @ NCSA for a quick and accurate response to my ticket).  They pointed me in the right direction, but why not just have this documented?  &lt;br /&gt;&lt;br /&gt;NCSA also has a command-line tool, /usr/local/bin/qg03, that will make and submit a better PBS script than the one above.&lt;br /&gt;&lt;br /&gt;globusrun -o -r grid-abe.ncsa.teragrid.org/jobmanager-pbs '&amp;amp;(executable=/u/ncsa/mpierce/gaussian.abe.ncsa.sh)(arguments=/u/ncsa/mpierce/input.in /u/ncsa/mpierce/mepjunk12.out)(project=YOUR-TG-ACCOUNT)(queue=debug)(host_types=himem)(host_xcount=1)(xcount=8)'&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;br /&gt;globusrun -o -r grid-abe.ncsa.teragrid.org/jobmanager-pbs '&amp;amp;(executable=/u/ncsa/mpierce/gaussian.abe.ncsa.sh)(arguments=/u/ncsa/mpierce/input.in /u/ncsa/mpierce/mepjunk12.out)(project=YOUR-TG-ACCOUNT)(queue=debug)(count=1)(hostCount=8)(minMemory=16000)'&lt;br /&gt;&lt;br /&gt;I think these are equivalent.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;NCSA's Mercury&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;This still works but who knows how long it will be before the system/application admins break it.  As with Abe, best to at least use the qg03 command (it should be in your path) to generate a sample PBS script.&lt;br /&gt;&lt;br /&gt;1. Add "+gaussian" to your .soft file (in $HOME) as above.&lt;br /&gt;&lt;br /&gt;2. Make a PBS script like the one below. Again this is only a serial job.&lt;br /&gt;[mpierce@honest2 ~]$ more gaussTest.pbs&lt;br /&gt;#PBS -o stdout.txt&lt;br /&gt;#PBS -e stderr.txt&lt;br /&gt;#PBS -A YOUR_ACCOUNT_NUMBER&lt;br /&gt;#PBS -l walltime=05:00:00&lt;br /&gt;&lt;br /&gt;g03 $HOME/your_input.inp $HOME/yourOutput.out&lt;br /&gt;----------------------&lt;br /&gt;&lt;br /&gt;3. To invoke this with Globus clients or equivalent, you should use a command like&lt;br /&gt;&lt;br /&gt;globusrun -o -r grid-abe.ncsa.teragrid.org/jobmanager-pbs '&amp;amp;(executable=/u/ncsa/mpierce/gaussian.cobalt.ncsa.sh)(arguments=/u/ncsa/mpierce/input.in /u/ncsa/mpierce/mepjunk12.out)(project=YOUR_ACCOUNT)(queue=debug)(minMemory=1600)'  &lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;br /&gt;globusrun -o -r grid-abe.ncsa.teragrid.org/jobmanager-pbs '&amp;amp;(executable=/u/ncsa/mpierce/gaussian.mercury.ncsa.sh)(arguments=/u/ncsa/mpierce/input.in /u/ncsa/mpierce/mepjunk12.out)(project=YOUR_ACCOUNT)(queue=debug)(host_types=himem)(host_xcount=1)(xcount=1)'  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NCSA's Cobalt&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;This has changed and so previous instructions (identical to running Gaussian on Mercury above) no longer work.  *DELETED TIRADE*.  Setting +gaussian in your .soft no longer seems to work.  Use the following minimal scriptlet&lt;br /&gt;&lt;br /&gt;#!/bin/csh&lt;br /&gt;setenv g03root /usr/apps/chemistry/gaussian/G03/pp5_e01&lt;br /&gt;source $g03root/g03/bsd/g03.login&lt;br /&gt;$g03root/g03/g03 $1 $2&lt;br /&gt;&lt;br /&gt;You can invoke this with a globus run command like the one above.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;PSC's Pople&lt;/span&gt;&lt;br /&gt;You have to fill out a &lt;a href="http://www.psc.edu/general/software/packages/gaussian/"&gt;PDF form&lt;/a&gt; and mail or fax it to PSC to get access to Gaussian. I did not pursue this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-3145694527983184994?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/3145694527983184994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=3145694527983184994' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3145694527983184994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3145694527983184994'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/07/running-gaussian-on-big-red.html' title='Running Gaussian on TeraGrid'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2543191833780403754</id><published>2009-07-03T08:46:00.000-07:00</published><updated>2009-07-03T08:52:09.790-07:00</updated><title type='text'>Error in gsi-ssh and ssh on Mac 10.5: percent_expand: NULL replacement</title><content type='html'>I found this error while trying to log onto the TeraGrid ("Tara Grid") with gsissh (google "teragrid single sign on" for context).  &lt;br /&gt;&lt;br /&gt;percent_expand: NULL replacement&lt;br /&gt;&lt;br /&gt;Apparently this is a well-known bug with Mac 10.5's ssh.  The workaround is to append "-i ~/.ssh/id_rsa" or "-i ~/.ssh/id_dsa" to the command line, like so:&lt;br /&gt;&lt;br /&gt; gsissh login-hg.ncsa.teragrid.org -i ~/.ssh/id_rsa&lt;br /&gt;&lt;br /&gt;I got this from &lt;a href="http://www.nabble.com/ssh%3A-percent_expand%3A-NULL-replacement-to13439207.html"&gt;http://www.nabble.com/ssh%3A-percent_expand%3A-NULL-replacement-to13439207.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2543191833780403754?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2543191833780403754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2543191833780403754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2543191833780403754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2543191833780403754'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/07/error-in-gsi-ssh-and-ssh-on-mac-105.html' title='Error in gsi-ssh and ssh on Mac 10.5: percent_expand: NULL replacement'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-1539334587546583117</id><published>2009-06-30T19:23:00.000-07:00</published><updated>2009-07-07T14:04:43.599-07:00</updated><title type='text'>Some CML Fun</title><content type='html'>These are some notes on some initial work to create a chemical properties pipeline.  End result will be calculated properties in an RDF triple store that can be exported using &lt;a href="http://www.openarchives.org/ore/"&gt;ORE/Atom&lt;/a&gt;.  If I don't write this stuff down, I'll forget it.&lt;br /&gt;&lt;br /&gt;Step 0: get &lt;a href="http://sourceforge.net/projects/cml"&gt;Jumbo CML converter tools&lt;/a&gt; from SourceForge.  Peter Murray Rust was kind enough to write a little README, now in the SVN. I did an SVN checkout rather than download the tagged Jumbo versio 5.4 or 5.5.&lt;br /&gt;&lt;br /&gt;svn co https://cml.svn.sourceforge.net/svnroot/cml/jumbo-converter/trunk jumbo-converter&lt;br /&gt;&lt;br /&gt;Step 0.5: Compile as an executable jar.  I used "mvn assembly:assembly". See &lt;a href="http://www.springone2gx.com/blog/scott_leberknight/2008/06/creating_executable_jars_using_the_maven_assembly_plugin.html"&gt;http://www.springone2gx.com/blog/scott_leberknight/2008/06/creating_executable_jars_using_the_maven_assembly_plugin.html&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Step 0.75: Run with sample data using the command (must set classpath):&lt;br /&gt;&lt;br /&gt;java -jar target/jumbo-converters-jar-with-dependencies.jar -converter org.xmlcml.cml.converters.molecule.pubchem.PubchemXML2CMLConverter&lt;br /&gt;-sd examples/input -odir ../output -is pubchem.xml -os pubchem.cml&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 1: get XML descriptions of molecules from Pubchem.  I'm not a chemist, so I did a structure similarity search on caffeine, applied &lt;a href="http://en.wikipedia.org/wiki/Lipinski%27s_Rule_of_Five"&gt;the Rule of Five&lt;/a&gt;, and got 1298 matches. That's pretty good.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 2: Unfortunately the PubChem download gives everything in one big XML file, but Jumbo's converter expects each molecule to be in a separate file.  I googled around and made a little Perl script to do this:&lt;br /&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;&lt;br /&gt;use File::Basename;&lt;br /&gt;&lt;br /&gt;$file = @ARGV[0];&lt;br /&gt;&lt;br /&gt;open(_FH, "&amp;lt; $file") or die "Unable to open file: $file\n";&lt;br /&gt;&lt;br /&gt;$count=0;&lt;br /&gt;$max_records=1;&lt;br /&gt;$files_counter=0;&lt;br /&gt;&lt;br /&gt;while(&amp;lt;_FH&amp;gt;)&lt;br /&gt;{&lt;br /&gt;         if($count == 0)&lt;br /&gt;         {&lt;br /&gt;&lt;br /&gt;                  my @suffix=qw(.pubchem.xml);&lt;br /&gt;                  my ($basefilename, $path, $suffix)=fileparse($file,@suffix);&lt;br /&gt;                  $filename=$basefilename . "_part_" . $files_counter . $suffix;&lt;br /&gt;                  open(FH2, "&amp;gt; $filename") or die "Unable to open file: $filenam&lt;br /&gt;e\n";&lt;br /&gt;                  $count++;&lt;br /&gt;                  print FH2 "\&amp;lt;\?xml version=\"1.0\"\?\&amp;gt;\n";&lt;br /&gt;         }&lt;br /&gt;         &lt;br /&gt;         if (grep /&amp;lt;\/PC-Compound&amp;gt;/, $_ )&lt;br /&gt;         {&lt;br /&gt;                  print FH2 $_;&lt;br /&gt;                  $count++;&lt;br /&gt;         }&lt;br /&gt;         elsif (grep /&amp;lt;PC-Compound&amp;gt;/, $_ )&lt;br /&gt;         {&lt;br /&gt;                  print FH2 "&amp;lt;PC-Compound xmlns=\"http://www.ncbi.nlm.nih.gov\" &lt;br /&gt;xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\" xs:schemaLocation=\"http:&lt;br /&gt;//www.ncbi.nlm.nih.gov ftp://ftp.ncbi.nlm.nih.gov/pubchem/specifications/pubchem&lt;br /&gt;.xsd\"&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;         }&lt;br /&gt;         else {&lt;br /&gt;                  print FH2 $_;&lt;br /&gt;         }&lt;br /&gt;         &lt;br /&gt;         if ($count == $max_records + 1)&lt;br /&gt;         {&lt;br /&gt;                  $count = 0;&lt;br /&gt;                  $files_counter++;&lt;br /&gt;                  close(FH2);&lt;br /&gt;         }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;I stole a lot of this from &lt;a href="http://www.mysysad.com/2008/01/parse-xml-records-with-perl-script.html"&gt;http://www.mysysad.com/2008/01/parse-xml-records-with-perl-script.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 2.5: Rerun the converter command on the new files.  Jumbo was able to handle most but barfed on a few, so I'll have to follow up on this.&lt;br /&gt;&lt;br /&gt;Step 3: Go to lunch.  Next need PMR and Co. to decide on the best way to change the CML into Gaussian input files.&lt;br /&gt;&lt;br /&gt;Step 4: Realize you downloaded a bunch of 2D structures, so repeat steps 0-3 with 3D structures.&lt;br /&gt;&lt;br /&gt;Step 5: Make Gaussian input files from CML with &lt;br /&gt;&lt;br /&gt;java -jar target/jumbo-converters-jar-with-dependencies.jar -converter org.xmlcml.cml.converters.compchem.gaussian.input.CML2GaussianInputConverter -sd examples/output -odir ../gaussian -is pubchem.cml -os pubchem.gauss&lt;br /&gt;&lt;br /&gt;Current SVN of jumbo-converters won't compile without first checking out and compiling also cmlxom and jumbo5 from SVN (they are peers in the directory structure).&lt;br /&gt;&lt;br /&gt;Step 6. Run Gaussian on TeraGrid machines. See &lt;a href="http://communitygrids.blogspot.com/2009/07/running-gaussian-on-big-red.html"&gt;http://communitygrids.blogspot.com/2009/07/running-gaussian-on-big-red.html&lt;/a&gt;.  Welcome to 2009!&lt;br /&gt;&lt;br /&gt;Step 7. Get the data back and convert the Gaussian standard output to CML.  I used the command &lt;br /&gt;&lt;br /&gt;java -jar target/jumbo-converters-jar-with-dependencies.jar -converter org.xmlcml.cml.converters.compchem.gaussian.log.GaussianLog2CMLConverter -sd examples/gaussOut -odir ../gaussOut -is out -os cml&lt;br /&gt;&lt;br /&gt;I put the Gaussian output files in the examples/gaussOut directory.&lt;br /&gt;&lt;br /&gt;Step 8. Convert the output CML to RDF:&lt;br /&gt;&lt;br /&gt;java -jar target/jumbo-converters-jar-with-dependencies.jar -converter org.xmlcml.cml.converters.compchem.gaussian.GaussianCML2OWLRDFConverter -sd examples/gaussOut -odir ../gaussOut -is cml -os rdf&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-1539334587546583117?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/1539334587546583117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=1539334587546583117' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1539334587546583117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1539334587546583117'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/06/some-cml-fun.html' title='Some CML Fun'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-3496217365461362480</id><published>2009-06-24T08:13:00.000-07:00</published><updated>2009-07-01T19:11:11.516-07:00</updated><title type='text'>Jobs at the Pervasive Technology Institute</title><content type='html'>We are looking to fill two positions.  Please see the full ad below. &lt;br /&gt;&lt;br /&gt;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;The following positions based at IUB and reporting to Marlon Pierce, Assistant Director, Community Grid Labs, is being posted externally. If interested, you must apply online at &lt;a href="http://www.jobs.indiana.edu/"&gt;http://www.jobs.indiana.edu/.&lt;/a&gt; Search for job listing 401 and refer to positions number #00034420 and #00034425.  See also &lt;a href="https://ola.indiana.edu/joblisting/index.cfm?jlnum=401&amp;search=2"&gt;https://ola.indiana.edu/joblisting/index.cfm?jlnum=401&amp;search=2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Principal Software Research Engineers - PAE4IT (Two positions available)&lt;br /&gt;&lt;br /&gt;Description and Responsibilities:&lt;br /&gt;&lt;br /&gt;Indiana University is looking for experienced individuals to fill multiple positions in Cloud computing , Grid computing, and message-oriented middleware development.   The positions call for expertise in Web service software development, experience developing Java Messaging Service (JMS) applications and related Enterprise event bus technologies, experience with distributed systems, sensor webs, and/or audio-video systems research and advanced development.  &lt;br /&gt;Working independently, the incumbent provides expertise in the evaluation, development, implementation and deployment of specific Cloud Computing, Message-Oriented Middleware, and Grid-related technologies in conjunction with Pervasive Technology Institute and Research Technology staff and collaborators.  Investigate research problems in distributed computing systems, develop software using best software engineering practices, publish peer-reviewed research articles in workshops and journals, evaluate existing technologies, supervise staff and graduate students, and oversee all development aspects of Cloud and Grid scientific data and application management. Work with scientific users to develop Cloud and Grid systems.  Collaborate with key academic researchers and open source user community including faculty, scientific researchers, and grant stakeholders.&lt;br /&gt;Indiana University's Pervasive Technology was recently awarded a 5 year extension to its core funding from the Lilly Endowment, following its highly successful initial 7 years (as the Pervasive Technologies Laboratories). PTI will be located in Indiana University's new state of the art Research Incubator facility. See http://www.pervasive.iu.edu/ for more information.  To date, the PTI laboratories have published more than 880 peer-reviewed papers, have won over $180,000,000 in grants over and above their core funding, and have released and maintain numerous open source software packages. PTI researchers work closely with Indiana University's Research Technology group, who maintain IU's world class cyberinfrastructure, http://racinfo.indiana.edu/cyberinfrastructure/.&lt;br /&gt;Qualifications:&lt;br /&gt;&lt;br /&gt;Master's degree in Computer Science or relate technical discipline (such as physics, informatics, engineering) is required. PhD preferred. Ph. D. incumbents must have demonstrated (through peer-reviewed publications and software products) a primary research focus on one or more of the following: a) distributed, parallel, Grid and/or Cloud computing; b) high performance, distributed messaging systems; c) audio/video collaboration systems; and d) security in distributed systems.  Incumbents with Master's degree must have five to seven years experience in software development and deployment in the appropriate field or fields.&lt;br /&gt;&lt;br /&gt;Requirements include a proven ability to undertake and succeed in innovative research projects, and excellent communication skill (covering scientific article writing, presentation skills, and the ability to work with and lead teams).     Experience developing software systems using standard software engineering practices (such as source code management software, build and test systems, etc).  For Cloud and Grid incumbents, experience developing Web Services, REST services, scientific workflows, and distributed Web applications on Unix/Linux/Mac OSX and/or Windows.  Experience developing applications on Grids using software such as Globus or Condor. Experience developing scientific and research Cloud applications using Amazon Web Services, Microsoft Azure, Google AppEngine, and related systems. Experience developing data-parallel scientific, machine learning, and/or information retrieval algorithms using systems such as Apache Hadoop and Microsoft Dryad.  For audio/video stream incumbents, demonstrated knowledge and implementation of standards as well as innovative systems.  For message-oriented middleware incumbents, demonstrated sophisticated experience with standard MOM software.  MOM incumbents should have experience both with core MOM development (efficient routing, security, reliable delivery) as well as applications.&lt;br /&gt;Ability to foster and maintain collaborations with internal and external academic researchers through a balanced, service-based approach required. Demonstrated ability to learn new technologies and tools.  Demonstrated initiative in evaluating  and adopting new technologies.  Organizational and leadership skills required. Able to operate effectively in a complex and dynamic environment with the capability of functioning as a project leader. Excellent oral and written communication skills. Demonstrated conceptual, analytical, and logical abilities. Ability to interact successfully with staff and faculty in extended consultations; demonstrate enthusiasm for new technologies; and deliver excellent outcomes under high pressure and short deadlines. Excellent communication skills required to interact with people of varying levels of knowledge.&lt;br /&gt;&lt;br /&gt;Indiana University is an Affirmative Action/Equal Employment institution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-3496217365461362480?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/3496217365461362480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=3496217365461362480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3496217365461362480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3496217365461362480'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/06/jobs-at-pervasive-technology-institute.html' title='Jobs at the Pervasive Technology Institute'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-198643367363798825</id><published>2009-06-04T08:28:00.000-07:00</published><updated>2009-06-04T08:29:06.764-07:00</updated><title type='text'>OGCE Overview Presentation from E-Science 2008</title><content type='html'>&lt;div style="width:425px;text-align:left" id="__ss_1533368"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/marpierc/ogce-project-overview?type=powerpoint" title="OGCE Project Overview"&gt;OGCE Project Overview&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ogce-gtlab-escience2-090604102624-phpapp01&amp;stripped_title=ogce-project-overview" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ogce-gtlab-escience2-090604102624-phpapp01&amp;stripped_title=ogce-project-overview" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;OpenOffice presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/marpierc"&gt;marpierc&lt;/a&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/19457310-198643367363798825?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/198643367363798825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=198643367363798825' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/198643367363798825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/198643367363798825'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/06/ogce-overview-presentation-from-e.html' title='OGCE Overview Presentation from E-Science 2008'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-1315965438788107620</id><published>2009-06-04T08:22:00.000-07:00</published><updated>2009-06-04T08:23:00.048-07:00</updated><title type='text'>Slideshare tutorial on GTLAB tag libraries</title><content type='html'>&lt;div style="width:425px;text-align:left" id="__ss_1532956"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/marpierc/gtlab-install?type=powerpoint" title="Gtlab Install"&gt;Gtlab Install&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gtlab-install-090604085817-phpapp02&amp;stripped_title=gtlab-install" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gtlab-install-090604085817-phpapp02&amp;stripped_title=gtlab-install" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;OpenOffice presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/marpierc"&gt;marpierc&lt;/a&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/19457310-1315965438788107620?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/1315965438788107620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=1315965438788107620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1315965438788107620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1315965438788107620'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/06/slideshare-tutorial-on-gtlab-tag.html' title='Slideshare tutorial on GTLAB tag libraries'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-9060220279501980166</id><published>2009-04-24T07:02:00.000-07:00</published><updated>2009-04-24T07:05:36.347-07:00</updated><title type='text'>New Pervasive Technology Institutes Web Site</title><content type='html'>I'm doing my part for page ranking: &lt;a href="http://www.pervasive.iu.edu/"&gt;http://www.pervasive.iu.edu/&lt;/a&gt;.  This is the Community Grids Lab's new grandparent organization.  We remain the same, just have a slightly different container org chart.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-9060220279501980166?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='' href='http://www.pervasive.iu.edu/' length='0'/><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/9060220279501980166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=9060220279501980166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/9060220279501980166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/9060220279501980166'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/04/new-pervasive-technology-institutes-web.html' title='New Pervasive Technology Institutes Web Site'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-265954233127082714</id><published>2009-04-16T10:19:00.000-07:00</published><updated>2009-04-16T10:22:36.358-07:00</updated><title type='text'>MS Word's Formatting Palette on Mac</title><content type='html'>To get this, just click "View-&gt;Formatting Palette". The pop-up has everything you need (fonts, bullets, pre-defined styles, etc) for formatting your text. &lt;br /&gt;&lt;br /&gt;I post this because I'm surprised that more people (Mac users anyway) apparently don't use this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-265954233127082714?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/265954233127082714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=265954233127082714' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/265954233127082714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/265954233127082714'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/04/ms-words-formatting-palette-on-mac.html' title='MS Word&apos;s Formatting Palette on Mac'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-73387308468265232</id><published>2009-04-06T12:15:00.001-07:00</published><updated>2009-04-06T12:28:19.578-07:00</updated><title type='text'>Old Dog Learns Old Trick</title><content type='html'>It's never too late.  I needed to add Tomcat's FORM authentication to a webapp.  The steps for doing this are surprisingly under-documented.  Here are they are:&lt;br /&gt;&lt;br /&gt;1. Write a login form page (login.jsp).  The form action should point to "j_security_check".  The input parameters for the form are "j_username" and "j_password". There are plenty of examples of this.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Add the following to your web.xml:&lt;br /&gt;&lt;br /&gt;   &amp;lt;login-config&amp;gt;&lt;br /&gt;      &amp;lt;auth-method&amp;gt;FORM&amp;lt;/auth-method&amp;gt;&lt;br /&gt;      &amp;lt;realm-name&amp;gt;Example Form-Based Authentication Area&amp;lt;/realm-name&amp;gt;&lt;br /&gt;      &amp;lt;form-login-config&amp;gt;&lt;br /&gt;        &amp;lt;form-login-page&amp;gt;/login.jsp&amp;lt;/form-login-page&amp;gt;&lt;br /&gt;      &amp;lt;/form-login-config&amp;gt;&lt;br /&gt;    &amp;lt;/login-config&amp;gt;&lt;br /&gt;&lt;br /&gt;I took this from the jsp-examples/security examples that come with Tomcat.&lt;br /&gt;&lt;br /&gt;If you stop here, install your webapp, and try to login by going directly to login.jsp, it will not work. You will get an error like&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The requested resource (/mywebapp/j_security_check) is not available&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;3. You need to also add the following to your webapp's web.xml file (taken from Tomcat's jsp-examples/ again):&lt;br /&gt;&lt;br /&gt;  &amp;lt;security-constraint&amp;gt;&lt;br /&gt;    &amp;lt;display-name&amp;gt;Example Security Constraint&amp;lt;/display-name&amp;gt;&lt;br /&gt;    &amp;lt;web-resource-collection&amp;gt;&lt;br /&gt;      &amp;lt;web-resource-name&amp;gt;Protected Area&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt;  &amp;lt;!-- Define the context-relative URL(s) to be protected --&amp;gt;&lt;br /&gt;      &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;  &amp;lt;!-- If you list http methods, only those methods are protected --&amp;gt;&lt;br /&gt;  &amp;lt;http-method&amp;gt;DELETE&amp;lt;/http-method&amp;gt;&lt;br /&gt;      &amp;lt;http-method&amp;gt;GET&amp;lt;/http-method&amp;gt;&lt;br /&gt;      &amp;lt;http-method&amp;gt;POST&amp;lt;/http-method&amp;gt;&lt;br /&gt;  &amp;lt;http-method&amp;gt;PUT&amp;lt;/http-method&amp;gt;&lt;br /&gt;    &amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt;    &amp;lt;auth-constraint&amp;gt;&lt;br /&gt;      &amp;lt;!-- Anyone with one of the listed roles may access this area --&amp;gt;&lt;br /&gt;      &amp;lt;role-name&amp;gt;tomcat&amp;lt;/role-name&amp;gt;&lt;br /&gt;  &amp;lt;role-name&amp;gt;role1&amp;lt;/role-name&amp;gt;&lt;br /&gt;    &amp;lt;/auth-constraint&amp;gt;&lt;br /&gt;  &amp;lt;/security-constraint&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This should work. The dirty trick is that you have to let Tomcat's security constraints redirect you to your login page.  You can't point your browser to this page directly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-73387308468265232?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/73387308468265232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=73387308468265232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/73387308468265232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/73387308468265232'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/04/old-dog-learns-old-trick.html' title='Old Dog Learns Old Trick'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-8526778698205567958</id><published>2009-02-20T17:31:00.001-08:00</published><updated>2009-02-23T12:58:17.879-08:00</updated><title type='text'>Word Cloud for My Blog</title><content type='html'>From Wordle, courtesy of Yu "Don't call me Marie on your stupid blog" Ma.   &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4PtBnpgs9Ss/SZ9ZhKoaKLI/AAAAAAAAABQ/siYJQ6YjNJY/s1600-h/blog.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: left; cursor: pointer; width: 320px; height: 202px;" src="http://4.bp.blogspot.com/_4PtBnpgs9Ss/SZ9ZhKoaKLI/AAAAAAAAABQ/siYJQ6YjNJY/s320/blog.png" alt="" id="BLOGGER_PHOTO_ID_5305057312390129842" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-8526778698205567958?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/8526778698205567958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=8526778698205567958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8526778698205567958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8526778698205567958'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/02/word-cloud-for-my-blog.html' title='Word Cloud for My Blog'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4PtBnpgs9Ss/SZ9ZhKoaKLI/AAAAAAAAABQ/siYJQ6YjNJY/s72-c/blog.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-3061608762179385877</id><published>2009-02-06T15:55:00.000-08:00</published><updated>2009-02-06T16:05:27.173-08:00</updated><title type='text'>Some Xen command line stuff</title><content type='html'>Here's a Xen command line cheat sheet.  We'll assume Xen is installed. &lt;br /&gt;&lt;br /&gt;1. Make sure you've booted from the Xen kernel.&lt;br /&gt;&lt;br /&gt;2. To start the Xen daemon, use "xend restart".&lt;br /&gt;&lt;br /&gt;3. To install a new image, use  virt-install --paravirt --name vc8 -r 500 -f /var/lib/xen/images/vc5.img --file-size 8 -l http://fedora.fastsoft.net/pub/linux/fedora/linux/releases/8/Fedora/i386/os --nographics&lt;br /&gt;&lt;br /&gt;The virt-install man page has more examples and an explanation of the above. The above command installs Fedora 8 on the image.  You should be prompted to install the OS in the VM after the download.  This can obviously take a while, so you'll want to clone these images.&lt;br /&gt;&lt;br /&gt;4. To list vms, you can use "virsh list" or "xm list".&lt;br /&gt;&lt;br /&gt;5. To start your VM, use "virsh start vc8".  The image "vc8" was the image created above.&lt;br /&gt;&lt;br /&gt;6. To connect to the above VM, use "xm console vc8".  Replace vc8 with your VM name.  This will boot the operating system, which should get you to a login prompt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-3061608762179385877?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/3061608762179385877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=3061608762179385877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3061608762179385877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3061608762179385877'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/02/some-xen-command-line-stuff.html' title='Some Xen command line stuff'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-4641400395682314449</id><published>2009-02-05T14:32:00.000-08:00</published><updated>2009-02-05T15:01:49.282-08:00</updated><title type='text'>GRAM Job submission failed because data transfer to the server failed (error code 10)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Problem: &lt;/span&gt;I had a working pre-Web service GRAM "fork" job manager but then needed to use LSF job manager for submissions to the scheduler on a cluster.  The LSF job manager was not built when we deployed globus initially, which is unusual. &lt;br /&gt;&lt;br /&gt;The LSF job manager was built with the commands&lt;br /&gt;&lt;br /&gt;% gpt-build globus_gram_job_manager_setup_lsf-1.17.tar.gz&lt;br /&gt;% ./setup-globus-gram-job-manager-lsf&lt;br /&gt;&lt;br /&gt;However the command line tests didn't work. For example, the command&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;globusrun -o -r my.secret.machine/jobmanager-lsf '&amp;amp;(executable=/bin/date)'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;threw the error&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;GRAM Job submission failed because data transfer to the server failed (error code 10)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is unfortunately an all-purpose Globus error.  You will sometimes see it associated with problems in the grid-mapfile, but again my fork jobmanager worked fine, so I had a different bug.&lt;br /&gt;&lt;br /&gt;Unfortunately nothing useful turned up in the gsi-gatekeeper.log, even after I turned up the logging level.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution:&lt;/span&gt; the problem turned out to be that the LSF job manager files were not given the correct permissions during the deployment.  These should be 755 (group and world readable and executable).  Find them with  a command like&lt;br /&gt;&lt;br /&gt;find $GLOBUS_LOCATION -name "*lsf*"&lt;br /&gt;&lt;br /&gt;I then made the changes manually, but you may also do some "find|xargs" trick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-4641400395682314449?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/4641400395682314449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=4641400395682314449' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4641400395682314449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4641400395682314449'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/02/gram-job-submission-failed-because-data.html' title='GRAM Job submission failed because data transfer to the server failed (error code 10)'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-4406029430758714981</id><published>2009-02-05T10:58:00.001-08:00</published><updated>2009-02-05T11:17:45.443-08:00</updated><title type='text'>Globus error 123 and Condor_g</title><content type='html'>Thanks to Stu Martin and Todd Tannenbaum for independently providing the solution below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem:&lt;/span&gt; Condor-G submission to a Globus pre-webservice GRAM failed and throws an error&lt;br /&gt;&lt;pre&gt; "Globus error 123 (could not write the job state file)"&lt;br /&gt;&lt;/pre&gt;This is described in more detail at &lt;a href="http://www-unix.globus.org/mail_archive/discuss/2002/11/msg00131.html"&gt;http://www-unix.globus.org/mail_archive/discuss/2002/11/msg00131.html&lt;/a&gt;.  You can reproduce it with this globusrun command:&lt;br /&gt;&lt;br /&gt;globusrun -r my.secret.machine/jobmanager '&amp;amp;(executable=/bin/date)(save_state=yes)'&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution:&lt;/span&gt; Edit  $GLOBUS_LOCATION/etc/globus-job-manager.conf and change the value of the -state-file-dir to point to a local, non-NFS file system.  For example:&lt;br /&gt;&lt;br /&gt;-state-file-dir /usr/local/gram_job_state&lt;br /&gt;&lt;br /&gt;Also, set permissions on this directory:&lt;br /&gt;&lt;br /&gt;chmod ogu+rwxt /usr/local/gram_job_state&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-4406029430758714981?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/4406029430758714981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=4406029430758714981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4406029430758714981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4406029430758714981'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/02/globus-error-123-and-condorg.html' title='Globus error 123 and Condor_g'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2852934765329248286</id><published>2009-02-05T07:49:00.000-08:00</published><updated>2009-02-05T08:03:19.094-08:00</updated><title type='text'>myproxy-logon error</title><content type='html'>The problem: my favorite myproxy-logon command suddenly stopped working and I got the error barf below&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Failed to receive credentials.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Error authenticating: GSS Major Status: Authentication Failed&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;GSS Minor Status Error Chain:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;globus_gss_assist: Error during context initialization&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;globus_gsi_gssapi: Unable to verify remote side's credentials&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;globus_gsi_gssapi: Unable to verify remote side's credentials: Couldn't verify the remote certificate&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;OpenSSL Error: s3_pkt.c:1052: in library: SSL routines, function SSL3_READ_BYTES: sslv3 alert bad certificate SSL alert number 42&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;I tried the usual soluiton: made sure my certificates were correct in $HOME/.globus/certificates and /etc/grid-security/certificates but still got the error.&lt;br /&gt;&lt;br /&gt;Solution: I had a proxy certificate from another (non-overlapping) Grid sitting around in the default X509 location (/tmp/x509up_nnn).  I deleted this and myproxy-logon worked again.  Apparently the myproxy-logon command tries to use this credential to authenticate to the MyProxy server.  The errors are what you expect since MyProxy from Grid #1 doesn't trust the CA of Grid #2. &lt;br /&gt;&lt;br /&gt;Delete the old credential and things should work again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2852934765329248286?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2852934765329248286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2852934765329248286' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2852934765329248286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2852934765329248286'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/02/myproxy-logon-error.html' title='myproxy-logon error'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-6530094444275063712</id><published>2009-01-14T18:35:00.000-08:00</published><updated>2010-04-26T13:03:18.641-07:00</updated><title type='text'>Simple OAuth Client and Server Examples</title><content type='html'>The OAuth Google code (&lt;a href="http://code.google.com/p/oauth/"&gt;http://code.google.com/p/oauth/)&lt;/a&gt; is woefully undocumented, so I put together below a zeroeth order approximation to how things actually work.  To use this, you need both the Open Social Java implementation (for the client) and the OAuth Java implementation.  Check them both out from the Google Code SVNs as described in earlier posts.&lt;br /&gt;&lt;br /&gt;In the examples below, we will use OAuth's two-legged authentication.  This is the server-to-server authentication used by OpenSocial gadgets.  It is appropriate when no human intervention is needed (or is possible) in the authentication process.  Also, we are going to just look at shared secret key-style authentication, using the HMAC-SH1 algorithm and symmetric key encryption.  The OAuth code will also support public/private asymmetric keys.&lt;br /&gt;&lt;br /&gt;Finally, note that the steps for generating the OAuth consumer key and consumer secret are out of scope.  We will just use the key and secret from the earlier OpenSocial gadget experiments.  Generally, shared secrets will need to be communicated through a separate registration process.  Presumably, the server would use the consumer key sent by the client to look up the secret key on the server side from a database, but check the OAuth specification for details.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Server Code&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;We'll implement a dummy server as a JSP.  You can put this in an Apache Tomcat server under a webapp called OAuthTest.  You will also need to put several jars in webapp/OAuthTest/WEB-INF/lib:&lt;br /&gt;&lt;br /&gt;ls  apache-tomcat-5.5.27/webapps/OAuthTest/WEB-INF/lib/&lt;br /&gt;commons-codec-1.3.jar           jetty-6.1.11.jar&lt;br /&gt;commons-httpclient-3.1.jar      jetty-util-6.1.11.jar&lt;br /&gt;commons-logging-1.1.jar         junit.jar&lt;br /&gt;httpclient-4.0-beta1.jar        oauth-core-20090108.jar&lt;br /&gt;httpcore-4.0-beta2.jar       &lt;br /&gt;&lt;br /&gt;The above jars are all from OAuth/java/lib, plus the oauth-core jar that you generated when you compiled things (see previous post--use "mvn clean install").&lt;br /&gt;&lt;br /&gt;Here at last is the actual JSP for the dummy service.  I call this OAuthTest.jsp.&lt;br /&gt;&lt;br /&gt;--------------------&lt;br /&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;//Presumably this should actually be looked up for a given key. &amp;nbsp;Use a real key.&lt;br /&gt;String consumerSecret="123121212yourkeyhere18918";&lt;br /&gt;&lt;br /&gt;//Presumably the key is sent by the client. This is part of the URL, after all. &amp;nbsp;Use a real key.&lt;br /&gt;String consumerKey="orkut.com:1231212122";&lt;br /&gt;&lt;br /&gt;//Construct the message object. Use null for the URL and let the code construct it.&lt;br /&gt;OAuthMessage message=OAuthServlet.getMessage(request,null);&lt;br /&gt;&lt;br /&gt;//Construct an accessor and a consumer&lt;br /&gt;OAuthConsumer consumer=new OAuthConsumer(null, consumerKey, consumerSecret, null);&lt;br /&gt;OAuthAccessor accessor=new OAuthAccessor(consumer);&lt;br /&gt;&lt;br /&gt;//Now validate. Weirdly, validator has a void return type. It throws exceptions&lt;br /&gt;//if there are problems.&lt;br /&gt;SimpleOAuthValidator validator=new SimpleOAuthValidator();&lt;br /&gt;validator.validateMessage(message,accessor);&lt;br /&gt;&lt;br /&gt;//Now what? Generate some JSON here for example.&lt;br /&gt;System.out.println("It must have worked"); %&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-------------------&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Client Code&lt;/span&gt;&lt;br /&gt;To build an OAuth client, we can start from our earlier OpenSocial client.  For convenience, we will leave in the OpenSocialUrl and OpenSocialHttpRequest classes, which help construct and execute the REST invocation, but one could easily eliminate this and use the standard java.net classes that underly these two.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;Here's the client code.  Save it in a file called MyOAuthClient.java in OpenSocial's java/samples directory.&lt;br /&gt;---------------------&lt;br /&gt;import org.opensocial.data.*;&lt;br /&gt;import org.opensocial.client.*;&lt;br /&gt;import net.oauth.*;&lt;br /&gt;import java.util.*;&lt;br /&gt;&lt;br /&gt;public class MyOAuthClient {&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;MyOAuthClient mosc=new MyOAuthClient();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public MyOAuthClient() {&lt;br /&gt;String REST_BASE_URI=&lt;br /&gt;"http://localhost:8080/OAuthTest/OAuthTest.jsp";&lt;br /&gt;String CONSUMER_SECRET=&lt;br /&gt;"uynAeXiWTisflWX99KU1D2q5";&lt;br /&gt;String CONSUMER_KEY=&lt;br /&gt;"orkut.com:623061448914";&lt;br /&gt;// String VIEWER_ID=&lt;br /&gt;//         "03067092798963641994";&lt;br /&gt;String VIEWER_ID="08354253340777199997";&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt;OpenSocialUrl requestUrl = new OpenSocialUrl(REST_BASE_URI);&lt;br /&gt;OpenSocialHttpRequest request=new OpenSocialHttpRequest(requestUrl);&lt;br /&gt;requestUrl.addQueryStringParameter("xoauth_requestor_id", VIEWER_ID);&lt;br /&gt;requestUrl.addQueryStringParameter("st", "");&lt;br /&gt;&lt;br /&gt;String requestMethod=request.getMethod();&lt;br /&gt;String postBody = request.getPostBody();&lt;br /&gt;&lt;br /&gt;OAuthMessage message =&lt;br /&gt;new OAuthMessage(requestMethod, requestUrl.toString(), null);&lt;br /&gt;&lt;br /&gt;OAuthConsumer consumer =&lt;br /&gt;new OAuthConsumer(null, CONSUMER_KEY, CONSUMER_SECRET, null);&lt;br /&gt;consumer.setProperty(OAuth.OAUTH_SIGNATURE_METHOD, OAuth.HMAC_SHA1);&lt;br /&gt;&lt;br /&gt;OAuthAccessor accessor = new OAuthAccessor(consumer);&lt;br /&gt;accessor.accessToken = "";   &lt;br /&gt;message.addRequiredParameters(accessor);&lt;br /&gt;&lt;br /&gt;for (Map.Entry&lt;string,&gt; p : message.getParameters()) {&lt;br /&gt;if (!p.getKey().equals(postBody)) {&lt;br /&gt;requestUrl.addQueryStringParameter(&lt;br /&gt;OAuth.percentEncode(p.getKey()),&lt;br /&gt;OAuth.percentEncode(p.getValue()));       &lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Take a look at the signed URL&lt;br /&gt;System.out.println("Signed REST URL: "+requestUrl.toString());&lt;br /&gt;&lt;br /&gt;//Done with signing.  Now back to OpenSocialBatch's submitRest()&lt;br /&gt;//Finally, get the response.  This is the meat of the getHttpResponse&lt;br /&gt;//method, without the error checking.&lt;br /&gt;request.execute();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;catch(Exception ex) {&lt;br /&gt;ex.printStackTrace();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;------------------&lt;br /&gt;Compile this from the OpenSocial SVN checkout's java directory with the command &lt;span style="font-style: italic;"&gt;ant compile-samples&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Now set your classpath and execute.  The following UNIX commands will do the trick:&lt;br /&gt;&lt;span style="font-style: italic;"&gt; export CP=`echo $HOME/opensocial-java-client-read-only/java/lib/*.jar | tr ' ' ':'`&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;export CP=`echo $HOME/opensocial-java-client-read-only/java/dist/*.jar | tr ' ' ':'`:$CP&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;java -classpath $CP:/Users/marlonpierce/opensocial-java-client-read-only/java/samples/bin/ MyOAuthClient&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Check the output of your Tomcat server's catalina.out to see if it worked.&lt;br /&gt;&lt;br /&gt;Obviously this has all been a simple exercise to see how to get things going and needs a lot of work to make it a real service.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/string,&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-6530094444275063712?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/6530094444275063712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=6530094444275063712' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6530094444275063712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6530094444275063712'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/01/simple-oauth-client-and-server-examples.html' title='Simple OAuth Client and Server Examples'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-394462886760279126</id><published>2009-01-12T13:21:00.001-08:00</published><updated>2009-01-12T13:34:31.891-08:00</updated><title type='text'>Quick Note on Google Code OAuth SVN Checkout</title><content type='html'>I'm looking at the Google OAuth code (&lt;a href="http://code.google.com/p/oauth/"&gt;http://code.google.com/p/oauth).&lt;/a&gt;   It's pretty light on instructions.  To compile the Java checkout from SVN, you also need to check out the Maven repositories:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   mkdir oauth-fun; cd oauth-fun&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   svn checkout http://oauth.googlecode.com/svn/code/java&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   svn checkout http://oauth.googlecode.com/svn/code/maven&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You compile with&lt;br /&gt;&lt;br /&gt; &lt;span style="font-style: italic;"&gt;cd java  (assuming you are in oauth-fun)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   mvn clean install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The problem is that my checkout today didn't compile.  I had to add the maven repository to the top level pom.xml (the one in oauth-fun/java) like so:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;repositories&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     &amp;lt;repository&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        &amp;lt;id&amp;gt;oauth-local&amp;lt;/id&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        &amp;lt;url&amp;gt;file:../maven&amp;lt;/url&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     &amp;lt;/repository&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  &amp;lt;/repositories&amp;gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-394462886760279126?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/394462886760279126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=394462886760279126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/394462886760279126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/394462886760279126'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/01/quick-note-on-google-code-oauth-svn.html' title='Quick Note on Google Code OAuth SVN Checkout'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-1177054134611142309</id><published>2009-01-11T11:27:00.000-08:00</published><updated>2009-01-12T10:20:33.216-08:00</updated><title type='text'>Roll Your Own REST with Open Social Clients</title><content type='html'>As in the last few posts, I've been looking at the OpenSocial REST/RPC client code. This can be used to access (for example) Orkut as a back-end service.  The Java clients are here: &lt;a href="http://code.google.com/p/opensocial-java-client/"&gt;http://code.google.com/p/opensocial-java-client/&lt;/a&gt;.  The general (programming-language neutral) API is documented here: &lt;a href="http://code.google.com/apis/orkut/docs/rest/developers_guide_protocol.html"&gt;http://code.google.com/apis/orkut/docs/rest/developers_guide_protocol.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Java client examples show how to do simple stuff like access a person's profile data and his/her friends' information.  The primary higher level API for this is the OpenSocialClient.java class.  The problem is that this class only implements a subset of the possible REST/RPC commands at this time.  Peeling back the covers a little, however, you can see that this class is really just constructing REST URLs or RPC commands using lower level classes, so you can in principle do this yourself and  bypass OpenSocialClient entirely.&lt;br /&gt;&lt;br /&gt;I decided to try this out.  The code below uses the REST style invocations to duplicate the DisplayProfileData.java sample code.  It turned out to be a little convoluted to do this because the OpenSocialClient class itself gets passed to lower level classes (particularly OpenSocialRequstSigner.java), which is not helpful.  Hopefully the developers will reorganize this in the future.&lt;br /&gt;&lt;br /&gt;Anyway, on to the code.  I think it can be modified to construct any OpenSocial REST request, including PUT and DELETE (which are not currently in OpenSocialClient), but that is a test for another day.  I don't claim this is beautiful.  It is just my attempt to unravel everything. &lt;br /&gt;&lt;br /&gt;I used Revision 33 of the SVN checkout.  The OAuth snapshot jar in lib can cause problems if you use a different version.  See comments below.&lt;br /&gt;&lt;br /&gt;----------------&lt;br /&gt;&lt;br /&gt;import org.opensocial.data.*;&lt;br /&gt;import org.opensocial.client.*;&lt;br /&gt;import net.oauth.*;&lt;br /&gt;import java.util.*;&lt;br /&gt;&lt;br /&gt;public class MyOpenSocialClient {&lt;br /&gt;  &lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;         MyOpenSocialClient mosc=new MyOpenSocialClient();&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;    public MyOpenSocialClient() {&lt;br /&gt;         String REST_BASE_URI=&lt;br /&gt;               "http://sandbox.orkut.com/social/rest";&lt;br /&gt;         String CONSUMER_SECRET=&lt;br /&gt;               "uynAeXiWTisflWX99KU1D2q5";&lt;br /&gt;         String CONSUMER_KEY=&lt;br /&gt;               "orkut.com:623061448914";&lt;br /&gt;         // String VIEWER_ID=&lt;br /&gt;         //         "03067092798963641994";&lt;br /&gt;         String VIEWER_ID="08354253340777199997";&lt;br /&gt;       &lt;br /&gt;         try {&lt;br /&gt;               //Construct the request object&lt;br /&gt;               OpenSocialRequest req=new OpenSocialRequest("people","people.get");&lt;br /&gt;               req.addParameter("groupId","@self");&lt;br /&gt;               req.addParameter("userId","08354253340777199997");&lt;br /&gt;&lt;br /&gt;               //Construct the request URL from the request object&lt;br /&gt;               //This is the OpenSocialBatch.submitRest() method.&lt;br /&gt;               OpenSocialUrl requestUrl = new OpenSocialUrl(REST_BASE_URI);&lt;br /&gt;               requestUrl.addPathComponent(req.getRestPathComponent());&lt;br /&gt;               if (req.getParameter("userId") != null) {&lt;br /&gt;                    requestUrl.addPathComponent(req.getParameter("userId"));&lt;br /&gt;               }&lt;br /&gt;               if (req.getParameter("groupId") != null) {&lt;br /&gt;                    requestUrl.addPathComponent(req.getParameter("groupId"));&lt;br /&gt;               }&lt;br /&gt;               System.out.println("This is the REST URL: "+requestUrl.toString());&lt;br /&gt;             &lt;br /&gt;               //Now construct and sign the request&lt;br /&gt;               //This is the OpenSocialRequestSigner.signRequest() code.&lt;br /&gt;               OpenSocialHttpRequest request = new OpenSocialHttpRequest(requestUrl);&lt;br /&gt;               requestUrl.addQueryStringParameter("xoauth_requestor_id", VIEWER_ID);&lt;br /&gt;               requestUrl.addQueryStringParameter("st", "");&lt;br /&gt;&lt;br /&gt;               String postBody = request.getPostBody();&lt;br /&gt;               System.out.println("Post bod: "+postBody);&lt;br /&gt;               String requestMethod = request.getMethod();&lt;br /&gt;               //                OpenSocialUrl requestUrl = request.getUrl();&lt;br /&gt;             &lt;br /&gt;               OAuthMessage message =&lt;br /&gt;                    new OAuthMessage(requestMethod, requestUrl.toString(), null);&lt;br /&gt;             &lt;br /&gt;               if (postBody != null) {&lt;br /&gt;                    message.addParameter(postBody, "");      &lt;br /&gt;               }&lt;br /&gt;             &lt;br /&gt;               OAuthConsumer consumer =&lt;br /&gt;                    new OAuthConsumer(null, CONSUMER_KEY, CONSUMER_SECRET, null);&lt;br /&gt;               consumer.setProperty(OAuth.OAUTH_SIGNATURE_METHOD, OAuth.HMAC_SHA1);&lt;br /&gt;             &lt;br /&gt;               OAuthAccessor accessor = new OAuthAccessor(consumer);&lt;br /&gt;               accessor.accessToken = "";    &lt;br /&gt;             &lt;br /&gt;               message.addRequiredParameters(accessor);&lt;br /&gt;             &lt;br /&gt;//VERSION WARNINIG: This works with SVN version 33 and  oauth-20081115.jar but other&lt;br /&gt;//versions may have problems.&lt;br /&gt;               for (Map.Entry&lt;string,&gt; &lt;string,string&gt; p : message.getParameters()) {&lt;br /&gt;                    if (!p.getKey().equals(postBody)) {&lt;br /&gt;                         requestUrl.addQueryStringParameter(&lt;br /&gt;                                                                        OAuth.percentEncode(p.getKey()),&lt;br /&gt;                                                                        OAuth.percentEncode(p.getValue()));        &lt;br /&gt;                    }&lt;br /&gt;               }&lt;br /&gt;&lt;br /&gt;               //Take a look at the signed URL&lt;br /&gt;               System.out.println("Signed REST URL: "+requestUrl.toString());&lt;br /&gt;&lt;br /&gt;               //Done with signing.  Now back to OpenSocialBatch's submitRest()&lt;br /&gt;               //Finally, get the response.  This is the meat of the getHttpResponse&lt;br /&gt;               //method, without the error checking.&lt;br /&gt;               request.execute();&lt;br /&gt;               String responseString=request.getResponseString();&lt;br /&gt;               OpenSocialResponse resp=OpenSocialJsonParser.getResponse(responseString, req.getId());&lt;br /&gt;               //A little clunky--have to add this to the OpenSocialResponse&lt;br /&gt;               //object's "items" map with the "people" key.&lt;br /&gt;               resp.addItem("people",responseString);&lt;br /&gt;             &lt;br /&gt;               System.out.println("Response: "+responseString);&lt;br /&gt;&lt;br /&gt;               //Now cast the response into an OpenSocialPerson object&lt;br /&gt;               OpenSocialPerson person=resp.getItemAsPerson("people");&lt;br /&gt;             &lt;br /&gt;               System.out.println("----------");&lt;br /&gt;             &lt;br /&gt;               // Output the name and ID of the requested person&lt;br /&gt;               System.out.println("Info. for " + person.getDisplayName());&lt;br /&gt;               System.out.println("ID: " + person.getId());    &lt;br /&gt;             &lt;br /&gt;               // Retrieve individual fields using the getField method; fields may be&lt;br /&gt;               // complex (objects or arrays) or simple (Strings), which you can&lt;br /&gt;               // determine by querying the object using the isComplex method.&lt;br /&gt;               // The thumbnail URL should be a simple field, so we'll output&lt;br /&gt;               // the value as a String&lt;br /&gt;               OpenSocialField thumbnailUrlField = person.getField("thumbnailUrl");&lt;br /&gt;               if (!thumbnailUrlField.isComplex()) {&lt;br /&gt;                    System.out.println("Thumbnail URL: " +&lt;br /&gt;                                             thumbnailUrlField.getStringValue());      &lt;br /&gt;               }&lt;br /&gt;             &lt;br /&gt;               System.out.println("----------");&lt;br /&gt;             &lt;br /&gt;         } catch (Exception e) {&lt;br /&gt;               System.out.println("Request failed:" );&lt;br /&gt;               e.printStackTrace();&lt;br /&gt;         }&lt;br /&gt;    }&lt;br /&gt;}&lt;/string,&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-1177054134611142309?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/1177054134611142309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=1177054134611142309' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1177054134611142309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1177054134611142309'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/01/roll-your-own-rest-with-open-social.html' title='Roll Your Own REST with Open Social Clients'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-7560794971410366446</id><published>2009-01-09T13:54:00.000-08:00</published><updated>2009-01-09T14:05:02.443-08:00</updated><title type='text'>OpenSocial REST and WGET: Not So Much</title><content type='html'>The Open Social REST/RPC documentation (&lt;a href="http://code.google.com/apis/orkut/docs/rest/developers_guide_protocol.html"&gt;http://code.google.com/apis/orkut/docs/rest/developers_guide_protocol.html&lt;/a&gt;) says vaguely that you can play with the examples using the UNIX wget command, but I don't see it.&lt;br /&gt;&lt;br /&gt;The problem is that the URLs have to be signed and carry proper security information.   By fooling around with the example code, you can see that the OpenSocialClient class's fetchPerson() method is really just constructing a URL like the one below:&lt;br /&gt;&lt;br /&gt;http://sandbox.orkut.com/social/rest/people/08354253340777199997/@self&lt;br /&gt;&lt;br /&gt;The number 083542533407771999 is my orkut user ID.  You can't just "wget" this URL or put it in your browser, however.  Doing so will return the error&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;HTTP request sent, awaiting response... 401 The request did not have a proper security token nor oauth message and unauthenticated requests are not allowed&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fooling around with the client codes (see previous post) will reveal the actual, signed URL used in the REST operation:&lt;br /&gt;&lt;br /&gt;http://sandbox.orkut.com/social/rest/people/08354253340777199&lt;br /&gt;997/@self?oauth_consumer_key=orkut.com%3A623061448914&amp;amp;oauth_nonce=1231537930162003000&amp;amp;oauth_tim&lt;br /&gt;estamp=1231537930&amp;amp;oauth_signature=0h%2FU49KtBplnmnc%2BhDKsDxFPR9k%3D&amp;amp;oauth_signature_method=HMA&lt;br /&gt;C-SHA1&amp;amp;oauth_token=&amp;amp;xoauth_requestor_id=03067092798963641994&amp;amp;oauth_version=1.0&lt;br /&gt;&lt;br /&gt;This URL is good for only one invocation (time-stamped). &lt;br /&gt;&lt;br /&gt;To reproduce this, make the following change to DisplayProfileInfo.java:&lt;br /&gt;&lt;br /&gt;         // c.setProperty(OpenSocialClient.Properties.RPC_ENDPOINT,&lt;br /&gt;         //                      "http://sandbox.orkut.com/social/rpc");&lt;br /&gt;         c.setProperty(OpenSocialClient.Properties.REST_BASE_URI,&lt;br /&gt;                              "http://sandbox.orkut.com/social/rest");&lt;br /&gt;       &lt;br /&gt;and then add the following line to OpenSocialBatch.java's submitRest() method.&lt;br /&gt;&lt;br /&gt;   OpenSocialRequestSigner.signRequest(request, client);&lt;br /&gt;    System.out.println("This is the post-signed REST url: " + request.getUrl().toString());&lt;br /&gt;&lt;br /&gt;More soon.  It turns out the the base OpenSocialClient.java class is actually just a wrapper around the other classes (OpenSocialRequest and so on).  So although the client does not apparently support &lt;span style="font-style: italic;"&gt;write&lt;/span&gt; operations, you can work around this by constructing the appropriate REST POST operation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-7560794971410366446?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/7560794971410366446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=7560794971410366446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/7560794971410366446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/7560794971410366446'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/01/opensocial-rest-and-wget-not-so-much.html' title='OpenSocial REST and WGET: Not So Much'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-4776142419118989143</id><published>2009-01-08T12:25:00.001-08:00</published><updated>2009-01-08T14:08:44.083-08:00</updated><title type='text'>OpenSocial REST API Is Here</title><content type='html'>I just noticed the Google-led OpenSocial REST/RPC APIs are finally available.  These allow you to build Java, PHP, Python, and Ruby clients that can access and manipulate your social network data.&lt;br /&gt;&lt;br /&gt;Blog announcement:&lt;a href="http://opensocialapis.blogspot.com/"&gt; http://opensocialapis.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Java code: &lt;a href="http://code.google.com/p/opensocial-java-client/"&gt;http://code.google.com/p/opensocial-java-client/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Orkut Sandbox information: &lt;a href="http://code.google.com/apis/orkut/docs/rest/developers_guide_protocol.html"&gt;http://code.google.com/apis/orkut/docs/rest/developers_guide_protocol.html&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Client Examples&lt;/span&gt;&lt;br /&gt;As you might expect, you can use Orkut's sandbox as your "backend" service.  The Java code and examples are pretty simple but work.  As a bonus, here is a recursive method that you can use in the DisplayProfileData.java example to display all information about a particular person.  It will also work in DisplayFriends.java.  You'll need to add imports for OpenSocialObject and OpenSocialField.&lt;br /&gt;&lt;br /&gt;protected void processFields(OpenSocialObject osObj) throws Exception {&lt;br /&gt;    //See all fields&lt;br /&gt;    String[] fields=osObj.fieldNames();&lt;br /&gt;    for(String fieldName : fields) {&lt;br /&gt;          OpenSocialField afield=osObj.getField(fieldName);&lt;br /&gt;          if(!afield.isComplex()) {&lt;br /&gt;               System.out.println(fieldName+"  "+afield.getStringValue());&lt;br /&gt;          }&lt;br /&gt;          else {&lt;br /&gt;               System.out.println(fieldName+" is complex:" );&lt;br /&gt;               Collection&lt;opensocialobject&gt; complexValues=afield.getValues();&lt;br /&gt;               for(OpenSocialObject compVal : complexValues) {&lt;br /&gt;                    processFields(compVal);&lt;br /&gt;               }&lt;br /&gt;          }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;Call it anywhere after creating the sample person, like so:&lt;br /&gt;&lt;br /&gt;OpenSocialPerson person = c.fetchPerson("03067092798963641994");&lt;br /&gt;...&lt;br /&gt;processFields(person);&lt;br /&gt;&lt;br /&gt;You may also want to change the Person ID in the above line.  You get this ID when you add sample.xml social gadget to your sandbox.  Mine, for example, is 08354253340777199997.  This ID does not need to match the viewer ID discussed below.&lt;br /&gt;&lt;br /&gt;Here is the sample output:&lt;br /&gt;156-56-104-143:java mpierce$ java -classpath samples/bin:$CP DisplayProfileData&lt;br /&gt;----------&lt;br /&gt;Info. for API DWH&lt;br /&gt;ID: 03067092798963641994&lt;br /&gt;----------&lt;br /&gt;Printing fields&lt;br /&gt;----------&lt;br /&gt;photos is complex:&lt;br /&gt;value  http://www.orkut.com/img/i_nophoto64.gif&lt;br /&gt;type  thumbnail&lt;br /&gt;thumbnailUrl  http://www.orkut.com/img/i_nophoto64.gif&lt;br /&gt;name is complex:&lt;br /&gt;givenName  API&lt;br /&gt;familyName  DWH&lt;br /&gt;id  03067092798963641994&lt;br /&gt;isOwner  false&lt;br /&gt;isViewer  true&lt;br /&gt;------Done---------&lt;br /&gt;Thumbnail URL: http://www.orkut.com/img/i_nophoto64.gif&lt;br /&gt;----------&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Modifying the Backend&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/opensocialobject&gt;Here's were the problems start.  The sample clients above include a default view ID, consumer secret, and consumer key as part of the OAuth infrastructure:&lt;br /&gt;&lt;br /&gt;        c.setProperty(OpenSocialClient.Properties.CONSUMER_SECRET,&lt;br /&gt;                           "uynAeXiWTisflWX99KU1D2q5");&lt;br /&gt;        c.setProperty(OpenSocialClient.Properties.CONSUMER_KEY,&lt;br /&gt;                           "orkut.com:623061448914");&lt;br /&gt;        c.setProperty(OpenSocialClient.Properties.VIEWER_ID,&lt;br /&gt;                           "03067092798963641994");&lt;br /&gt;&lt;br /&gt;Of course you will want to replace these with your own values.  To do this, you will need to deploy a gadget and verify that you own it.  The steps are simple:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Write a gadget.  You can use  http://opensocial-resources.googlecode.com/svn/samples/rest_rpc/sample.xml for example.  I'm not sure if the gadget in anyway affects the REST/RPC server side calls that you can use.&lt;/li&gt;&lt;li&gt;Get an Orkut sandbox account and log into sandbox.orkut.com.&lt;/li&gt;&lt;li&gt;Install your application into your Orkut account.&lt;/li&gt;&lt;li&gt;Verify that you own the gadget: https://www.google.com/gadgets/directory/verify&lt;/li&gt;&lt;/ol&gt;This last step is the problem.  It involves two steps.  First you provide the URL for your gadget and submit.  You will receive a long signature string, which you need to add to your gadget.  Replace the one in the sample.xml if you are using a copy of that.   Save your gadget and click the verification web site button to complete the process.  Presumably this will give you the consumer key and consumer secret that you need, but I have not gotten this to work for some reason.&lt;br /&gt;See&lt;br /&gt;&lt;a href="http://groups.google.com/group/opensocial-orkut/browse_thread/thread/43640406754ab7f6"&gt;http://groups.google.com/group/opensocial-orkut/browse_thread/thread/43640406754ab7f6&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-4776142419118989143?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/4776142419118989143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=4776142419118989143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4776142419118989143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4776142419118989143'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2009/01/opensocial-rest-api-is-here.html' title='OpenSocial REST API Is Here'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-6451873860907241817</id><published>2008-12-04T17:46:00.000-08:00</published><updated>2008-12-19T12:26:26.029-08:00</updated><title type='text'>No airport hardware found</title><content type='html'>From the stupid Mac tricks department: if you get the error in the title (i.e. wireless card not working),&lt;br /&gt;&lt;ol&gt;&lt;li&gt;power down,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;take out your battery,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;count "1 Steve Jobs, 2 Steve Jobs, 3 Steve Jobs",&lt;br /&gt;&lt;/li&gt;&lt;li&gt;reinsert battery,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;power up,&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;and viola...voila, wireless will work.&lt;br /&gt;&lt;br /&gt;The last guy on this thread deserves a Nobel prize: &lt;a href="http://forums.macrumors.com/archive/index.php/t-173155.html"&gt;http://forums.macrumors.com/archive/index.php/t-173155.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-6451873860907241817?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/6451873860907241817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=6451873860907241817' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6451873860907241817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6451873860907241817'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/12/no-airport-hardware-found.html' title='No airport hardware found'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-6311052617378740247</id><published>2008-11-13T11:06:00.001-08:00</published><updated>2008-11-13T11:06:55.222-08:00</updated><title type='text'>QuakeSim Stuff in Shakeout Youtube Movie</title><content type='html'>About 1/2 though:&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=7F3J_EtRFi0"&gt;http://www.youtube.com/watch?v=7F3J_EtRFi0&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-6311052617378740247?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/6311052617378740247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=6311052617378740247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6311052617378740247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6311052617378740247'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/11/quakesim-stuff-in-shakeout-youtube.html' title='QuakeSim Stuff in Shakeout Youtube Movie'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-4179652547042059170</id><published>2008-10-26T08:39:00.000-07:00</published><updated>2008-10-26T08:49:52.099-07:00</updated><title type='text'>WebDAV with Apache2 and Windows</title><content type='html'>In case you haven't looked in a while, WebDAV modules are included with Apache 2 and 2.2.  See for example &lt;a href="http://www.serverwatch.com/tutorials/article.php/2176771"&gt;http://www.serverwatch.com/tutorials/article.php/2176771&lt;/a&gt; for an installation overview.&lt;br /&gt;&lt;br /&gt;This will work great for Mac clients (from "Finder" hit apple-k to connect as a remote web folder) with HTTPD basic authentication, but they will fail for Windows XP clients (either mapping as a drive or adding network location).  The reason, it turns out, is that Windows is actually working correctly:  it won't do Basic Auth over an insecure connection.&lt;br /&gt;&lt;br /&gt;To solve this, use SSL.  There's an overview of the problem and variuos solutions at &lt;a href="http://ulihansen.kicks-ass.net/aero/webdav/"&gt;http://ulihansen.kicks-ass.net/aero/webdav/&lt;/a&gt;.  See for example &lt;a href="http://www.vanemery.com/Linux/Apache/apache-SSL.html"&gt;http://www.vanemery.com/Linux/Apache/apache-SSL.html&lt;/a&gt; for some Apache + SSL instructions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;One Final Trick:  &lt;/span&gt;Windows clients seem to have a problem with the trailing "/", so in your Apache httpd.conf file, use something like&lt;br /&gt;&lt;br /&gt;&amp;lt;location /dav&amp;gt;&lt;br /&gt;&lt;br /&gt;and not&lt;br /&gt;&lt;br /&gt;&amp;lt;location /dav/&amp;gt;&lt;br /&gt;&lt;br /&gt;for your WebDAV folder name.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-4179652547042059170?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/4179652547042059170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=4179652547042059170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4179652547042059170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4179652547042059170'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/10/webdav-with-apache2-and-windows.html' title='WebDAV with Apache2 and Windows'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-322853774543092326</id><published>2008-10-08T10:18:00.000-07:00</published><updated>2008-10-08T11:21:39.641-07:00</updated><title type='text'>Abstract: Services and Components for the QuakeSim Project</title><content type='html'>&lt;div style="text-align: justify;"&gt;[Posting is part of our lab seminar series.]&lt;br /&gt;&lt;br /&gt;We discuss two recent enhancements to the QuakeSim grid infrastructure. First, we describe our work to integrate QuakeSim Web services with large scale Globus deployments such as the US TeraGrid and Open Science Grid. Our implementation is based on the Condor BirdBath client libraries and provides a simplified and stateless API for accessing Globus resources. In addition to QuakeSim, we are developing a variation of this service to support the University of Minnesota’s VLAB project. We discuss integration of this service with TeraGrid information services for system load and queue wait time prediction, as well as security issues and prospects for deployment on NASA resources.&lt;br /&gt;&lt;br /&gt;Our second focus is on work performed with the Scripps Orbit and Permanent Array Center’s archival data services for permanently deployed California GPS stations. We have developed a daily historical analysis Web service of the GPS data using RDAHMM. This service has been combined with an interactive Web interface that allows the user to view historical state changes in the GPS network. This archival data is available on a fourteen day delay, so we conclude with a discussion of the prospects for a nearer real-time network event detection system.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-322853774543092326?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://grids.ucs.indiana.edu/ptliupages/presentations/QuakeSimAces.ppt' title='Abstract: Services and Components for the QuakeSim Project'/><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/322853774543092326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=322853774543092326' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/322853774543092326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/322853774543092326'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/10/abstract-services-and-components-for.html' title='Abstract: Services and Components for the QuakeSim Project'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-7713928888519389342</id><published>2008-09-24T15:13:00.000-07:00</published><updated>2008-09-24T15:21:39.899-07:00</updated><title type='text'>DAG Classes for Java</title><content type='html'>It's a little surprising that even after more than a dozen years worth of bloat, Java still doesn't have a standard set of classes to handle standard graphs like DAGs and their associated operations.&lt;br /&gt;&lt;br /&gt;I needed this recently and decided against writing from scratch.  With a little Googling, I decided to use the Plexus Utilities.  See the JavaDocs at &lt;a href="http://plexus.codehaus.org/plexus-utils/apidocs/index.html"&gt;http://plexus.codehaus.org/plexus-utils/apidocs/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Plexus-Utils overview is here: &lt;a href="http://plexus.codehaus.org/plexus-utils/"&gt;http://plexus.codehaus.org/plexus-utils/&lt;/a&gt;.  The best way to get going is to grab the jars with Maven.  Below is a dumb little example code:&lt;br /&gt;&lt;br /&gt;import org.codehaus.plexus.util.dag.DAG;&lt;br /&gt;import org.codehaus.plexus.util.dag.Vertex;&lt;br /&gt;import org.codehaus.plexus.util.dag.CycleDetectedException;&lt;br /&gt;&lt;br /&gt;import java.util.*;&lt;br /&gt;&lt;br /&gt;public class DAGFun {&lt;br /&gt;  DAG dag;&lt;br /&gt;  Vertex from1, to1;&lt;br /&gt;  Vertex from2, to2;&lt;br /&gt;  public DAGFun() {&lt;br /&gt;    dag=new DAG();&lt;br /&gt;     from1=new Vertex("from");&lt;br /&gt;    to1=new Vertex("to");&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public DAGFun(DAG dag) {&lt;br /&gt;    this.dag=dag;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void addEdge(DAG dag, Vertex from, Vertex to) throws CycleDetectedException {&lt;br /&gt;    dag.addEdge(from,to);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void processDag(){&lt;br /&gt;    List vertices=dag.getVerticies();&lt;br /&gt;    List roots=new ArrayList();&lt;br /&gt;    //Find all the roots.  There may be more than one&lt;br /&gt;    for(int i=0;i&amp;lt;vertices.size();i++){&lt;br /&gt;    Vertex test=(Vertex)vertices.get(i);&lt;br /&gt;    if(test.isRoot()) roots.add(test);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //Now walk through all the DAGs&lt;br /&gt;    for(int i=0;i&amp;lt;roots.size();i++){&lt;br /&gt;    Vertex v=(Vertex)roots.get(i);&lt;br /&gt;    List children=v.getChildren();&lt;br /&gt;    for(int j=0;j&amp;lt;children.size();j++) {&lt;br /&gt;      processChild((Vertex)children.get(j));&lt;br /&gt;    }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public void processChild(Vertex vertex) {&lt;br /&gt;    if(vertex.isLeaf()) {&lt;br /&gt;    return;&lt;br /&gt;    }&lt;br /&gt;    List children=vertex.getChildren();&lt;br /&gt;    for(int j=0;j&amp;lt;children.size();j++) {&lt;br /&gt;    processChild((Vertex)children.get(j));&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public static void main(String[] args) throws Exception{&lt;br /&gt;    Vertex from1, to1;&lt;br /&gt;    Vertex from2, to2;&lt;br /&gt;     from1=new Vertex("from1");&lt;br /&gt;    to1=new Vertex("to1");&lt;br /&gt;&lt;br /&gt;     from2=new Vertex("from2");&lt;br /&gt;    to2=new Vertex("to2");&lt;br /&gt;&lt;br /&gt;    DAG dag=new DAG();&lt;br /&gt;    DAGFun df=new DAGFun(dag);&lt;br /&gt;    df.addEdge(dag,from1,to1);&lt;br /&gt;    df.addEdge(dag,from2,to2);&lt;br /&gt;    &lt;br /&gt;    df.processDag();&lt;br /&gt;  }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-7713928888519389342?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/7713928888519389342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=7713928888519389342' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/7713928888519389342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/7713928888519389342'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/09/dag-classes-for-java.html' title='DAG Classes for Java'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-8285250041113078942</id><published>2008-09-08T12:53:00.001-07:00</published><updated>2008-09-08T12:53:52.591-07:00</updated><title type='text'>Yum install of SVN on CentOS</title><content type='html'>yum install subversion mod_dav_svn&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-8285250041113078942?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/8285250041113078942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=8285250041113078942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8285250041113078942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8285250041113078942'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/09/yum-install-of-svn-on-centos.html' title='Yum install of SVN on CentOS'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-3939906206459059449</id><published>2008-08-27T14:29:00.000-07:00</published><updated>2008-08-27T14:47:19.778-07:00</updated><title type='text'>Sun RSS Portlet in GridSphere</title><content type='html'>OK, thanks to &lt;a href="http://sv.facebook.com/people/Suresh_Marru/595833864"&gt;Suresh &lt;/a&gt;and &lt;a href="http://www.blogger.com/profile/02331634762593140064"&gt;Marcus&lt;/a&gt;, I got the Sun RSS portlet working in GridSphere.   Very good indeed, since the others that I found depended on Liferay or JBoss jars.  Good grief, people, you are getting on my last nerve. &lt;br /&gt;&lt;br /&gt;Here are the steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Get the portlet from here: &lt;a href="http://wiki.java.net/bin/view/OpenPortal/RSSPortlet"&gt;http://wiki.java.net/bin/view/OpenPortal/RSSPortlet&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Do the usual gridsphere stuff: you will need to modify web.xml, copy over the gridsphere-portlet.xml from a working portlet into WEB-INF, copy over a gridsphere-ui-tags.jar from a working portlet into WEB-INF/lib.  Also a group.xml and layout.xml file in WEB-INF will help.  Plenty of examples of this over at &lt;a href="http://www.collab-ogce.org/"&gt;http://www.collab-ogce.org/&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Also touch webapps/gridsphere/WEB-INF/CustomPortal/portlets/rssportlet&lt;/li&gt;&lt;li&gt;For some reason, the Sun portlet doesn't include the necessary jars to support the portlet's tag libraries, so you will need to get these and put them into WEB-INF/lib: jstl-1.0.6.jar, standard-1.0.6.jar.&lt;/li&gt;&lt;/ol&gt;This should be everything.  The missing jar problem in step 4 was the frustrating part.  Here's a list:&lt;br /&gt;&lt;br /&gt;content-0.4.1.jar               jdom-1.0.jar                    rome-0.8.jar&lt;br /&gt;gridsphere-ui-tags-2.1.jar      jstl-1.0.6.jar                  standard-1.0.6.jar&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Probably there is an easier way, but around here we like to do it the bassackwards way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-3939906206459059449?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/3939906206459059449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=3939906206459059449' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3939906206459059449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3939906206459059449'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/08/sun-rss-portlet-in-gridsphere.html' title='Sun RSS Portlet in GridSphere'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-1159295507580357073</id><published>2008-08-18T08:11:00.000-07:00</published><updated>2008-08-18T08:43:51.997-07:00</updated><title type='text'>Some BLAHP Notes</title><content type='html'>BLAHP is a plugin to Condor-G that enables Condor to submit jobs directly to schedulers like PBS/Torque.  It is a variation of the GAHP scheduler that Condor-G uses to submit Globus jobs. Globus in turn provides the appropriate job manager for interacting with local scheduler.  BLAHP (hopefully) will allow us to skip this step.&lt;br /&gt;&lt;br /&gt;BLAHP is avaialble from the EGEE; see &lt;a href="https://twiki.cnaf.infn.it/cgi-bin/twiki/view/EgeeJra1It/BLAH_guide"&gt;https://twiki.cnaf.infn.it/cgi-bin/twiki/view/EgeeJra1It/BLAH_guide &lt;/a&gt;for an overview. There is an obsolete version of this in the Condor release, but we must override.&lt;br /&gt;&lt;br /&gt;We are interested in this because Condor-G and Birdbath provide a Web service programming interface for managing jobs.  See other notes on this blog and at &lt;a href="http://sangpall.blogspot.com/"&gt;http://sangpall.blogspot.com/&lt;/a&gt;.  We'd like to use this service for accessing machines that don't run Globus GRAM.&lt;br /&gt;&lt;br /&gt;Basic steps for getting this going are the following.  All steps are done on the same server.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install Condor and optionally Globus.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Get the latest Condor C++ Classads, configure, make, make install&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Check out BLAHP from CVS, configure, make, make install&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Get Torque if you don't have a scheduler installed, configure, make, make install.&lt;/li&gt;&lt;/ol&gt;Notes are courtesy of Francesco Prelz, with some corrections from Yu Marie Ma.  I'm building this on RHEL4.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Install Classads&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make an installation directory.  I'll call this BLAHP.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;wget ftp://ftp.cs.wisc.edu/condor/classad/c++/classads-0.9.9.tar.gz&lt;/li&gt;&lt;li&gt;Unpack and cd.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;./configure --prefix $HOME/BLAHP/classads/ --enable-namespace --lib-name classad&lt;/li&gt;&lt;li&gt;make; make install&lt;/li&gt;&lt;/ul&gt;The trick is the configure step.  You must enable the classad namespace (at least on RHEL4) for BLAHP to install (divined by Marie).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Install BLAHP&lt;/span&gt;&lt;br /&gt;I also do these steps from the $HOME/BLAHP directory.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;cvs -d :pserver:anonymous@glite.cvs.cern.ch:/cvs/jra1mw co org.glite&lt;/li&gt;&lt;li&gt;cvs -d :pserver:anonymous@glite.cvs.cern.ch:/cvs/jra1mw co -r glite-ce-blahp_R_1_11_1_0 org.glite.ce.blahp&lt;br /&gt;&lt;/li&gt;&lt;li&gt;cd $HOME/BLAHP/org.glite.ce.blahp/&lt;br /&gt;&lt;/li&gt;&lt;li&gt; ./configure --with-classads-prefix=$HOME/BLAHP/classads/ --with-globus-prefix=$HOME/globus/ --prefix=$HOME/BLAHP/blahp&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Install Torque&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This assumes you don't have this already installed. The steps below will work for a non-root build.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;cd $HOME/BLAHP&lt;/li&gt;&lt;li&gt;./configure --prefix=$HOME/BLAHP/torque  --with-server-home=$HOME/BLAHP/torque&lt;/li&gt;&lt;li&gt;make; make install&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Configure BLAHP&lt;br /&gt;&lt;/span&gt;We now need to configure BLAHP to work with our local Condor and Torque installations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-1159295507580357073?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/1159295507580357073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=1159295507580357073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1159295507580357073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1159295507580357073'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/08/some-blahp-notes.html' title='Some BLAHP Notes'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2479414771871806741</id><published>2008-08-05T06:55:00.000-07:00</published><updated>2008-08-05T07:03:26.024-07:00</updated><title type='text'>TeraGrid RSS Feeds</title><content type='html'>Here's a big list of TeraGrid RSS news feeds.  A while back, I wrote a post complaining that these didn't work correctly in iGoogle, but I'm pleased to write now that this has been corrected.  On the downside, you have to go through a few pages to find the RSS URLs.&lt;br /&gt;&lt;br /&gt;You can guess the subject for each feed from the title (rss-indiana.rss is the IU feed, for example).&lt;br /&gt;&lt;br /&gt;http://news.teragrid.org/feeds/rss-education.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-event.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-gpfs.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-indiana.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-lsu.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-ncar.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-ncsa.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-nics.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-networking.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-ornl.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-psc.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-pr.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-purdue.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-sdsc.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-gateways.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-archives.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-tacc.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-general.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-anl.rss&lt;br /&gt;http://news.teragrid.org/feeds/rss-vis.rss&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2479414771871806741?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2479414771871806741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2479414771871806741' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2479414771871806741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2479414771871806741'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/08/teragrid-rss-feeds.html' title='TeraGrid RSS Feeds'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2968810080693245711</id><published>2008-06-24T15:36:00.000-07:00</published><updated>2008-06-24T15:41:57.268-07:00</updated><title type='text'>Old Windows XP on New Dell Latitude</title><content type='html'>More adventures in system administration: I needed to install Windows XP on a new Dell Latitude laptop to support a demo.  My old Windows XP installation CD crapped out, claiming it could not find any disk drives/devices.&lt;br /&gt;&lt;br /&gt;The workaround (thanks to Rick McMullen) turned out to be to change from SATA AHCI to ATA in the BIOS.  On the downside, it wiped out my old Vista installation, although switching back to AHCI seemed to recover it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2968810080693245711?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2968810080693245711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2968810080693245711' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2968810080693245711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2968810080693245711'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/06/old-windows-xp-on-new-dell-latitude.html' title='Old Windows XP on New Dell Latitude'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-1415625806649025369</id><published>2008-04-30T13:12:00.001-07:00</published><updated>2008-04-30T13:19:28.983-07:00</updated><title type='text'>Useful TeraGrid REST Information Services</title><content type='html'>Courtesy of J. P. Navarro and Laura Pearlman.   See &lt;a href="http://info.teragrid.org/"&gt;http://info.teragrid.org&lt;/a&gt; for more. These aren't all strictly REST but close enough for my purposes.  They return simple XML formats.&lt;br /&gt;&lt;br /&gt;Here's how you can get a list of Grid services on Abe at NCSA.&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://info.teragrid.org/restdemo/xml/tg/sites/ncsa.teragrid.org/resources/abe.ncsa.teragrid.org/kits/data-movement.teragrid.org/services"&gt;http://info.teragrid.org/restdemo/xml/tg/sites/ncsa.teragrid.org/resources/abe.ncsa.teragrid.org/kits/data-movement.teragrid.org/services&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Some other examples:&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://info.teragrid.org/restdemo/xml/tg/services/gridftp"&gt;http://info.teragrid.org/restdemo/xml/tg/services/gridftp&lt;/a&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://info.teragrid.org/restdemo/xml/tg/services/prews-gram"&gt;http://info.teragrid.org/restdemo/xml/tg/services/prews-gram&lt;/a&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://info.teragrid.org/restdemo/xml/tg/services/ws-gram"&gt;http://info.teragrid.org/restdemo/xml/tg/services/ws-gram&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Some finer grained examples using XPath.&lt;br /&gt;&lt;br /&gt;Give me all gridftp URLs in TeraGrid:&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://info.teragrid.org:8080/webmds/webmds?info=tgislocal&amp;amp;xmlSource.tgislocal.param.xpathQuery=//KitRegistration//Service"&gt;http://info.teragrid.org:8080/webmds/webmds?info=tgislocal&amp;amp;xmlSource.tgislocal.param.xpathQuery=//KitRegistration//Service&lt;/a&gt;[Type='gridftp']/Endpoint&lt;br /&gt;&lt;br /&gt;Give me all gridftp URLs at NCSA:&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://info.teragrid.org:8080/webmds/webmds?info=tgislocal&amp;amp;xmlSource.tgislocal.param.xpathQuery=//KitRegistration"&gt;http://info.teragrid.org:8080/webmds/webmds?info=tgislocal&amp;amp;xmlSource.tgislocal.param.xpathQuery=//KitRegistration&lt;/a&gt;[SiteID='ncsa.teragrid.org']//Service[Type='gridftp']/Endpoint&lt;br /&gt;&lt;br /&gt;Give me the URLs of all advertised services at Big Red:&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://info.teragrid.org:8080/webmds/webmds?info=tgislocal&amp;amp;xmlSource.tgislocal.param.xpathQuery=//KitRegistration"&gt;http://info.teragrid.org:8080/webmds/webmds?info=tgislocal&amp;amp;xmlSource.tgislocal.param.xpathQuery=//KitRegistration&lt;/a&gt;[ResourceID='bigred.iu.teragrid.org']//Service/Endpoint&lt;br /&gt;&lt;br /&gt;Give me a little more information about all services at Big Red:&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://info.teragrid.org:8080/webmds/webmds?info=tgislocal&amp;amp;xmlSource.tgislocal.param.xpathQuery=//KitRegistration"&gt;http://info.teragrid.org:8080/webmds/webmds?info=tgislocal&amp;amp;xmlSource.tgislocal.param.xpathQuery=//KitRegistration&lt;/a&gt;[ResourceID='bigred.iu.teragrid.org']//Service&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-1415625806649025369?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/1415625806649025369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=1415625806649025369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1415625806649025369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1415625806649025369'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/04/useful-teragrid-rest-information.html' title='Useful TeraGrid REST Information Services'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-917297313359666691</id><published>2008-04-04T14:02:00.000-07:00</published><updated>2008-04-08T16:47:53.115-07:00</updated><title type='text'>Mildly Interesting KML+Google Maps Bug</title><content type='html'>Google map keys are of course tied to a particular base URL.  You can get a key for http://localhost for development, but you may have noticed this isn't necessary: maps will load correctly in http://localhost/ for any map key.&lt;br /&gt;&lt;br /&gt;However, you can't load KML into your maps on localhost unless you are using a key for http://localhost.  That is, your map will load but the KML overlay wont' be added.  That is,&lt;br /&gt;&lt;br /&gt;      geoXml=new GGeoXml("http://mapgadgets.googlepages.com/cta.kml");&lt;br /&gt;       map.addOverlay(geoXml);&lt;br /&gt;&lt;br /&gt;won't add the overlay to your map if you are using mismatched keys.  To see this in inaction, try serving up the code sample &lt;a href="http://code.google.com/apis/maps/documentation/examples/geoxml-kml.html"&gt;http://code.google.com/apis/maps/documentation/examples/geoxml-kml.html&lt;/a&gt;&lt;br /&gt;from your own web server (using your own key, of course).  First try using localhost:8080 and then use http://your.real.server.name:8080/.  This assumes the google key was generated for http://your.real.server.name:8080/.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-917297313359666691?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/917297313359666691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=917297313359666691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/917297313359666691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/917297313359666691'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/04/mildly-interesting-kmlgoogle-maps-bug.html' title='Mildly Interesting KML+Google Maps Bug'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-5373015212195195918</id><published>2008-03-28T11:58:00.000-07:00</published><updated>2008-03-28T12:26:26.334-07:00</updated><title type='text'>Google's GData Java API</title><content type='html'>This has been out for a while, but I recently realized that Google's GData API provides a way to interact with all Google services (Doc, Calendar, YouTube, Blogger, Picasso, etc) through your own server side code.  One nice application for Science Gateways is to write a Web Service that submits grid jobs, writes service state changes to Google Calendar, spits out result synopsis to a blog, and posts visualizations to Picasso or YouTube.&lt;br /&gt;&lt;br /&gt;Below is some code liberally borrowed from Blogger, YouTube, and Calendar API gdata examples to show how simple this is.   Some notes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Get the Java code from here: &lt;a href="http://code.google.com/p/gdata-java-client/downloads/list"&gt;http://code.google.com/p/gdata-java-client/downloads/list&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You will need a clientID and associated developer key.  Get these from &lt;a href="http://code.google.com/apis/base/signup.html"&gt;http://code.google.com/apis/base/signup.html&lt;/a&gt; (I think).&lt;/li&gt;&lt;li&gt;See any number of Google examples, including &lt;a href="http://code.google.com/apis/base/javadevguide.html"&gt;http://code.google.com/apis/base/javadevguide.html&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You can get your blogger ID by examining the Atom feed.  It will be in the header and look something like this: &amp;lt;id&amp;gt;tag:blogger.com,1999:blog-19457310&amp;lt;/id&amp;gt;  The blog ID to use in the code below would be 194573 in this example.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;--------------------&lt;br /&gt;Code example below&lt;br /&gt;--------------------&lt;br /&gt;import com.google.gdata.client.*;&lt;br /&gt;import com.google.gdata.client.youtube.*;&lt;br /&gt;import com.google.gdata.data.*;&lt;br /&gt;import com.google.gdata.data.geo.impl.*;&lt;br /&gt;import com.google.gdata.data.media.*;&lt;br /&gt;import com.google.gdata.data.media.mediarss.*;&lt;br /&gt;import com.google.gdata.data.youtube.*;&lt;br /&gt;import com.google.gdata.data.extensions.*;&lt;br /&gt;import com.google.gdata.util.*;&lt;br /&gt;&lt;br /&gt;import com.google.gdata.client.*;&lt;br /&gt;import com.google.gdata.data.*;&lt;br /&gt;import com.google.gdata.util.*;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import java.util.*;&lt;br /&gt;&lt;br /&gt;//Google Calendar stuff&lt;br /&gt;import com.google.gdata.client.calendar.*;&lt;br /&gt;import com.google.gdata.data.acl.*;&lt;br /&gt;import com.google.gdata.data.calendar.*;&lt;br /&gt;import com.google.gdata.data.extensions.*;&lt;br /&gt;&lt;br /&gt;public class TestBlogger {&lt;br /&gt;   String clientID="XXXXX";&lt;br /&gt;   String developer_key="XXXXXXX";&lt;br /&gt;&lt;br /&gt;   String feedUrl="http://gdata.youtube.com/feeds/api/videos/";&lt;br /&gt;   String scarFace5sec="http://gdata.youtube.com/feeds/api/videos/egwB7hVIIEc";&lt;br /&gt;&lt;br /&gt;   GoogleService googleService;&lt;br /&gt;   YouTubeService youTubeService;&lt;br /&gt;   CalendarService calendarService;&lt;br /&gt;&lt;br /&gt;   public GoogleService getGoogleService() {&lt;br /&gt;        return googleService;&lt;br /&gt;   }&lt;br /&gt;   public void setGoogleService(GoogleService googleService) {&lt;br /&gt;        this.googleService=googleService;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public YouTubeService getYouTubeService() {&lt;br /&gt;        return youTubeService;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void setYouTubeService(YouTubeService youTubeService) {&lt;br /&gt;        this.youTubeService=youTubeService;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void setCalendarService(CalendarService calendarService) {&lt;br /&gt;        this.calendarService=calendarService;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public CalendarService getCalendarService() {&lt;br /&gt;        return this.calendarService;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public TestBlogger() throws Exception {&lt;br /&gt;          //Replace these with real values.&lt;br /&gt;         String userName="me@gmail.com";&lt;br /&gt;         String password= "qwerty";&lt;br /&gt;&lt;br /&gt;        //Log into blogger.&lt;br /&gt;        GoogleService myService=new GoogleService("blogger","");&lt;br /&gt;        myService.setUserCredentials(userName,password);&lt;br /&gt;        setGoogleService(myService);&lt;br /&gt;&lt;br /&gt;        //Log into YouTube&lt;br /&gt;        YouTubeService service = new YouTubeService(clientID, developer_key);&lt;br /&gt;        service.setUserCredentials(userName,password);&lt;br /&gt;        setYouTubeService(service);&lt;br /&gt;&lt;br /&gt;        //Log into Calendar&lt;br /&gt;        CalendarService calService=new CalendarService(clientID);&lt;br /&gt;        calService.setUserCredentials(userName,password);&lt;br /&gt;        setCalendarService(calService);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void writeToCalendar(String titleOfEvent,&lt;br /&gt;                                        String contentToPost) throws Exception {&lt;br /&gt;        URL postUrl =&lt;br /&gt;              new URL("http://www.google.com/calendar/feeds/"+userName+"/private/full");&lt;br /&gt;        CalendarEventEntry myEntry = new CalendarEventEntry();&lt;br /&gt;     &lt;br /&gt;        myEntry.setTitle(new PlainTextConstruct(titleOfEvent));&lt;br /&gt;        myEntry.setContent(new PlainTextConstruct(contentToPost));&lt;br /&gt;     &lt;br /&gt;        //  DateTime startTime = DateTime.parseDateTime("2008-03-18T15:00:00-08:00");&lt;br /&gt;        System.out.println((new Date()).toString());&lt;br /&gt;        DateTime startTime = new DateTime(new Date());&lt;br /&gt;        //          DateTime endTime = DateTime.parseDateTime("2008-03-18T17:00:00-08:00");&lt;br /&gt;        When eventTimes = new When();&lt;br /&gt;        eventTimes.setStartTime(startTime);&lt;br /&gt;        //          eventTimes.setEndTime(endTime);&lt;br /&gt;        myEntry.addTime(eventTimes);&lt;br /&gt;     &lt;br /&gt;        // Send the request and receive the response:&lt;br /&gt;        CalendarEventEntry insertedEntry = calendarService.insert(postUrl, myEntry);&lt;br /&gt;&lt;br /&gt;        CalendarEventEntry myEntry2 = new CalendarEventEntry();&lt;br /&gt;        String now=(new Date()).toString();&lt;br /&gt;        myEntry2.setContent(new PlainTextConstruct("Test post at "+now));&lt;br /&gt;        myEntry2.setQuickAdd(true);&lt;br /&gt;     &lt;br /&gt;        // Send the request and receive the response:&lt;br /&gt;        CalendarEventEntry insertedEntry2 =calendarService.insert(postUrl, myEntry2);       &lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public String getBloggerEntryString() throws Exception {&lt;br /&gt;        String returnString="";&lt;br /&gt;        URL feedUrl=new URL("http://communitygrids.blogspot.com/atom.xml");&lt;br /&gt;        Feed resultFeed = googleService.getFeed(feedUrl, Feed.class);&lt;br /&gt;&lt;br /&gt;        // Print the results&lt;br /&gt;        System.out.println(resultFeed.getTitle().getPlainText());&lt;br /&gt;        for (int i = 0; i &lt; resultFeed.getEntries().size(); i++) {                 Entry entry = resultFeed.getEntries().get(i);                 returnString+=entry.getTitle().getPlainText()+"&lt;br /&gt;";&lt;br /&gt;        }&lt;br /&gt;   return returnString;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public String getVideoFeedString() throws Exception {&lt;br /&gt;&lt;br /&gt;        String returnString;&lt;br /&gt;&lt;br /&gt;        VideoFeed videoFeed=youTubeService.getFeed(new URL(feedUrl),&lt;br /&gt;                                                        VideoFeed.class);&lt;br /&gt;&lt;br /&gt;        VideoEntry videoEntry = youTubeService.getEntry(new URL(scarFace5sec),&lt;br /&gt;                                                               VideoEntry.class);&lt;br /&gt;&lt;br /&gt;        returnString="Title: " + videoEntry.getTitle().getPlainText()+"&lt;br /&gt;";&lt;br /&gt;        returnString+=videoEntry.getMediaGroup().getDescription().getPlainTextContent()+"&lt;br /&gt;";&lt;br /&gt;        return returnString;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public Entry createPost(GoogleService myService, String blogID, String title,&lt;br /&gt;                                            String content, String authorName, String userName)&lt;br /&gt;        throws ServiceException, IOException {&lt;br /&gt;        // Create the entry to insert&lt;br /&gt;        Entry myEntry = new Entry();&lt;br /&gt;        myEntry.setTitle(new PlainTextConstruct(title));&lt;br /&gt;        myEntry.setContent(new PlainTextConstruct(content));&lt;br /&gt;        Person author = new Person(authorName, null, userName);&lt;br /&gt;        myEntry.getAuthors().add(author);&lt;br /&gt;     &lt;br /&gt;        // Ask the service to insert the new entry&lt;br /&gt;        URL postUrl = new URL("http://www.blogger.com/feeds/" + blogID + "/posts/default");&lt;br /&gt;        return myService.insert(postUrl, myEntry);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   public static void main(String[] args) throws Exception {&lt;br /&gt;   String blogId=1292929011;&lt;br /&gt;   String someName="test";&lt;br /&gt; &lt;br /&gt;   TestBlogger blog=new TestBlogger();&lt;br /&gt;            // System.out.println(blog.getBloggerEntryString());&lt;br /&gt;            // System.out.println(blog.getVideoFeedString());&lt;br /&gt;            String content="Some post test with the blogger Java api"+"&lt;br /&gt;   ";&lt;br /&gt;   content=blog.getBloggerEntryString()+blog.getVideoFeedString();&lt;br /&gt;   blog.createPost(blog.getGoogleService(),&lt;br /&gt;                                     blogId,&lt;br /&gt;                                    "Testing Blogger API",&lt;br /&gt;                                     content,&lt;br /&gt;                                     "Marlon Pierce",&lt;br /&gt;                                     someName);&lt;br /&gt;   blog.writeToCalendar("Test Calendar Post",content);&lt;br /&gt;       }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-5373015212195195918?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/5373015212195195918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=5373015212195195918' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5373015212195195918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5373015212195195918'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/03/googles-gdata-java-api.html' title='Google&apos;s GData Java API'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2691910310192261351</id><published>2008-03-27T17:56:00.000-07:00</published><updated>2008-03-28T11:53:40.693-07:00</updated><title type='text'>Broken TeraGrid RSS News Feeds</title><content type='html'>[&lt;span style="font-weight: bold;"&gt;Nagger's Update:&lt;/span&gt; the titles were fixed after I posted this.  Hopefully reordering will be soon to follow.]&lt;br /&gt;&lt;br /&gt;If you have a TeraGrid account, you probably have noticed the 6.02(10)^23 emails you get every day (Ranger is up!  Ranger is down...).  You can disable all of these by going to '&lt;a href="http://news.teragrid.org/subscribe-db.php"&gt;http://news.teragrid.org/subscribe-db.php&lt;/a&gt;. Even better, you can subscribe instead to RSS feeds and get these updates in a sensible fashion.&lt;br /&gt;&lt;br /&gt;There are only two problems: the title fields in the feeds are broken and most of the feeds are in newest-entry-last order.  The iGoogle RSS reader (for one) assumes that the first entry is the newest (not the oldest) entry.&lt;br /&gt;&lt;br /&gt;Here is an example (to pick on the home team): &lt;a href="http://news.teragrid.org/feeds/rss-indiana.rss"&gt;http://news.teragrid.org/feeds/rss-indiana.rss&lt;/a&gt;  I did notice that TACC had at least fixed their ordering, but most of the other centers have the same problem.&lt;br /&gt;&lt;br /&gt;I reported these errors to the help desk like a good soldier, got my trouble ticket, and then...nothing.  After a couple of weeks through some back channel emails, I found out that my ticket had been received and that they would fix it within the the year.  I am not making this up.  No one is willing to take five minutes to fix this simple problem.  Probably they don't have any time left after all the meetings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2691910310192261351?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2691910310192261351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2691910310192261351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2691910310192261351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2691910310192261351'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/03/broken-teragrid-rss-news-feeds.html' title='Broken TeraGrid RSS News Feeds'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2301519365665287413</id><published>2008-03-14T15:13:00.001-07:00</published><updated>2008-03-14T15:13:25.390-07:00</updated><title type='text'>Testing Blogger API</title><content type='html'>Two Nice Papers by Jim Grey&lt;br&gt;SSH Empty Passphrases&lt;br&gt;Password Protected RSS/Atom Feeds&lt;br&gt;Get Off My Cloud&lt;br&gt;Counting Unique IPs in Apache Log Files&lt;br&gt;XFN Test&lt;br&gt;BBQ Flickr Mashup&lt;br&gt;Emacs for C#/.NET/Mono&lt;br&gt;Running GOAP on PolarGrid Testbed&lt;br&gt;Polar Grid Matlab Note&lt;br&gt;More with Shindig and Open Social&lt;br&gt;Quick Start with Open Social, Shindig&lt;br&gt;A Little More JavaScript and FaceBook Hacking&lt;br&gt;Quick Facebook JavaScript and PHP API Notes&lt;br&gt;Portals and Web Applications&lt;br&gt;Polar Grid URL&lt;br&gt;Some Project Zero Thoughts&lt;br&gt;More Mac OS X Emacs&lt;br&gt;Birdbath and Globus RSL&lt;br&gt;Installing and Configuring Globus Services on Mac OS X&lt;br&gt;Condor-G, Birdbath and TransferOutputRemaps&lt;br&gt;File Retrieval with BirdBath and Condor-G&lt;br&gt;Condor-G Plus TeraGrid Example&lt;br&gt;Returning Standard Output in Condor-G&lt;br&gt;Globus Client+MyProxy+Pacman on FC7 Notes&lt;br&gt;Title: Scarface in 5 seconds&lt;br&gt;...&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2301519365665287413?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2301519365665287413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2301519365665287413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2301519365665287413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2301519365665287413'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/03/testing-blogger-api.html' title='Testing Blogger API'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-4537681492182168679</id><published>2008-03-12T13:55:00.000-07:00</published><updated>2008-03-12T13:57:20.839-07:00</updated><title type='text'>Two Nice Papers by Jim Grey</title><content type='html'>Thanks to Shrideep for sending these:&lt;br /&gt;&lt;br /&gt;&lt;pre wrap=""&gt;G. Bell, J. Gray,  and A. Szalay, "Petascale Computational Systems:Balanced&lt;br /&gt;CyberInfrastructure in a Data-Centric World," IEEE Computer, vol. 39, no 1,&lt;br /&gt;pp. 110-112, Jan. 2006.&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://research.microsoft.com/%7Egray/papers/Petascale%20computational%20systems.pdf"&gt;http://research.microsoft.com/~gray/papers/Petascale%20computational%20systems.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;J. Gray, "Distributed Computing Economics", Computer Systems Theory,&lt;br /&gt;Technology, and Applications, A Tribute to Roger Needham, A. Herbert and K.&lt;br /&gt;Sparck Jones eds., Springer, 2004,pp 93-101&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="ftp://ftp.research.microsoft.com/pub/tr/TR-2003-24.pdf"&gt;ftp://ftp.research.microsoft.com/pub/tr/TR-2003-24.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-4537681492182168679?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/4537681492182168679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=4537681492182168679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4537681492182168679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4537681492182168679'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/03/two-nice-papers-by-jim-grey.html' title='Two Nice Papers by Jim Grey'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-5977861950268610294</id><published>2008-02-29T13:11:00.001-08:00</published><updated>2008-02-29T13:27:38.050-08:00</updated><title type='text'>SSH Empty Passphrases</title><content type='html'>Of course you should never set up empty passphrases on ssh keys, but if you do and it doesn't work, check the permissions on your .ssh directory and .ssh/authorized_keys file.  These should not be readable or writable by anyone but the owner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-5977861950268610294?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/5977861950268610294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=5977861950268610294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5977861950268610294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5977861950268610294'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/ssh-empty-passphrases.html' title='SSH Empty Passphrases'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-5798435765133402902</id><published>2008-02-28T08:52:00.000-08:00</published><updated>2008-02-28T09:01:36.913-08:00</updated><title type='text'>Password Protected RSS/Atom Feeds</title><content type='html'>HTTP Authenticated feeds don't seem to work with iGoogle or Internet Explorer's feed reader, so I looked for a couple of alternatives.  These work:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sage: a FireFox plugin.  Works fine on both Mac and Windows, as long as you have FireFox.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;NewsGator: works great on Windows Vista&lt;/li&gt;&lt;/ul&gt;I also looked into UniveRSS, a 3D (!?) RSS reader for Vista that is based on Windows Presentation Foundation.  Um, no thanks.  Keep It Simple, Stupid.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-5798435765133402902?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/5798435765133402902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=5798435765133402902' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5798435765133402902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5798435765133402902'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/password-protected-rssatom-feeds.html' title='Password Protected RSS/Atom Feeds'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2489458914490785481</id><published>2008-02-25T17:39:00.001-08:00</published><updated>2008-04-23T09:40:17.681-07:00</updated><title type='text'>Get Off My Cloud</title><content type='html'>I'd like to put in a stake in the ground for anti-cloud computing.  "Cloud computing" (i.e. Grid computing, only not gruesome) has a lot of buzz, and it is assumed that in the future we will all use computing and data storage as for-fee services virtually hosted on sites like Amazon.   One brilliant guy compares it to the electrical power grid: &lt;a href="http://www.nicholasgcarr.com/bigswitch/"&gt;http://www.nicholasgcarr.com/bigswitch/&lt;/a&gt;.  Nicholas Carr, you owe Larry Smarr royalties.&lt;br /&gt;&lt;br /&gt;In general, it is assumed that these online services will make the home computer become thinner and thinner until it no longer exists in its current form.  In this vision, the next generation will be dominated by lightweight client devices (i.e. iPhones, Blackberries, Nokia N-series tablets, etc.), and most computing and data management will be performed by large online services.   Existing service providing companies like Google will dominate, and Microsoft is desperately trying to get  market share.&lt;br /&gt;&lt;br /&gt;While this will happen, I don't think it is the whole story.  The home PC isn't dead and (for many of us) will become a full fledged home appliance.  Think of it as the long tail of cloud computing.  Consider&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There will be dozens of computing cores on relatively modest home computers within a decade (i.e. home computers will be mini parallel supercomputers).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Storage on these same machines will commonly be in the terabytes (already there on high end desktops).&lt;/li&gt;&lt;li&gt;High speed internet access will be available in most homes (probably already there for upper income households).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Actually, we are already there.  The main thing that will change is the excessive parallel core horsepower that the next generation of PCs will have (and maybe we are there, too--check out &lt;a href="http://www.sicortex.com/products/sc072"&gt;this thing&lt;/a&gt;--72 cores on a desktop!). Major vendors are desperately trying to improve the software development environments to take advantage of these cores.  Seems to me that Web servers are a natural fit for this.&lt;br /&gt;&lt;br /&gt;So instead of everyone uploading photos and movies to Flickr and YouTube, why not provide "home editions" of these services that allow me to run my own web service?  Or why not a "home edition" of Last.fm in which I can serve up and share my music collection with my friends and family?  Ideally, I would also be able to federate my servers with friends and family into peer-networks and other such topologies so that I could share information transparently with friends while maintaining fine-grained control of the data at the same time.  Obviously there is a lot of file and music sharing software already--I am thinking more of adding the social networking capabilities provided by various Web 2.o sites to this.&lt;br /&gt;&lt;br /&gt;Another possible application for the home supercomputer is managing &lt;span style="font-weight: bold;"&gt;MyHouse@HOME&lt;/span&gt; (a hypothetical project).  In Tom Igoe's book,&lt;a href="http://www.amazon.com/Making-Things-Talk-Practical-Connecting/dp/0596510519"&gt; Making Things Talk&lt;/a&gt;, he introduces the concept of &lt;span style="font-style: italic;"&gt;object-oriented hardware&lt;/span&gt; (or, if you prefer, &lt;span style="font-style: italic;"&gt;service-oriented hardware&lt;/span&gt;).  Ubiquitous micro-computers and sensors combined with simple network protocols allow you to build interesting  home applications, such as twitter-style blogs for your house.  This could allow you, for example, to monitor your house while you are away or keep an eye on elderly family and friends.  Event detection on this sort of sensor data is an interesting problem.  This sort of sensor data obviously should go through a central Web server hub under your control.&lt;br /&gt;&lt;br /&gt;More importantly and generally, with a home computing appliance, I can control my own personal data and make available as I choose instead of trusting large central repositories.  Family medical records, genetic testing results, financial records, etc could be maintained locally and accessed by outside clients in ways that the owner controls.&lt;br /&gt;&lt;br /&gt;One may object that there are many security problems.  For example, the home computer becomes a bigger honey pot of valuable information than it is already, so it becomes a target for both internet break-ins and physical theft.  And you would lose most of your records in a house fire that melted your computer.  Hard drive failures would be a disaster.  But all of these are already problems to some degree.   Secure, encrypted hard drives are already available technology (in laptops for example), so just physically stealing the machine won't expose you to unnecessary risk.&lt;br /&gt;&lt;br /&gt;Home denial of service attacks would be a new problem.  I can also see the need for a secure "Swiss Bank Account" for data on your hard drive: every night you can rsync your data to a secure site, where it will be stored in numbered accounts in encrypted form via public/private keys and retrievable only by you (i.e. malicious employees don't know which account belongs to whom and can't read the data anyway).  Probably this already exists in the financial world.  Amazon's S3 and Micorsoft's SkyDrive are early examples, but security and reliability will need to be greatly enhanced.&lt;br /&gt;&lt;br /&gt;The compelling thing to me is that none of this is particularly new.  Context-aware sensors, parallel computing techniques and algorithms, network computing, social networks, and so on are old topics in the academic world.   The key new concept is accessibility:  do-it-yourself enthusiasts will broaden participation in these fields and will push researchers to deepen it.  This will create the anti-cloud.  Or if you prefer, everyone can have their own cloud.&lt;br /&gt;&lt;br /&gt;What is missing seems to be the higher level building block software for building home cloud services (i.e. the home edition of Last.fm).  Microsoft, in particular, seems to be missing the point.  They are trying desperately to transform into a service provider (e.g. to compete with Google on search), but they are always chasing the leader (witness various Live projects, Virtual Earth, Skyserver. etc).  Instead, why not concentrate on their core competency: home and business software, only now "cloud-enabling"?  Note "cloud-enabling" is not "cloud-enabled".  The former is server side (making use of the fat computing appliance in the home office).  The latter is the thin client to some remote cloud service.&lt;br /&gt;&lt;br /&gt;I'll conclude with a poke at the HPC and Grid world: yes, we were there first, just like the Vikings were the first Europeans in North America.&lt;br /&gt;&lt;br /&gt;I note that the smart guys like Ray Ozzie at MS were way ahead of me with &lt;a href="http://blogs.msdn.com/livemesh/"&gt;Live Mesh&lt;/a&gt;, which is debuting today (April 23).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2489458914490785481?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2489458914490785481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2489458914490785481' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2489458914490785481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2489458914490785481'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/get-off-my-cloud.html' title='Get Off My Cloud'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-3549600127629506108</id><published>2008-02-24T11:00:00.000-08:00</published><updated>2008-02-24T11:03:29.718-08:00</updated><title type='text'>Counting Unique IPs in Apache Log Files</title><content type='html'>A little Unix one-liner, posted to my online memory bank:&lt;br /&gt;&lt;br /&gt;cat /var/apache/logs/access_log | grep whatever | cut -f1 -d' ' | sort -n | uniq | wc&lt;br /&gt;&lt;br /&gt;Change "whatever" to the name of the relative path you are trying to count.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-3549600127629506108?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/3549600127629506108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=3549600127629506108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3549600127629506108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3549600127629506108'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/counting-unique-ips-in-apache-log-files.html' title='Counting Unique IPs in Apache Log Files'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-8073517961190905675</id><published>2008-02-22T12:04:00.000-08:00</published><updated>2008-02-22T16:21:44.876-08:00</updated><title type='text'>XFN Test</title><content type='html'>Me: &lt;a href="http://www.blogger.com/profile/11646814516542136925" rel="me"&gt;http://www.blogger.com/profile/11646814516542136925&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Me: &lt;a href="http://del.icio.us/marlon_pierce" ref="me"&gt;http://del.icio.us/marlon_pierce&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Me: &lt;a href="http://www.last.fm/user/marpierc/" ref="me"&gt;http://www.last.fm/user/marpierc/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Chuck: &lt;a href="http://www.dr-chuck.com/csev-blog/" ref="colleague"&gt;http://www.dr-chuck.com/csev-blog/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Marie: &lt;a href="http://www.blogger.com/profile/01674561517458718071" ref="co-worker colleague"&gt;http://www.blogger.com/profile/01674561517458718071&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sangmi: &lt;a href="http://www.blogger.com/profile/15257352896573946615" ref="co-worker colleague"&gt;http://www.blogger.com/profile/15257352896573946615&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Romeo: &lt;a href="http://www.blogger.com/profile/02475747864220945014" ref="acquaintance"&gt;http://www.blogger.com/profile/02475747864220945014&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-8073517961190905675?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/8073517961190905675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=8073517961190905675' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8073517961190905675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8073517961190905675'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/xfn-test.html' title='XFN Test'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-6646554851089733019</id><published>2008-02-22T06:57:00.000-08:00</published><updated>2008-12-13T03:23:17.302-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grid computing'/><title type='text'>BBQ Flickr Mashup</title><content type='html'>Thanks to Marie and Jun for constructing the best sort of Grid.  I saw  &lt;a href="http://tethealla.blogspot.com/2008/02/my-polargrid.html"&gt;this&lt;/a&gt; and immediately asked if I could get one with BBQ.  And it was made so.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4PtBnpgs9Ss/R77jyCcg1OI/AAAAAAAAAAM/iPVP417b2w8/s1600-h/BBQ.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: left; cursor: pointer;" src="http://1.bp.blogspot.com/_4PtBnpgs9Ss/R77jyCcg1OI/AAAAAAAAAAM/iPVP417b2w8/s320/BBQ.png" alt="" id="BLOGGER_PHOTO_ID_5169819871057335522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I find it pleasing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-6646554851089733019?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/6646554851089733019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=6646554851089733019' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6646554851089733019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6646554851089733019'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/bbq-flickr-mashup.html' title='BBQ Flickr Mashup'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4PtBnpgs9Ss/R77jyCcg1OI/AAAAAAAAAAM/iPVP417b2w8/s72-c/BBQ.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-3216949370132286676</id><published>2008-02-21T07:08:00.000-08:00</published><updated>2008-02-21T07:23:13.291-08:00</updated><title type='text'>Emacs for C#/.NET/Mono</title><content type='html'>Thought I'd give &lt;a href="http://www.mono-project.com/"&gt;Mono&lt;/a&gt; a try with Mac OSX+Emacs.  Of course Emacs won't have the nice formatting Lisp scripts for your code, but you can get them from here:  &lt;a href="http://www.cybercom.net/%7Ezbrad/DotNet/Emacs/"&gt;http://www.cybercom.net/~zbrad/DotNet/Emacs/&lt;/a&gt; sans instructions. The other link suggested by Mono (http://davh.dk/script/) was broken.&lt;br /&gt;&lt;br /&gt;Here's how to get it to work:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Unzip the zip file from the link above.&lt;/li&gt;&lt;li&gt;Edit (or create) your $HOME/.emacs file and add the appropriate sections from zbrad.emac s. You could just add everything.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Add the line &lt;span style="font-style: italic;"&gt;(add-to-list 'load-path "~/.emacs.d/site-lisp")&lt;/span&gt; at the beginning of your .emacs file.&lt;/li&gt;&lt;li&gt;Copy the "site-lisp" directory from the downloaded zip and there you go.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;You should now be in business.  I don't understand why Mr. Merrill didn't provide a README with his fine stuff. Gives emacs a bad name.  Filling in these sorts of gaps made Tim O'Reilly famous.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-3216949370132286676?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/3216949370132286676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=3216949370132286676' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3216949370132286676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3216949370132286676'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/emacs-for-c.html' title='Emacs for C#/.NET/Mono'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-9014917656705466479</id><published>2008-02-19T18:01:00.000-08:00</published><updated>2008-02-20T08:06:44.090-08:00</updated><title type='text'>Running GOAP on PolarGrid Testbed</title><content type='html'>These notes assume you have the sample data and a snapshot of the code.  These are unpacked in /home/polargrid/PolarGRID and /home/polargrid/code, respectively.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;Configuring GOAP&lt;/span&gt;&lt;br /&gt;These notes are Make sure that matlab is in your path:&lt;br /&gt;   export PATH=/usr/local/matlab/bin:$PATH&lt;br /&gt;if necessary.  Cd into the /home/polargrid/code directory and edit/check the ParamMCRDS_IU.m file.  Make sure these parameters are OK:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;param.in_path       = '/home/polargrid/PolarGRID/raw/';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;param.out_path      = '/home/polargrid/PGOut/';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;param.ref_path      = '/home/polargrid/PolarGRID/150MHz_PD03_PD10/'; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;param.pos_path      = '/home/polargrid/PolarGRID/';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;param.pos_name      = 'MCRDS_20070917_ALL_pos.mat';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;param.prefix        = 'data.20070917';&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;param.in_path should point to the .raw data files.&lt;br /&gt;param.out_path can point anywhere you like, as long as  the directory exists.&lt;br /&gt;param.ref_path should point to the directory with the MCRDS_reference_* files.  param.pos_path should point to the directory that contains the param.pos_name file.&lt;br /&gt;&lt;br /&gt;You may also  want to fool around with these parameters.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;param.type = 'MCRDS';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;param.file_idx_start        = 25;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;%param.file_idx_stop         = 99;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;param.file_idx_stop         = 26;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;These correspond to the data files *.0025.raw to *.0099.raw in&lt;span style="font-family:times new roman;"&gt; &lt;span style="font-family:georgia;"&gt;/home/polargrid/PolarGRID/raw/.  The above just runs the code with 2 input files (should take about 3 minutes) instead of 75.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I also had to use these parameters below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;param.sched_type = 'local';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;%param.sched_type = 'jobmanager';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;param.sched_name = 'localhost';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;%param.sched_name = 'heimdall.cluster.cresis.ku.edu';&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;You can leave these as is for now.  I also had to add the "exit" command to the end of the main script for force matlab to exit.  Otherwise running the command script with the -r option (see below throws you back to the &gt;&gt; command prompt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Running the Code&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Do this from the /code/ directory. Run the command&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; matlab -nodisplay -nodesktop -r ParamMCRDS_IU&lt;br /&gt;&lt;br /&gt;Don't use redirected standard inputs to read the matlab file (i.e. don't use "matlab &amp;lt; ParamMCRDS_IU.m") or you'll get&lt;br /&gt;&lt;br /&gt;Warning: Type-ahead buffer overflow.&lt;br /&gt;In distcomp.abstractjob.waitForState at 92&lt;br /&gt;In StartScriptCluster at 28&lt;br /&gt;&lt;span style="font-family: georgia;font-size:100%;" &gt;&lt;br /&gt;See bottom of&lt;/span&gt; &lt;/span&gt;&lt;pre wrap=""&gt;&lt;a class="moz-txt-link-freetext" href="https://engineering.purdue.edu/AAE/AboutUs/Help/wiki/RunningJobsOnTheServers"&gt;https://engineering.purdue.edu/AAE/AboutUs/Help/wiki/RunningJobsOnTheServers&lt;/a&gt;&lt;/pre&gt;&lt;span style="font-family:times new roman;"&gt;&lt;span style="font-family: georgia;"&gt;Also, the code won't create the final jpegs correctly this way.  So...don't do that.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: georgia;"&gt;Where's the Data?&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: georgia;"&gt; The output files go to the directory you specified above (PGOut).  The final jpegs are placed in&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;  PGOut/fk_data/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;along with the header files (metadata, .txt) and .mat files.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-9014917656705466479?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/9014917656705466479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=9014917656705466479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/9014917656705466479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/9014917656705466479'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/running-goap-on-polargrid.html' title='Running GOAP on PolarGrid Testbed'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-6051876017956641777</id><published>2008-02-19T10:03:00.002-08:00</published><updated>2008-02-19T10:04:41.562-08:00</updated><title type='text'>Polar Grid Matlab Note</title><content type='html'>If you get the error&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[matlab@polargrid003 ~]$ /usr/local/matlab/bin/matlab &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Warning: Unable to open display , MATLAB is starting without a display.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  You will not be able to display graphics on the screen.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;License checkout failed.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;License Manager Error -95&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;MATLAB is unable to connect to the license server. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Make sure you can resolve the hostname of your machine. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;If you are unable to resolve the hostname, contact your System Administrator.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Troubleshoot this issue by visiting: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;http://www.mathworks.com/support/lme95a&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Diagnostic Information:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Feature: MATLAB &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;License path: /usr/local/matlab/etc/license.dat:/usr/local/matlab/etc/*.lic: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FLEXnet Licensing error: -95,378. System Error: 115&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This just means that the matlab license server isn't running.  Start it as the matlab user with  the command&lt;br /&gt;&lt;br /&gt;/usr/local/matlab/etc/lmstart -l /tmp/eeee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-6051876017956641777?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/6051876017956641777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=6051876017956641777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6051876017956641777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6051876017956641777'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/polar-grid-matlab-note.html' title='Polar Grid Matlab Note'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-6279889624551425878</id><published>2008-02-18T14:00:00.000-08:00</published><updated>2008-03-12T08:05:32.674-07:00</updated><title type='text'>More with Shindig and Open Social</title><content type='html'>&lt;b&gt;Get Going&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; After svn checkout, cd to $HOME/shindig/java/gadgets (or wherever you installed).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Run "mvn package" and then "mvn jetty:run-war" from this directory.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Point your browser at&lt;br /&gt;&lt;br /&gt;http://localhost:8080/gadgets/files/container/sample1.html&lt;br /&gt;&lt;br /&gt;or similar.  Note this is an "aggregating client container" for collecting and displaying gadgets.   The gadgets are loaded as XML from a specified remote URL and arranged using a layout manager.  However, these containers don't know anything about your social networks--they are just for presentation and organization of content.  If you actually want to host your own social gadgets you will need to deploy them into the "gadget hosting container"(e.g. Orkut or some other app).  This is available on your Shindig server at&lt;br /&gt;&lt;br /&gt;http://localhost:8080/gadgets/files/samplecontainer/samplecontainer.html&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Note the aggregating client container just shows how to add gadgets from multiple providers.  Any social networking information is NOT controlled or accessible by these containers.  To run your own gadget and manipulate social network information (such as  a user's profile and list of friends), you will need to run your gadget in a container.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; If you want to add your own sample HTML file for aggregating gadgets, you need to put these in $HOME/shindig/javascript/container/.  The maven package command will move these files into java/gadgets/target/gadgets/files/container/myjunk.html.&lt;br /&gt;&lt;br /&gt;You'll then have to shutdown and restart jetty.&lt;br /&gt;&lt;br /&gt;This is a little non-intuitive directory layout but see java/gadgets/pom.xml.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; The $HOME/shindig/javascript/README is a good place to start.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Hosting your own gadgets.&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Place your widget code in&lt;br /&gt;&lt;br /&gt;$HOME/shindig/javascript/samplecontainer&lt;br /&gt;&lt;br /&gt;or any subdirectory (like /examples/).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; After compilation, these will be located in&lt;br /&gt;&lt;br /&gt;./target/gadgets/files/samplecontainer/&lt;br /&gt;&lt;br /&gt;or any subdirectory (/examples/ in the shindig SVN).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; These will be served up from&lt;br /&gt;&lt;br /&gt;http://localhost:8080/gadgets/files/samplecontainer/examples/myapp.xml&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; You can use the XML from the sample widget at&lt;br /&gt;&lt;br /&gt;http://code.google.com/apis/opensocial/docs/0.6/devguide.html&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Just download or cut and past this XML file onto your local file system. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;For some reason, you will need to change the top:&lt;br /&gt;&lt;br /&gt;&amp;lt;ModulePrefs title="Title of Your Application"&amp;gt;&lt;br /&gt;&amp;lt;Require feature="opensocial-0.6"/&amp;gt;&lt;br /&gt;&amp;lt;/ModulePrefs&amp;gt;&lt;br /&gt;&lt;br /&gt;to&lt;br /&gt;&amp;lt;ModulePrefs title="People API Howto"&amp;gt;&lt;br /&gt;&amp;lt;Require feature="opensocial-samplecontainer"&amp;gt;&amp;lt;/Require&amp;gt;&lt;br /&gt;&amp;lt;/ModulePrefs&amp;gt;&lt;br /&gt;&lt;br /&gt;This seems to have been corrected in newer versions.  Check the header of the sample gadget and use this as a guideline for your gadget.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Anyway,  load the samplecontainer URL (http://localhost:8080/gadgets/files/samplecontainer/examples/myapp.xml) in your browser, and then load your gadget by pasting in the URL&lt;br /&gt;&lt;br /&gt;http://localhost:8080/gadgets/files/samplecontainer/examples/myapp.xml&lt;/li&gt;&lt;li&gt;If you edit your gadget in any way, you must (apparently) restart your Jetty server.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;This gadget is now ready to be displayed in any gadget container.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Putting Your Gadget Into Your Display Container&lt;br /&gt;&lt;/span&gt;In the last previous two steps, you a) displayed existing gadgets using the gadget display container and b) set up your own gadget hosting container.  The documentation doesn't very clearly distinguish these, but you should see this by now.  The display container can load any gadgets (including production gadgets available from iGoogle).  The gadget hosting container, on the other hand, is used to run your gadgets with your social network data.&lt;br /&gt;&lt;br /&gt;We can now combine the two.   Edit any of the sample HTML files in java/target/gadgets/files/container, changing the URL to point to the gadget you made in the previous example.  Restart your Jetty server and you should see it correctly displayed.&lt;br /&gt;&lt;br /&gt;Similarly, you should be able (if your Jetty server's URL is publicly accessible) to add your social gadget to other display containers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-6279889624551425878?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/6279889624551425878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=6279889624551425878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6279889624551425878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6279889624551425878'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/more-with-shindig-and-open-social.html' title='More with Shindig and Open Social'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-5440862649955138138</id><published>2008-02-17T11:44:00.002-08:00</published><updated>2008-02-17T11:56:43.813-08:00</updated><title type='text'>Quick Start with Open Social, Shindig</title><content type='html'>OpenSocial is of course the Google-led consortium of competitors to FaceBook, but until very recently most of its efforts appeared to be vaporware.  This is starting to change.&lt;br /&gt;&lt;br /&gt;One of my immediate concerns about the OS API was how easy it would be to build an OS compliant container.  Otherwise, we would have to rely upon existing containers (Orkut, anyone?) to host our OS-based applications.   Fortunately, the Apache Shindig incubator project &lt;a href="http://incubator.apache.org/shindig/"&gt;(http://incubator.apache.org/shindig/)&lt;/a&gt; is something of an open source reference implementation for the OS API (written in Java with a Maven build no less).&lt;br /&gt;&lt;br /&gt;Check it out with SVN and build from source with Maven (worked perfectly on version 628525).  Run with Jetty server.&lt;br /&gt;&lt;br /&gt;Point browser to http://localhost:8080/gadgets/files/container/sample1.html and look through other samples.  You can also load these HTML files using file:// if you don't want to run the Jetty server.&lt;br /&gt;&lt;br /&gt;Next time: can I use OS clients to query my LinkedIn profile?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-5440862649955138138?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/5440862649955138138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=5440862649955138138' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5440862649955138138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5440862649955138138'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/quick-start-with-open-social-shindig.html' title='Quick Start with Open Social, Shindig'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-8480636834018430262</id><published>2008-02-15T15:24:00.000-08:00</published><updated>2008-03-17T12:50:08.942-07:00</updated><title type='text'>A Little More JavaScript and FaceBook Hacking</title><content type='html'>Facebook's JavaScript example is pretty minimal, so I thought I'd do a little more hacking around.  I'm not a great JS programmer, so I like to unroll the function definitions.&lt;br /&gt;&lt;br /&gt;You should grab the very minimal JS API documentation from here:&lt;a href="http://wiki.developers.facebook.com/index.php/JavaScript_Client_Library"&gt; http://wiki.developers.facebook.com/index.php/JavaScript_Client_Library&lt;/a&gt;.  It is the "zipped archive" link near the bottom.  This guide is very unfriendly at the current time, but in general you should see that the JS equivalents of the API list at &lt;a href="http://wiki.developers.facebook.com/index.php/API"&gt;http://wiki.developers.facebook.com/index.php/API&lt;/a&gt; replace the "." with a "_".  So users.getInfo becomes users_getInfo(...).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here's an example that uses the users_getInfo() method and some other stuff to get a user's profile information.&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Output area to show the output from Facebook API --&amp;gt;&lt;br /&gt;&amp;lt;textarea style="width:500px;height:300px;" id="_traceTextBox"&amp;gt;&lt;br /&gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;&amp;lt;script src="http://static.ak.facebook.com/js/api_lib/FacebookApi.debug.js" type="text/javascript"&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;// Create an ApiClient object, passing app's api key and&lt;br /&gt;// a site relative url to xd_receiver.htm&lt;br /&gt;var api = new FB.ApiClient('&amp;lt;your_key_here&amp;gt;', '/xd_receiver.htm', null);&lt;br /&gt;&lt;br /&gt;// Get friends list&lt;br /&gt;function getResults(result,exception) {&lt;br /&gt;Debug.dump(api.get_session().uid,'you');&lt;br /&gt;Debug.dump(result,'The stuff');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getInfo(result,exception) {&lt;br /&gt;Debug.dump(result,'The info');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// require user to login&lt;br /&gt;api.requireLogin(function(exception) {&lt;br /&gt;api.friends_get(null,getResults);&lt;br /&gt;var myinfo='last_name,first_name,hometown_location,work_history,pic_small';&lt;br /&gt;api.users_getInfo(api.get_session().uid,myinfo,getInfo);&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;You need to update this stuff above to use your application's key, as indicated.&lt;br /&gt;&lt;br /&gt;The output of this will be something like&lt;br /&gt;---------------------&lt;br /&gt;you: 627774031&lt;br /&gt;&lt;br /&gt;The stuff: {Array}&lt;br /&gt;[Deleted]&lt;br /&gt;&lt;br /&gt;The info: {Array}&lt;br /&gt;[0]: {Object}&lt;br /&gt;first_name: Marlon&lt;br /&gt;hometown_location: {Object}&lt;br /&gt; city:&lt;br /&gt; state:&lt;br /&gt; country:&lt;br /&gt; zip:&lt;br /&gt;last_name: Pierce&lt;br /&gt;pic_small: http://profile.ak.facebook.com/profile6/1797/98/t627774031_2463.jpg&lt;br /&gt;uid: 627774031&lt;br /&gt;work_history: {Object}&lt;br /&gt;&lt;br /&gt;friendsResult from batch execution: {Array}&lt;br /&gt;[Deleted]&lt;br /&gt;notificationsResults from batch: undefined&lt;br /&gt;----------------------&lt;br /&gt;&lt;br /&gt;I guessed the values for the &lt;span style="font-style: italic;"&gt;myinfo&lt;/span&gt; array by looking at the big XML file example shown at &lt;a href="http://wiki.developers.facebook.com/index.php/Users.getInfo"&gt;http://wiki.developers.facebook.com/index.php/Users.getInfo.&lt;/a&gt; That's the real URL for the tiny version of my FaceBook photo.&lt;br /&gt;&lt;br /&gt;So in summary, you can use this approach to embed FaceBook profile information in your own web application.  You'll of course have to do a bit of work to format all of this stuff.  Note also that you can substitute another user's numeric ID in the users_getInfo() call (ie that of one of your friends).  I used this to spy on Dave De Roure, who spends a lot more time on FaceBook than I do. And I won't even start on Dan Katz.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;FQL and JS&lt;/span&gt;&lt;br /&gt;Finally, note that all of the FaceBook API is basically a set of wrappers around their SQL like FQL query language.  So you can, if you prefer, make custom methods out of FQL query strings.  For example&lt;br /&gt;&lt;br /&gt;var myQuery='SELECT name FROM user WHERE uid='+api.get_session().uid;&lt;br /&gt;api.fql_query(myQuery,getFQLResponse);&lt;br /&gt;&lt;br /&gt;will execute the indicated query string from JavaScript and pass it to your (developer defined) function getFQLResponse().&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Groups&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;To list information about groups you are a member of, use the following.  You can replace your uid with another UID. &lt;br /&gt;  api.groups_get(api.get_session().uid,null,getGroups);&lt;br /&gt;  api.groups_getMembers(18629081888,getGroupMembers);&lt;br /&gt;&lt;br /&gt;&lt;/your_key_here&gt;In the second line, 18629081888 is the GID for the very inactive OGF Web 2.0 group.&lt;br /&gt;&lt;br /&gt;&lt;your_key_here&gt;&lt;br /&gt;&lt;br /&gt;&lt;/your_key_here&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-8480636834018430262?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/8480636834018430262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=8480636834018430262' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8480636834018430262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8480636834018430262'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/little-more-jsfacebook-hacking.html' title='A Little More JavaScript and FaceBook Hacking'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2662128528163471639</id><published>2008-02-14T13:41:00.000-08:00</published><updated>2008-02-15T16:27:35.208-08:00</updated><title type='text'>Quick Facebook JavaScript and PHP API Notes</title><content type='html'>&lt;span style="font-weight: bold;"&gt;JavaScript&lt;/span&gt;&lt;br /&gt;Took a quick look at &lt;a href="http://wiki.developers.facebook.com/index.php/JavaScript_Client_Library"&gt;http://wiki.developers.facebook.com/index.php/JavaScript_Client_Library&lt;/a&gt; and found a few obfuscations.   To get started, you need to do these things (described a little too briefly in the link above).&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Register for an application key at &lt;a href="http://indiana.facebook.com/developers/editapp.php?new"&gt;http://indiana.facebook.com/developers/editapp.php?new&lt;/a&gt; (Don't hit enter yet)&lt;/li&gt;&lt;li&gt;Cllick the "Optional Fields" drop down and&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Provide a callback URL (that is, the full URL of your HTML  page containing the Facebook JavaScript application).&lt;/li&gt;&lt;li&gt;Choose "IFrame" as the canvas page URL. &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;When it is working, this little app just prints out your friend's Facebook IDs (numbers) onto the screen.  When you load your page (http://some.host.name/mytest/index.html), you will be redirected to Facebook to login and then will go back to your URL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PHP&lt;/span&gt;&lt;br /&gt;Also took a quick tour of the PHP examples ("footprints" and some hello-world type stuff).  Looks like the instructions for setting up the JS example assumed you were familiar with doing things the PHP way.&lt;br /&gt;&lt;br /&gt;For footprints, you will need a web server (apache), PHP, and MySQL.  Get, install, and start these in the usual ways.  Hints: for Macs, get the nice disk image from MySQL.  Also, read the PHP installation instructions &lt;span style="font-style: italic;"&gt;before&lt;/span&gt; installing Apache, since PHP will require some non-default configuration options (particularly DSO support).&lt;br /&gt;&lt;br /&gt;The web server provides the callback URL as well ("http://your.host.name/footprints"), which will need to be on a world accessible Apache (or other) server.   Dump your application in htdocs/footprints and make sure paths are correct (index.php needs to point correctly to facebook.php).  Note also that apps.facebook.com/footprints will be taken, so make a different name.  The facebook app name does not have to match your callback app's name.&lt;br /&gt;&lt;br /&gt;Create the MySQL database.  The footprints PHP scripts don't do this for you.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Edit config.php.  You will need the root password for your db.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;From the command line, log into your db with /usr/local/mysql/bin/mysql -u root -p and provide the root password at the prompt.  You will then need to create and switch to the footprints database.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; mysql&gt; CREATE DATABASE footprints;&lt;/li&gt;&lt;li&gt;mysql&gt; USE footprints&lt;/li&gt;&lt;li&gt;mysql&gt;CREATE TABLE `footprints` (   `from` int(11) NOT NULL default '0',   `to` int(11) NOT NULL default '0',   `time` int(11) NOT NULL default '0',   KEY `from` (`from`),   KEY `to` (`to`) );&lt;/li&gt;&lt;/ol&gt;Step 5 is just a cut and paste of the config.php file from footprints, but note that they omitted the final ";" on the statement.&lt;br /&gt;&lt;br /&gt;When it is working, this little application allows you to step on your friends.  It gives you a little text area for typing names that will be autocompleted as you type.  Note this must run inside Facebook, unlike the previous example.&lt;br /&gt;&lt;br /&gt;When setting up your PHP app, you'll notice you can choose between FBML and IFrames.  FBML will (as you might have guessed) a nice FaceBook styled application and some extra goodies.  The IFrame option will produce a pretty bare bones footprint application, but obviously you have more power to customize the styles.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hosting Your Services&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;Here are some instructions on using Amazon Web Services to host your application.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?entryID=1044"&gt;http://developer.amazonwebservices.com/connect/entry.jspa?entryID=1044&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2662128528163471639?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2662128528163471639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2662128528163471639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2662128528163471639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2662128528163471639'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/quick-facebook-javascript-api-notes.html' title='Quick Facebook JavaScript and PHP API Notes'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-4376869065258058141</id><published>2008-02-12T19:04:00.000-08:00</published><updated>2008-02-13T08:26:04.851-08:00</updated><title type='text'>Portals and Web Applications</title><content type='html'>There are many tools for building web applications and portals, so it is useful try to classify these a bit.  The field also suffers from overlapping terminology ("framework" providing the worst example) and overlapping functionality.  I'll take an informal stab at trying to organize these things.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Programming Tools and Languages:&lt;/span&gt; this is the simplest group (hopefully) to define.  PHP, PERL/CGI, Java Server Pages and Servlets are all examples.  One could argue that JSP is more of a development framework (below), but these aren't sharp definitions.  I'll err on the side of usage--most people don't write JSP using beautiful MVC architected code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Goodies and Widgets:&lt;/span&gt; these are useful little or medium-sized extensions that can be easily plugged into several different development environments.  PEAR/PHP and Java Tag Libraries seem to be best examples on the server side. Various JavaScript libraries (such as YUI) are good examples of client-side applications.  These can be embedded into several different toolkits and frameworks.  These are distinct from development framework modules (i.e. Ruby on Rails modules) since they are meant to work with both Programming Tools (above) and more specific, derived Development Frameworks (below). Thus one can put useful tags into JSP as well as JSF.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Development Frameworks: &lt;/span&gt;Frameworks are typically one level of abstraction above the common programming language tools. Java is full of these: Struts, JSF, Velocity, etc.  Ruby on Rails is  another famous example. DWR, Google Web Toolkit, and other tools also fall in here. ASP.NET and various compatible, open source implementations like Mono go here.&lt;br /&gt;&lt;br /&gt;Frameworks typically encode a development methodology (MVC) and provide an extensibility framework so that all developers create code more or less in the same way.  Frameworks thus allow you to develop reusable and useful little modules that can be shared with other developers using the same framework.&lt;br /&gt;&lt;br /&gt;A framework can be used to build standalone applications, but it can also be used to develop a rich, self contained component that can be deployed into a container.  In contrast, a container (after installation) comes up immediately with useful tools such as login modules, layout managers, and some user tools (say, a calendar or a blog authoring tool).  In this example, one may use JSF (a framework) to build a web calendar or  a web email application, but one would also typically want to embed these into a more comprehensive container (a portlet container in the Java world).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Application Containers: &lt;/span&gt;Joomla (php), Zope (python), Mambo, and Drupal (php) are examples.  Java JSR 168 containers and various similar efforts also fit here: GridSphere, LifeRay, uPortal, Jetspeed2, etc.  Sakai is another example--it supports the Java standard but also has its own component model.  Interestingly, the non-Java containers mentioned above all began life as content management systems.&lt;br /&gt;&lt;br /&gt;Arguably only Java's portlet standard really takes the container philosophy completely seriously.  Joomla et al, really don't care about portability of codes across container vendors, although they do obviously care about shareable community developed modules.   All Java portlet container providers (except Pluto, the reference implementation) don't just give you a container for managing your own portal components--they also give you lots of built in functionality and other goodies (calendars, chat tools, document managers, etc).  LifeRay and Sakai are good examples of this.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Things:&lt;/span&gt; Web-based containers for content and document management, blogging, wikis, and learning management are related closely to portals.  There are many different content management systems.  Learning management varies from Moodle to Blackboard.  Blogging is often provided as an online service (such as Google's Blogspot), but you can also install and run your own blogging service.  WordPress is a prominent example of blogging software.  Many frameworks (such as Drupal) come with blogging modules.  Wikis are similar to content management and document management systems. The best known wikis (MediaWiki and Twiki) are standalone tools, but many containers come with Wiki modules (Sakai for example).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Services for Portals: &lt;/span&gt;One of the dangers of portal tools at any level is that they can become monolithic.  The danger here is that you will  be stuck with inflexible technology and can't respond to changing requirements.  The current Enterprise vs. Web 2.0 conflict provides a compelling example.  Many famous Web 2.0 sites (flickr, youtube, etc) are Web Services as much as they are Web sites, so modern portals must be able to easily integrate (rather than compete) with these large third party services.&lt;br /&gt;&lt;br /&gt;External services: there is a great temptation of course to bundle everything into a particular portal for simplicity of installation and maintenance.  However, this is not a good plan in the long term since you will (for example) tie your managed content to a particular tool rather than a portable standard.&lt;br /&gt;&lt;br /&gt;When choosing a framework or container, a good starting point in the evaluation process is to see if it supports clients to the following standard services.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Authentication and Authorization:&lt;/span&gt; these are often tied to LDAP, CAS, or (in the Grid world) MyProxy.  Shibboleth is an authorization mechanism. The basic idea is that the portal needs to go to an external database to get the login information.  This DB is independent of the portal and may have other clients.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;RSS/Atom&lt;/span&gt; feeds are particularly important in Web 2.0 applications, since most of them publish syndication in some form or another.  Many containers provide RSS readers.  This is any easy way to incorporate external content (say, YouTube videos) into a portal.This is particularly important topic in modern education portals, as for example one may embed publication feeds from Connotea and CiteULike, slides from SlideShare or ImageLooop, SciVee or YouTube for scientific visualizations and online lectures, etc.  As can be seen from the previous list, there are dedicated, high quality online services for many education and science portal content that can be incorporated into a portal pretty generically as RSS/Atom.  It is a bad idea to reinvent this stuff or tie it too closely to your portal framework.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;           We may also turn this problem upside down: if you run a resource management portal,&lt;br /&gt;            you must be able to export that portal's content to other user interfaces such as iGoogle&lt;br /&gt;           and NetVibes that users are more likely to use every day.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Calendars: &lt;/span&gt;Collaborative calendars are obviously best extracted from portals since there are so many calendar clients.  This is also an example of a reversible service: you typically want to synch your online calendar with your local PC or mobile device.  A relevant standard is iCal.  &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt; WebDAV &lt;/span&gt;servers for content management.  WebDAV is an extension of HTTP and is supported by many Web servers (with the right module, of course).  &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Grid and workflow services &lt;/span&gt;for running scientific applications and accessing data.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Digital libraries: &lt;/span&gt;access to Fedora, etc.  Don't reinvent this or jackbooted librarians will be goose stepping into your cubicle.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;It is of course inadequate to simply support such services through clients, as the implementation must be useful and enjoyable. On the downside, however, it is also hard to know when one has crossed the line that separates a rich, useful client from a full fledged internal service that can't be easily extracted from the framework.  I certainly can think of several examples that I've written.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Social Networking: &lt;/span&gt;the other challenge facing education portals is how much to integrate with social networking sites such as FaceBook or LinkedIn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-4376869065258058141?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/4376869065258058141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=4376869065258058141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4376869065258058141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4376869065258058141'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/portals-and-web-applications.html' title='Portals and Web Applications'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-983751884027989232</id><published>2008-02-12T13:59:00.000-08:00</published><updated>2008-02-12T14:00:05.885-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='polargrid polar grid'/><title type='text'>Polar Grid URL</title><content type='html'>Using the power of my blog to shift google page ranks, I hereby declare that PolarGrid (aka Polar Grid) has the following official URL: &lt;a href="http://www.polargrid.org/"&gt;http://www.polargrid.org.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Damn polar coordinate system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-983751884027989232?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/983751884027989232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=983751884027989232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/983751884027989232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/983751884027989232'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/02/polar-grid-url.html' title='Polar Grid URL'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-7891081644825677780</id><published>2008-01-20T11:29:00.001-08:00</published><updated>2008-01-20T12:07:42.653-08:00</updated><title type='text'>Some Project Zero Thoughts</title><content type='html'>IBM's little Project Zero is their effort to provide a Java-based Web 2.0 framework/toolkit/whatever for building your own applications.  Several things look promising, such as the list of core Web 2.0 services (commenting, tagging, rating, etc) at &lt;a href="http://www.projectzero.org/wiki/bin/view/Documentation/CoreGettingStartedZeroZone"&gt;http://www.projectzero.org/wiki/bin/view/Documentation/CoreGettingStartedZeroZone.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But looking at it raises more concerns and confusions.  I could just be wrong, but here are some criticisms.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;They seem to be providing their own Web server container, which is a really bad idea.  How do I port this to some other Web Server like Tomcat or Jetty?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I managed to stumble on a bug in their simple "to-do" list application--only the last item in the list gets deleted properly.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;They rely on Groovy as their  Java Web framework (you can also develop in PHP).  Groovy may be nice, and it does sound sort of like "Ruby", but there are also a lot of JSP developers out there.  Why ignore them?  Having seen a lot of Java ideas come and go, I am really reluctant to embrace anything  but the lowest common denominator technology from them.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The packaging of the tutorials is nice and easy to get going (looks like maven or ant under the hood of some scripts), but I have to critique them a bit on their documentation (or maybe I didn't read carefully enough) here: it was not clear until I dug a little more that the methods implemented in&lt;br /&gt;todos.groovy represent the universal Project Zero API for REST services: all services implement onList(), onCreate(), etc, and these are bound to various HTTP Methods (onList &lt;--&gt; GET).  See &lt;a href="http://www.projectzero.org/wiki/bin/view/Documentation/CoreDevelopersGuideREST"&gt;http://www.projectzero.org/wiki/bin/view/Documentation/CoreDevelopersGuideREST&lt;/a&gt;.I think this is reasonable (after, REST is essentially a universal API, the equivalent of a one size fits all WSDL).  I just wish the nice tables in the link above were shown in the tutorial.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-7891081644825677780?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/7891081644825677780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=7891081644825677780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/7891081644825677780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/7891081644825677780'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/01/some-project-zero-thoughts.html' title='Some Project Zero Thoughts'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-6650865577917780358</id><published>2008-01-20T08:29:00.000-08:00</published><updated>2008-01-20T08:37:30.917-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs mac os x'/><title type='text'>More Mac OS X Emacs</title><content type='html'>There is a nice list of emacs for Mac OS X here: &lt;a href="http://www.emacswiki.org/cgi-bin/wiki/EmacsForMacOS"&gt;http://www.emacswiki.org/cgi-bin/wiki/EmacsForMacOS.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've been using the build from &lt;a href="http://www.porkrind.org/emacs/"&gt;Porkrind&lt;/a&gt; (as I posted some time ago), but I have recently switched to &lt;a href="http://www.emacswiki.org/cgi-bin/wiki/EmacsApp"&gt;EmacsApp&lt;/a&gt;.  EmacsApp features much nicer integration with the Mac GUI widgets and supports both the classic Emacs keyborad shortcuts as well as standard Mac shortcuts (that is, paste can be either cntrl-y or apple-v).   Moving text between Emacs and other Mac applications is much better implemented.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-6650865577917780358?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/6650865577917780358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=6650865577917780358' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6650865577917780358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6650865577917780358'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/01/more-mac-os-x-emacs.html' title='More Mac OS X Emacs'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-1742626775258109654</id><published>2008-01-18T17:15:00.000-08:00</published><updated>2008-01-18T17:17:55.273-08:00</updated><title type='text'>Birdbath and Globus RSL</title><content type='html'>The condor_submit globusrsl parameter's "real" name is GlobusRSL (use condor_q -l to see this).  Thus to specific in your Birdbath Java client an RSL parameter such as maxWallTime, use&lt;br /&gt;&lt;br /&gt;    new ClassAdStructAttr("GlobusRSL",&lt;br /&gt;            ClassAdAttrType.value2,&lt;br /&gt;            "\"(maxWallTime=120)(maxTime=120)\"")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-1742626775258109654?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/1742626775258109654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=1742626775258109654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1742626775258109654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1742626775258109654'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2008/01/birdbath-and-globus-rsl.html' title='Birdbath and Globus RSL'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-7212555356722305316</id><published>2007-12-31T14:09:00.000-08:00</published><updated>2007-12-31T14:30:39.198-08:00</updated><title type='text'>Installing and Configuring Globus Services on Mac OS X</title><content type='html'>* Download Mac binaries from Globus site.  Probably the VDT will work fine also.&lt;br /&gt;&lt;br /&gt;* Do the usual configure/make/make install business. &lt;br /&gt;&lt;br /&gt;* Unfortunately, all Macs that I tried are missing Perl XML parsers and so will fail at the "make install" step.  For some reason, Globus's ./configure isn't set up to catch this.  Not sure why. I found the following nice instructions for installing Perl::XML and other stuff at&lt;br /&gt;&lt;br /&gt;  &lt;a href="http://ripary.com/bundle-xml.html"&gt;    http://ripary.com/bundle-xml.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This will take a while.&lt;br /&gt;&lt;br /&gt;* Set up Simple CA.  See&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vdt.cs.wisc.edu/releases/1.8.1/installation_post_server.html#simpleca"&gt;http://vdt.cs.wisc.edu/releases/1.8.1/installation_post_server.html#simpleca&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www-unix.globus.org/toolkit/docs/4.0/admin/docbook/ch07.html#s-simpleca-admin-installing"&gt;http://www-unix.globus.org/toolkit/docs/4.0/admin/docbook/ch07.html#s-simpleca-admin-installing&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The VDT page above actually points to some older (v 3.2) instructions, but these are still OK also.&lt;br /&gt;&lt;br /&gt;* Make your host certificate and sign it.  I did all of this as root.&lt;br /&gt;&lt;br /&gt;  $GLOBUS_LOCATION/bin/grid-cert-request -host `hostname`&lt;br /&gt;&lt;br /&gt;(note the backticks around hostname).&lt;br /&gt;&lt;br /&gt;  cd /etc/grid-security/&lt;br /&gt;  ~/Globus-Services/bin/grid-ca-sign -in hostcert_request.pem  -out hostsigned.pem&lt;br /&gt;&lt;br /&gt;* Create your xinetd services.&lt;br /&gt;  &lt;br /&gt;  cd /etc/inetd.d/&lt;br /&gt;  touch gsigatekeeper&lt;br /&gt;  touch gsiftp&lt;br /&gt;&lt;br /&gt;* Here is my gsigatekeeper:&lt;br /&gt;  service gsigatekeeper&lt;br /&gt; {&lt;br /&gt;    socket_type  = stream&lt;br /&gt;    protocol     = tcp&lt;br /&gt;    wait         = no&lt;br /&gt;    user         = root&lt;br /&gt;    env          = LD_LIBRARY_PATH=/Users/mpierce/Globus-Services/lib&lt;br /&gt;    env          = DYLD_LIBRARY_PATH=/Users/mpierce/Globus-Services/lib&lt;br /&gt;    server       = /Users/mpierce/Globus-Services/sbin/globus-gatekeeper&lt;br /&gt;    server_args  = -conf /Users/mpierce/Globus-Services/etc/globus-gatekeeper.conf&lt;br /&gt;    disable = no&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;And my gsiftp:&lt;br /&gt;service gsiftp&lt;br /&gt;{&lt;br /&gt;instances               = 100&lt;br /&gt;socket_type             = stream&lt;br /&gt;wait                    = no&lt;br /&gt;user                    = root&lt;br /&gt;env                     += GLOBUS_LOCATION=/Users/mpierce/Globus-Services&lt;br /&gt;env                     += LD_LIBRARY_PATH=/Users/mpierce/Globus-Services/lib&lt;br /&gt;env                     += DYLD_LIBRARY_PATH=/Users/mpierce/Globus-Services/lib&lt;br /&gt;server                  = /Users/mpierce/Globus-Services/sbin/globus-gridftp-server&lt;br /&gt;server_args             = -i&lt;br /&gt;log_on_success          += DURATION&lt;br /&gt;nice                    = 10&lt;br /&gt;disable = no&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Note the LD_LIBRARY_PATH is not useful for Macs--you need DYLD_LIBRARY_PATH instead (see below).  But I left it in anyway--you will need this for Linux installations.&lt;br /&gt;&lt;br /&gt;* Start your services:&lt;br /&gt;&lt;br /&gt;  service gsiftp start&lt;br /&gt;  service gsigatekeeper start&lt;br /&gt;&lt;br /&gt;* You may want to add these also to /etc/services&lt;br /&gt;tail /etc/services&lt;br /&gt;#                           Carstein Seeberg &lt;case@nimsoft.no&gt;&lt;br /&gt;#               48004-48555 Unassigned&lt;br /&gt;com-bardac-dw   48556/udp    # com-bardac-dw&lt;br /&gt;com-bardac-dw   48556/tcp    # com-bardac-dw&lt;br /&gt;#                           Nicholas J Howes &lt;nick@ghostwood.org&gt;&lt;br /&gt;#               48557-49150 Unassigned&lt;br /&gt;#               49151       IANA Reserved&lt;br /&gt;#gsiftp                  2811/tcp&lt;br /&gt;#gsigatekeeper   2119/tcp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Check these with telnet:&lt;br /&gt;  telnet localhost 2811&lt;br /&gt;  telnet localhost 2119&lt;br /&gt;&lt;br /&gt;* Note you must use DYLD_LIBRARY_PATH on the Mac or else the service will not start even though the "service" commands above will not complain.  You will get errors like this if you telnet to the ports:&lt;br /&gt;/Users/condor/execute/dir_8492/userdir/install/lib/libglobus_gss_assist_gcc32.0.dylib&lt;br /&gt;&lt;br /&gt;* Requisite Globus Complaint: I had to do all the above configuration stuff by hand.  Why not have a configuration post-installation "flavor" called "my first globus installation" that does all of this for you?&lt;br /&gt;&lt;br /&gt;* Create a grid-mapfile and some usercerts, or just use your favorite grid-mapfile from some place else.&lt;/nick@ghostwood.org&gt;&lt;/case@nimsoft.no&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-7212555356722305316?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/7212555356722305316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=7212555356722305316' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/7212555356722305316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/7212555356722305316'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/12/installing-and-configuring-globus.html' title='Installing and Configuring Globus Services on Mac OS X'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-5816141138991742514</id><published>2007-12-17T18:45:00.000-08:00</published><updated>2008-01-08T18:25:04.182-08:00</updated><title type='text'>Condor-G, Birdbath and TransferOutputRemaps</title><content type='html'>Here is the classad attribute structure you need for transferring your output back from the remote globus machine to specific files on your condor-g job broker/universal client. By default, the output goes to your cluster's spool directory.  The example below shows how to move these to /tmp/ on the condor host.&lt;br /&gt;&lt;br /&gt;Note that TransferOutput files are separated by commas, and TransferOutputRemaps files are separated by semicolons.&lt;br /&gt;&lt;br /&gt;new ClassAdStructAttr("TransferOutput",&lt;br /&gt;     ClassAdAttrType.value2,&lt;br /&gt;"\"testgeoupdate.index,testgeoupdate.node,testgeoupdate.tetra\""),&lt;br /&gt;&lt;br /&gt;new ClassAdStructAttr("TransferOutputRemaps",&lt;br /&gt;            ClassAdAttrType.value2,"\"testgeoupdate.index=/tmp/testgeoupdate.index;&lt;br /&gt;testgeoupdate.node=/tmp/testgeoupdate.node;testgeoupdate.tetra=/tmp/testgeoupdate.tetra\""),&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;The trick as usual is to get the condor true-names for the parameters you want to use.  These are typically NOT the familiar names from condor_submit.  Always create a command script for what you want to do before writing your birdbath api code, and then use condor_q -l to see the internal names that condor actually uses.  These are the ones you will need to use in your classAdStructAttr array.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-5816141138991742514?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/5816141138991742514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=5816141138991742514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5816141138991742514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5816141138991742514'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/12/birdbath-and-transferoutputrremaps.html' title='Condor-G, Birdbath and TransferOutputRemaps'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-5873617486097452157</id><published>2007-12-15T17:30:00.000-08:00</published><updated>2007-12-15T17:43:40.106-08:00</updated><title type='text'>File Retrieval with BirdBath and Condor-G</title><content type='html'>As I wrote earlier, output files (other than standard out) of Globus jobs submitted via Condor-G can be retrieved using the TransferOutput attribute.  To reproduce this with the BirdBath Java API, you need an incantation something like below. &lt;br /&gt;&lt;br /&gt;     ClassAdStructAttr[] extraAttributes =&lt;br /&gt;  {&lt;br /&gt;      new ClassAdStructAttr("GridResource", ClassAdAttrType.value3,&lt;br /&gt;       gridResourceVal),&lt;br /&gt;      new ClassAdStructAttr("Out", ClassAdAttrType.value3,&lt;br /&gt;       outputFile),&lt;br /&gt;      new ClassAdStructAttr("UserLog", ClassAdAttrType.value3,&lt;br /&gt;       logFile),&lt;br /&gt;      new ClassAdStructAttr("Err", ClassAdAttrType.value3,&lt;br /&gt;       errFile),&lt;br /&gt;      new ClassAdStructAttr("TransferExecutable",&lt;br /&gt;       ClassAdAttrType.value4, &lt;br /&gt;       "FALSE"),&lt;br /&gt;      new ClassAdStructAttr("when_to_transfer_output",&lt;br /&gt;       ClassAdAttrType.value2, &lt;br /&gt;       "\"ON_EXIT\""),&lt;br /&gt;      new ClassAdStructAttr("should_transfer_files",&lt;br /&gt;       ClassAdAttrType.value2, &lt;br /&gt;       "\"YES\""),&lt;br /&gt;      new ClassAdStructAttr("StreamOut",&lt;br /&gt;       ClassAdAttrType.value4, &lt;br /&gt;       "FALSE"),&lt;br /&gt;      new ClassAdStructAttr("StreamErr",&lt;br /&gt;       ClassAdAttrType.value4, &lt;br /&gt;       "FALSE"),&lt;br /&gt;      new ClassAdStructAttr("TransferOutput",&lt;br /&gt;       ClassAdAttrType.value2, &lt;br /&gt;       "\"testgeoupdate.index,testgeoupdate.node,testgeoupdate.tetra\""),&lt;br /&gt;      new ClassAdStructAttr("Environment",ClassAdAttrType.value2,&lt;br /&gt;       "\"PATH=/home/teragrid/tg459247/geofest.binaryexec:/bin:/usr/bin\""),&lt;br /&gt;      new ClassAdStructAttr("x509userproxy", &lt;br /&gt;       ClassAdAttrType.value3, &lt;br /&gt;       proxyLocation)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The key problem with BirdBath is that it seems to require the parameter "true-names" rather than their values documented in the commandline condor_submit's man pages.  For example, to specify the file to use for logging, you have to use the parameter "UserLog", not "log" or "Log".  To see the actual "true-names" used by Condor internally, submit a job with condor_submit and then use condor_q -l.  It will be in the job_queue.log file in the the spool directory as well.  &lt;br /&gt;&lt;br /&gt;With birdbath+condor-g there is a similar problem returning files from the remote globus server.  You have to use "TransferOutput" as one of the attributes.  Also I noticed birdbath did not set StreamOut and StreamErr, so I manually set these as well.&lt;br /&gt;&lt;br /&gt;The output files (testgeoupdate.index, etc) will be uploaded to your job's spool directory.  Note birdbath does not clean this up, unlike the condor_submit invocations (which delete your job's clusterxy.proc0.subproc0 directory on completion).  To make birdbath mimic this behavior, you can set LeaveJobInQueue=TRUE in your classadstructattrs above.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-5873617486097452157?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/5873617486097452157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=5873617486097452157' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5873617486097452157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/5873617486097452157'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/12/file-retrieval-with-birdbath-and-condor.html' title='File Retrieval with BirdBath and Condor-G'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2229609355335074529</id><published>2007-12-13T14:06:00.000-08:00</published><updated>2007-12-13T14:45:44.122-08:00</updated><title type='text'>Condor-G Plus TeraGrid Example</title><content type='html'>Below is an example condor command script for running a job from my local grid client (a PC running FC7, globus, condor).  I'm running a set of codes that I installed on the machine (lonestar) that I wanted to use.  These codes are run by a perl script, so I had to set the PATH.  I want to upload the input files from my desktop at submission time--the paths here are for my client machine.  Note Condor-G will put these in $SCRATCH_DIRECTORY on lonestar, which doubles as your working directory (that is, autoref.pl will be executed here).  To get the files back from lonestar to the PC, I used "transfer_output_files" and listed each file.  Full paths for these aren't necessary.  Condor will pull them back from $SCRATCH_DIRECTORY on the remote machine to your local directory.&lt;br /&gt;&lt;br /&gt;# Here it is.  Please gaze at it only through a welder's mask.&lt;br /&gt;executable      = /home/teragrid/myaccnt/geofest.binaryexec/autoref.pl&lt;br /&gt;arguments       = testgeoupdate rare&lt;br /&gt;transfer_executable = false&lt;br /&gt;should_transfer_files=yes&lt;br /&gt;when_to_transfer_output=ON_EXIT&lt;br /&gt;transfer_input_files  =/home/mpierce/condor_test/Northridge2.flt,/home/mpierce/condor_test/Northr&lt;br /&gt;idge2.params,/home/mpierce/condor_test/Northridge2.sld,/home/mpierce/condor_test/NorthridgeAreaMan&lt;br /&gt;tle.materials,/home/mpierce/condor_test/NorthridgeAreaMantle.sld,/home/mpierce/condor_test/Northri&lt;br /&gt;dgeAreaMidCrust.materials,/home/mpierce/condor_test/NorthridgeAreaMidCrust.sld,/home/mpierce/condo&lt;br /&gt;r_test/NorthridgeAreaUpper.materials,/home/mpierce/condor_test/NorthridgeAreaUpper.sld,/home/mpier&lt;br /&gt;ce/condor_test/testgeoupdate.grp&lt;br /&gt;transfer_output_files=testgeoupdate.index,testgeoupdate.node,testgeoupdate.tetra&lt;br /&gt;universe        = grid&lt;br /&gt;grid_resource           = gt2 tg-login.tacc.teragrid.org/jobmanager-fork&lt;br /&gt;output             = test.out.$(Cluster)&lt;br /&gt;log                = test.log.$(Cluster)&lt;br /&gt;environment        = PATH=/home/teragrid/myaccnt/geofest.binaryexec/:/bin/:/usr/bin&lt;br /&gt;queue&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2229609355335074529?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2229609355335074529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2229609355335074529' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2229609355335074529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2229609355335074529'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/12/condor-g-plus-teragrid-example.html' title='Condor-G Plus TeraGrid Example'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-3484292357928513045</id><published>2007-12-13T08:27:00.000-08:00</published><updated>2007-12-13T10:44:52.441-08:00</updated><title type='text'>Returning Standard Output in Condor-G</title><content type='html'>[The problems have been hard to reproduce, so none of this may be necessary.  But it doesn't hurt.]&lt;br /&gt;&lt;br /&gt;Here's a nugget of wisdom: start Condor-G as root and set CONDOR_IDS=(uid).(gid)(that is, see /etc/passwd and /etc/group for the values, should be something like 501.501) if you want to run as a user other than "condor".&lt;br /&gt;&lt;br /&gt;I had the following problem: condor_submit worked correctly but standard output went to /dev/null.  Checking the logs and spool, I saw that TransferOut was also FALSE and couldn't override this.&lt;br /&gt;&lt;br /&gt;I solved this by restarting condor as root (it resets the process id to the CONDOR_IDS user). It also seems to work if you run condor as the correct user (that is, the one specified by CONDOR_IDS).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-3484292357928513045?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/3484292357928513045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=3484292357928513045' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3484292357928513045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3484292357928513045'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/12/returning-standard-output-in-condor-g.html' title='Returning Standard Output in Condor-G'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2541613223337004964</id><published>2007-12-12T08:53:00.000-08:00</published><updated>2007-12-12T10:57:36.219-08:00</updated><title type='text'>Globus Client+MyProxy+Pacman on FC7 Notes</title><content type='html'>Here are my "hold your mouth right" instructions.  Deviate at your own risk.&lt;br /&gt;&lt;br /&gt;* Get pacman, untar, cd, and run setup.sh.&lt;br /&gt;&lt;br /&gt;* Make an installation directory (like mkdir $HOME/vdt) and cd into it.  Don't run Pacman in $HOME--it copies everything in the current working directory into post-install, which could be awful if you run from $HOME.&lt;br /&gt;&lt;br /&gt;* Fedora Core 7 is not supported by the VDT, so do the pacman pretend:&lt;br /&gt; &lt;br /&gt;   cd $HOME/vdt (if not there already)&lt;br /&gt;   pacman -pretend-platform Fedora-4&lt;br /&gt;&lt;br /&gt;* Install Globus clients (you are still in $HOME/vdt):&lt;br /&gt;    pacman -get http://vdt.cs.wisc.edu/vdt_181_cache:Globus-Client&lt;br /&gt;&lt;br /&gt;Answer no to installing VDT certs.  We will get TG certs in a minute, and the VDT certs seem to have some problems.&lt;br /&gt;&lt;br /&gt;* Install MyProxy (still in $HOME/vdt):&lt;br /&gt;    pacman -get http://vdt.cs.wisc.edu/vdt_181_cache:MyProxy&lt;br /&gt;&lt;br /&gt;* Install GSIOpenSSH (still in $HOME/vdt):&lt;br /&gt;    pacman -get http://vdt.cs.wisc.edu/vdt_181_cache:GSIOpenSSH&lt;br /&gt;&lt;br /&gt;* Set your $GLOBUS_LOCATION and source $GLOBUS_LOCATION/etc/globus-user-env.sh.&lt;br /&gt;&lt;br /&gt;* Get the TG certificates:&lt;br /&gt;   * wget  http://security.teragrid.org/docs/teragrid-certs.tar.gz&lt;br /&gt;Unpack these in $HOME/.globus/certificates/&lt;br /&gt;&lt;br /&gt;* I didn't like the Condor installation I got from Pacman.  This should be done for now with the old condor-configure command on a direct download.&lt;br /&gt;&lt;br /&gt;* Also make sure pacman didn't set $X509_CERT_DIR.  This had some self-signed certs that caused myproxy-logon to myproxy.teragrid.org to fail and overrode my .globus and /etc/grid-security certificate locations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2541613223337004964?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2541613223337004964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2541613223337004964' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2541613223337004964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2541613223337004964'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/12/globus-clientmyproxypacman-on-fc7-notes.html' title='Globus Client+MyProxy+Pacman on FC7 Notes'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-6085106951158787869</id><published>2007-12-10T13:58:00.000-08:00</published><updated>2007-12-11T18:35:20.334-08:00</updated><title type='text'>MyProxy, Globus Clients on Mac OSX: Use the VDT</title><content type='html'>[NOTE:  Read the comments.  Mac binaries are available from www.globus.org; missing links were added.]&lt;br /&gt;&lt;br /&gt;I spent a couple of hours trying to compile Globus source on my Mac OS X, only to have it fail with some mysterious error.  Some things never change.  Why don't they provide a pre-built Mac OS X binary?  Here is the error that I get:&lt;br /&gt;&lt;br /&gt;make: *** [globus_rls_server-thr] Error 2&lt;br /&gt;&lt;br /&gt;Luckily, the VDT seems to do things the right way.  I used Pacman to install globus clients (the command line tools only) and MyProxy.  See the VDT documentation for instructions.  Why doesn't Globus do this?  Unbelievable.  Anyway, here are the Pacman commands that I used:&lt;br /&gt;&lt;br /&gt;pacman -get http://vdt.cs.wisc.edu/vdt_181_cache:Globus-Client&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;pacman -get http://vdt.cs.wisc.edu/vdt_181_cache:MyProxy&lt;br /&gt;&lt;br /&gt;I answered "no" for installing certificates--I have the ones I needed, and answering "yes" caused a failure, probably because of write permission problems.&lt;br /&gt;&lt;br /&gt;Set $GLOBUS_LOCATION and source $GLOBUS_LOCATION/etc/globus-user-env.sh as usual.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-6085106951158787869?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/6085106951158787869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=6085106951158787869' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6085106951158787869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6085106951158787869'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/12/myproxy-globus-clients-on-mac-osx-use.html' title='MyProxy, Globus Clients on Mac OSX: Use the VDT'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-1557303183180426936</id><published>2007-12-06T08:18:00.000-08:00</published><updated>2007-12-06T10:15:35.189-08:00</updated><title type='text'>Condor Birdbath Compromises</title><content type='html'>I have not been able to find the right incantation for using the "initialdir" attribute with the Birdbath web service.    I'm trying to do the equivalent of the following submission script:&lt;br /&gt;&lt;br /&gt;universe        = vanilla&lt;br /&gt;executable      = /path/to/my/bin/a.out&lt;br /&gt;output          = theOutput&lt;br /&gt;error           = theError&lt;br /&gt;log             = theLog&lt;br /&gt;arguments       = 10 21&lt;br /&gt;environment     = "PATH=/path/to/my/bin/:/bin/:/usr/bin"&lt;br /&gt;initialdir      = /path/to/my/data&lt;br /&gt;should_transfer_files = IF_NEEDED&lt;br /&gt;when_to_transfer_output = ON_EXIT&lt;br /&gt;queue&lt;br /&gt;&lt;br /&gt;Looking at spool/job.queue.log, you will see that this attribute's proper name is "Iwd". However, the classad structure (using Birdbath java helper classes) like below didn't work:&lt;br /&gt;&lt;br /&gt;//Create a classad for the job.&lt;br /&gt;ClassAdStructAttr[] extraAttributes =&lt;br /&gt;{&lt;br /&gt;      new ClassAdStructAttr("Out", ClassAdAttrType.value3,&lt;br /&gt;            outputFile),&lt;br /&gt;      new ClassAdStructAttr("Err", ClassAdAttrType.value3,&lt;br /&gt;            errFile),&lt;br /&gt;      new ClassAdStructAttr("Log", ClassAdAttrType.value3,&lt;br /&gt;            logFile),&lt;br /&gt;      new ClassAdStructAttr("Environment", ClassAdAttrType.value2,&lt;br /&gt;            "\"PATH=/path/to/my/bin/:/bin:/usr/bin\""),&lt;br /&gt;      new ClassAdStructAttr("ShouldTransferFiles", ClassAdAttrType.value2,&lt;br /&gt;            "\"IF_NEEDED\""),&lt;br /&gt;      new ClassAdStructAttr("WhenToTransferFiles", ClassAdAttrType.value2,&lt;br /&gt;            "ON_EXIT"),&lt;br /&gt;        new ClassAdStructAttr("Iwd", ClassAdAttrType.value3,&lt;br /&gt;              "/path/to/my/data/")&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;The Iwd parameter is set correctly in the logs, but the executables can't find the input files  in the initial directory correctly.  My workaround solution was to uploading all the data files to the&lt;br /&gt;&lt;br /&gt;File[] files={ new File("/local/data/path/file1.dat"),&lt;br /&gt;             new File("/local/data/path/file1.dat") };&lt;br /&gt;&lt;br /&gt;And then run the usual way, except specify the files&lt;br /&gt;&lt;br /&gt;xact.submit(clusterId, jobId, userName, universeType,&lt;br /&gt;                     executable,arguments,"(TRUE)", extraAttributes, files);&lt;br /&gt;xact.commit();&lt;br /&gt;schedd.requestReschedule();&lt;br /&gt;&lt;br /&gt;This will put the data (input and output) in condor's spool directory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-1557303183180426936?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/1557303183180426936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=1557303183180426936' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1557303183180426936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1557303183180426936'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/12/condor-birdbath-compromises.html' title='Condor Birdbath Compromises'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-8375710240377403575</id><published>2007-12-04T18:37:00.001-08:00</published><updated>2007-12-04T18:41:21.381-08:00</updated><title type='text'>Running GeoFEST with Condor</title><content type='html'>This is a prelude to using Condor-G.  I used the following incantation:&lt;br /&gt;&lt;br /&gt;-bash-3.00$ more meshgen.cmd&lt;br /&gt;universe        = vanilla&lt;br /&gt;executable      = /globalhome/gateway/geofest.binaryexec/autoref.pl&lt;br /&gt;output          = autoref.out&lt;br /&gt;error           = autoref.err&lt;br /&gt;log             = autoref.log&lt;br /&gt;arguments       = /globalhome/gateway/condor_test/testgeoupdate rare&lt;br /&gt;environment     = "PATH=/globalhome/gateway/geofest.binaryexec/"&lt;br /&gt;#getenv         = true&lt;br /&gt;initialdir      = /globalhome/gateway/condor_test&lt;br /&gt;should_transfer_files = IF_NEEDED&lt;br /&gt;when_to_transfer_output = ON_EXIT&lt;br /&gt;queue &lt;br /&gt;&lt;br /&gt;The key thing here was the "environment" attribute, since the autoref.pl script is of course a perl script that calls other executables.  These executables need to be in the PATH.  &lt;br /&gt;&lt;br /&gt;You can also do this by setting the PATH environment variable in your shell and then using the getenv attribute.  This will work OK for the command line but will not be much use in a web service version. OK, you could get it to work, but this is the kind of thing that will break 6 months later when you move to a new machine.&lt;br /&gt;&lt;br /&gt;None of the condor examples I could find discuss this, but it is well documented in the condor_submit manual page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-8375710240377403575?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/8375710240377403575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=8375710240377403575' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8375710240377403575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8375710240377403575'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/12/running-geofest-with-condor.html' title='Running GeoFEST with Condor'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-6353117876104700626</id><published>2007-12-03T15:10:00.000-08:00</published><updated>2007-12-03T15:11:38.309-08:00</updated><title type='text'>Compiling RDAHMM Correctly</title><content type='html'>The correct value for the LDLIBS variable is&lt;br /&gt;&lt;br /&gt;LDLIBS          = -lda -lnr -lut -lcp /usr/lib/liblapack.a -lblas -lm&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-6353117876104700626?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/6353117876104700626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=6353117876104700626' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6353117876104700626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6353117876104700626'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/12/compiling-rdahmm-correctly.html' title='Compiling RDAHMM Correctly'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-8279416913932454390</id><published>2007-11-30T10:17:00.000-08:00</published><updated>2007-11-30T10:20:48.138-08:00</updated><title type='text'>CIMA Portal Link</title><content type='html'>Here's a link to the CIMA Crytallography Portal: &lt;a href="http://cimaportal.indiana.edu:8080/gridsphere/gridsphere"&gt;http://cimaportal.indiana.edu:8080/gridsphere/gridsphere&lt;/a&gt;. This was hard for me to find with Google for some reason.  The keyword combination "cima portal" did not work well, but it was the top hit if I googled "cimaportal".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-8279416913932454390?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/8279416913932454390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=8279416913932454390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8279416913932454390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/8279416913932454390'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/11/cima-portal-link.html' title='CIMA Portal Link'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-4902652798292660993</id><published>2007-11-17T09:13:00.000-08:00</published><updated>2007-11-17T09:33:03.999-08:00</updated><title type='text'>Condor, Dagman for Running VLAB Jobs</title><content type='html'>Here's how to run PWSCF codes with Condor.  Assume you have the executables and that the input data comes to you in a .zip file.  We need to do these steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Clean up any old data&lt;/li&gt;&lt;li&gt;Unpack the .zip&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Run PWSCF's executables.&lt;/li&gt;&lt;/ol&gt;As always, see my del.icio.us "condor" tags (right side of blog) for useful links.&lt;br /&gt;&lt;br /&gt;For each step, we need to write a simple Condor .cmd file.  Condor can do parameter sweeps but you must use DAGMan to run jobs with dependencies.  We will start with a data file called __CC5f_7.zip.&lt;br /&gt;&lt;br /&gt;Here is clean_pwscf.cmd:&lt;br /&gt;&lt;br /&gt;    universe=vanilla&lt;br /&gt;    executable    = /bin/rm&lt;br /&gt;    arguments= -rf __CC5f_7&lt;br /&gt;    output        = clean.out&lt;br /&gt;    error        = clean.err&lt;br /&gt;    log        = clean.log&lt;br /&gt;    queue&lt;br /&gt;&lt;br /&gt;Now unpack_pwscf.cmd:&lt;br /&gt;&lt;br /&gt;    universe    = vanilla&lt;br /&gt;    executable    = /usr/bin/unzip&lt;br /&gt;    arguments = __CC5f_7.zip&lt;br /&gt;    output = unpack.out&lt;br /&gt;    error = unpack.err&lt;br /&gt;    log = unpack.log&lt;br /&gt;    queue&lt;br /&gt;&lt;br /&gt;Finally, run_pwscf.cmd:&lt;br /&gt;&lt;br /&gt;    universe=vanilla&lt;br /&gt;    executable    = pw.x&lt;br /&gt;    input        =  Pwscf_Input&lt;br /&gt;    output        = pw_condor.out&lt;br /&gt;    error        = pw_condor.err&lt;br /&gt;    log        = pw_condor.log&lt;br /&gt;    initialdir= __CC5f_7   &lt;br /&gt;    queue&lt;br /&gt;&lt;br /&gt;All of these are run in the same directory that contains the pw.x executable.  The only interesting part to any of these scripts is the &lt;span style="font-style: italic;"&gt;initialdir &lt;/span&gt;directive in the last one.  This specifies that the script is executed in the newly unpacked __CC5f_7 directory, which contains the Pwscf_Input file and will be the location of the .out, .err, and .log files.&lt;br /&gt;&lt;br /&gt;As with most scientific codes, PWSCF creates more than one output file.  In this case they are located in the __CC5f_7/tmp directory.  Presumably these would be preserved and copied back if I was running this on a cluster and not just one machine, although I may need to include the directives&lt;br /&gt;&lt;br /&gt;    should_transfer_files = IF_NEEDED&lt;br /&gt;    when_to_transfer_output = ON_EXIT&lt;br /&gt;&lt;br /&gt;Finally, we need to create our DAG.  Here is the content of pwscf.dag:&lt;br /&gt;&lt;br /&gt;    Job Clean clean_pwscf.cmd&lt;br /&gt;    Job Unpack unpack_pwscf.cmd&lt;br /&gt;    Job Run run_pwscf.cmd&lt;br /&gt;&lt;br /&gt;    PARENT Clean CHILD Unpack&lt;br /&gt;    PARENT Unpack CHILD Run&lt;br /&gt;&lt;br /&gt;The "job" portion associates each script with a nickname.  The PARENT portion than defines the DAG dependencies.  Submit this with&lt;br /&gt;    condor_submit_dag -f pwscf.dag&lt;br /&gt;&lt;br /&gt;The -f option forces condor to overwrite any preexisting log and other files associated with pwscf.dag.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-4902652798292660993?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/4902652798292660993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=4902652798292660993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4902652798292660993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4902652798292660993'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/11/condor-dagman-for-running-vlab-jobs.html' title='Condor, Dagman for Running VLAB Jobs'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-4392535380365306056</id><published>2007-11-10T14:16:00.001-08:00</published><updated>2007-11-10T14:20:37.385-08:00</updated><title type='text'>Running Condor on the Airplane</title><content type='html'>Or anywhere without internet connection. &lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install with condor_install as best you can.&lt;/li&gt;&lt;li&gt;Use 127.0.0.1 for your condor host.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Edit the annoying HOSTALLOW_WRITE to change the broken default.  Why can't I set this during the installation phase?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Uncomment DEFAULT_DOMAIN_NAME.  The value doesn't matter.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Uncomment NO_DNS=TRUE.&lt;/li&gt;&lt;li&gt;And don't forget to replace $(UWCS...) with $(TESTINGMODE...) in  Part 3.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-4392535380365306056?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/4392535380365306056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=4392535380365306056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4392535380365306056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/4392535380365306056'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/11/running-condor-on-airplane.html' title='Running Condor on the Airplane'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2171643742871744223</id><published>2007-11-05T11:43:00.000-08:00</published><updated>2007-11-07T18:37:15.784-08:00</updated><title type='text'>Using Maven 1 Repositories with Maven 2</title><content type='html'>The wonderful Maven2 Dependency Plugin lets you grab your project's dependent jars and puts them into a local directory.  Thanks to &lt;a href="http://www.cs.indiana.edu/%7Ehperera/"&gt;Srinath&lt;/a&gt; for showing me this.&lt;br /&gt;&lt;br /&gt;This grabs all the jars in your dependency list and puts them in target/.../lib.&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;maven-dependency-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;executions&amp;gt;&lt;br /&gt;            &amp;lt;execution&amp;gt;&lt;br /&gt;              &amp;lt;id&amp;gt;copy-dependencies&amp;lt;/id&amp;gt;&lt;br /&gt;              &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;&lt;br /&gt;              &amp;lt;goals&amp;gt;&lt;br /&gt;                &amp;lt;goal&amp;gt;copy-dependencies&amp;lt;/goal&amp;gt;&lt;br /&gt;              &amp;lt;/goals&amp;gt;&lt;br /&gt;              &amp;lt;configuration&amp;gt;&lt;br /&gt;                &amp;lt;outputDirectory&amp;gt;${basedir}/target/${pom.artifactId}-${pom.version}/lib&amp;lt;/outputDirectory&amp;gt;&lt;br /&gt;                &amp;lt;overWriteReleases&amp;gt;false&amp;lt;/overWriteReleases&amp;gt;&lt;br /&gt;                &amp;lt;overWriteSnapshots&amp;gt;true&amp;lt;/overWriteSnapshots&amp;gt;&lt;br /&gt;              &amp;lt;/configuration&amp;gt;&lt;br /&gt;            &amp;lt;/execution&amp;gt;&lt;br /&gt;          &amp;lt;/executions&amp;gt;&lt;br /&gt;        &amp;lt;/plugin&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2171643742871744223?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2171643742871744223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2171643742871744223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2171643742871744223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2171643742871744223'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/11/wonderful-maven2-dependency-plugin-lets.html' title='Using Maven 1 Repositories with Maven 2'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-7626149867630293706</id><published>2007-11-05T09:58:00.000-08:00</published><updated>2007-11-05T10:01:15.345-08:00</updated><title type='text'>Emacs goto-column function</title><content type='html'>&lt;pre&gt;Found this at http://www.icce.rug.nl/edu/1/cygwin/extra/dot.emacs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Put it in your .emacs file.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(defun goto-column-number (number)&lt;br /&gt;"Untabify, and go to a column number within the current line (1 is beginning&lt;br /&gt;of the line)."&lt;br /&gt;(interactive "nColumn number (&lt;nr&gt; - 1 == C) ? ")&lt;br /&gt;(beginning-of-line)&lt;br /&gt;(untabify (point-min) (point-max))&lt;br /&gt;(while (&gt; number 1)&lt;br /&gt; (if (eolp)&lt;br /&gt;     (insert ? )&lt;br /&gt;   (forward-char))&lt;br /&gt; (setq number (1- number))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To use it in emacs, use "Esc-X goto-column-number", enter, and type column number of the current line.&lt;br /&gt;&lt;/nr&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-7626149867630293706?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/7626149867630293706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=7626149867630293706' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/7626149867630293706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/7626149867630293706'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/11/emacs-goto-column-function.html' title='Emacs goto-column function'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-368962389027630066</id><published>2007-11-05T09:28:00.000-08:00</published><updated>2007-11-05T09:31:58.611-08:00</updated><title type='text'>Maven 1 Repositories with Maven 2</title><content type='html'>Add the following to your Maven 2 POM's repository section to download jars from an older Maven 1 repository.  This is useful since Maven 1 repositories are much simpler to create than Maven2.&lt;br /&gt;&lt;br /&gt;     &amp;lt;repository&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;ogce-maven1-legacy-repo&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;url&amp;gt;http://www.collab-ogce.org/maven&amp;lt;/url&amp;gt;&lt;br /&gt;      &amp;lt;layout&amp;gt;legacy&amp;lt;/layout&amp;gt;&lt;br /&gt;    &amp;lt;/repository&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-368962389027630066?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/368962389027630066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=368962389027630066' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/368962389027630066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/368962389027630066'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/11/maven-1-repositories-with-maven-2.html' title='Maven 1 Repositories with Maven 2'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2192719924460826140</id><published>2007-11-01T15:31:00.001-07:00</published><updated>2007-11-01T15:45:20.238-07:00</updated><title type='text'>Maven: Making a War and Jar at the Same Time</title><content type='html'>Maven 2 nice automates building WAR files, but it places your compiled classes in WEB-INF/classes instead of making a new jar in /WEB-INF/lib.&lt;br /&gt;&lt;br /&gt;If you want your stuff to be compiled as a .jar as well as a .war, you can do this by specifying the jar goal in the command line:&lt;br /&gt;&lt;br /&gt;  [shell&gt;mvn clean jar install&lt;br /&gt;&lt;br /&gt;Note this will make myproject.jar in target/, not in target/myproject/WEB-INF/lib, so you will need to use the Ant plugin to move this stuff around.&lt;br /&gt;&lt;br /&gt;But this is not always an option: for deep, modular builds using the reactor, you may want to build your whole thing using one "mvn install".  To do this, do the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Specify "war" packaging at the top of your pom.xml.&lt;/li&gt;&lt;li&gt;Then add the following to your build section.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt; &amp;lt;build&amp;gt;&lt;br /&gt;   &amp;lt;plugins&amp;gt;&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;       &amp;lt;artifactId&amp;gt;maven-jar-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;executions&amp;gt;&lt;br /&gt;            &amp;lt;execution&amp;gt;&lt;br /&gt;              &amp;lt;id&amp;gt;make-a-jar&amp;lt;/id&amp;gt;&lt;br /&gt;              &amp;lt;phase&amp;gt;compile&amp;lt;/phase&amp;gt;&lt;br /&gt;              &amp;lt;goals&amp;gt;&lt;br /&gt;                &amp;lt;goal&amp;gt;jar&amp;lt;/goal&amp;gt;&lt;br /&gt;              &amp;lt;/goals&amp;gt;&lt;br /&gt;            &amp;lt;/execution&amp;gt;&lt;br /&gt;          &amp;lt;/executions&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;  &amp;lt;/plugins&amp;gt;&lt;br /&gt;   &amp;lt;/build&amp;gt;&lt;br /&gt;&lt;br /&gt;And that's it.  Do a " maven install" and you get a jar and a war.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2192719924460826140?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2192719924460826140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2192719924460826140' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2192719924460826140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2192719924460826140'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/11/maven-making-war-and-jar-at-same-time.html' title='Maven: Making a War and Jar at the Same Time'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-1181509175574998468</id><published>2007-10-10T14:06:00.000-07:00</published><updated>2007-10-10T14:15:55.908-07:00</updated><title type='text'>Condor Collector Didn't Start</title><content type='html'>OK, installing Condor on a local set of linux machines with NFS, no firewall problems, and real IP addresses.  What could possibly go wrong?  Used condor_install, edited the HOSTWRITE_ALLOW param, tried to start with condor_master, but condor_status gave the error&lt;br /&gt;&lt;br /&gt;-bash-3.00$ ./bin/condor_status&lt;br /&gt;CEDAR:6001:Failed to connect to &lt;xxx.xxx.xxx.xxx:9618&gt;&lt;br /&gt;Error: Couldn't contact the condor_collector on myhost.myplace.myuniversity.edu.&lt;br /&gt;....&lt;br /&gt;&lt;br /&gt;The answer is found in the link below: you have to enable the additional daemons (particularly COLLECTOR) in the condor_config file. &lt;br /&gt;&lt;br /&gt;&lt;a href="https://www-auth.cs.wisc.edu/lists/condor-users-rc/2005-February/msg00119.shtml"&gt;https://www-auth.cs.wisc.edu/lists/condor-users-rc/2005-February/msg00119.shtml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note this does not apply to firewalled machines with no access to DNS, no real IPs, etc.  See my earlier post for this solution.&lt;br /&gt;&lt;br /&gt;Why in the world was this not set in the config file for the master node by default?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-1181509175574998468?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/1181509175574998468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=1181509175574998468' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1181509175574998468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1181509175574998468'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/10/condor-collector-didnt-start.html' title='Condor Collector Didn&apos;t Start'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-3833837504370789304</id><published>2007-10-07T11:05:00.000-07:00</published><updated>2007-10-08T12:04:04.354-07:00</updated><title type='text'>NVO Summary</title><content type='html'>I bookmarked several NVO related links on del.icio.us.  See my tag role on this blog, or check &lt;a href="http://del.icio.us/marlon_pierce"&gt;http://del.icio.us/marlon_pierce&lt;/a&gt;.  This blog post is intended to tie these together.&lt;br /&gt;&lt;br /&gt;It looks like the Grid Summer Schools in 2004 and 2006 are the best sources for software.  Ray Plante's nice but somewhat outdated summary, http://us-vo.org/pubs/files/PublishHowTo.html, is the best primer.&lt;br /&gt;&lt;br /&gt;In general, it looks like one needs to do the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Get some data.&lt;/li&gt;&lt;li&gt;Set up a registry.  NCSA's VORegistry-in-a-box looks like the best available software.  They also interestingly seem to build on the Digital Library's OAI software.&lt;/li&gt;&lt;li&gt;Set up some data services.   The simplest is a Cone Search service.  This is available from the 2004 Summer School.  This uses HTTP GET/URLS/REST, and apparently returns a list of links to existing whole images in the archive.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The SAIP service (aka SAI service) seems to be also available in the 2004 download.   This  implements the Simple Image Access Protocol.  The services are typically HTTP GET/REST based but support more arguments that the Cone Service.   For example, you can request image cutouts and other things that are created and returned on the fly, not just whole images.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The OpenSkyNode service is yet another service interface.  This looks like it supports more complicated, SQL-like queries and can query multiple servers.  But the JSkyNode software that Ray Plante mentions is no longer available.&lt;/li&gt;&lt;/ul&gt;For actually building the database, Roy Williams suggested &lt;a class="moz-txt-link-freetext" href="http://amwdb.u-strasbg.fr/saada/"&gt;http://amwdb.u-strasbg.fr/saada/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-3833837504370789304?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/3833837504370789304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=3833837504370789304' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3833837504370789304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3833837504370789304'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/10/nvo-summary.html' title='NVO Summary'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2928306291561237819</id><published>2007-10-02T07:46:00.000-07:00</published><updated>2007-10-02T07:49:57.978-07:00</updated><title type='text'>Better TeraGrid Single Sign On</title><content type='html'>Through the invisible hand of market forces, the world inevitably becomes optimized over time.  Witness &lt;a href="http://www.teragrid.org/userinfo/access/tgsso_native.php"&gt;http://www.teragrid.org/userinfo/access/tgsso_native.php.&lt;/a&gt;   This supersedes my earlier post, &lt;a href="http://communitygrids.blogspot.com/2007/06/teragrid-single-sign-on.html"&gt;http://communitygrids.blogspot.com/2007/06/teragrid-single-sign-on.html.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2928306291561237819?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2928306291561237819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2928306291561237819' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2928306291561237819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2928306291561237819'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/10/better-teragrid-single-sign-on.html' title='Better TeraGrid Single Sign On'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-134561656634095861</id><published>2007-09-21T11:03:00.000-07:00</published><updated>2007-09-26T07:16:52.971-07:00</updated><title type='text'>Quote</title><content type='html'>"ALL men of whatsoever quality they be, who have done anything of     excellence, or which may properly resemble excellence, ought, if     they are persons of truth and honesty, to describe their life with     their own hand; but they ought not to attempt so fine an enterprise     till they have passed the age of forty."&lt;br /&gt;&lt;br /&gt;Benvenuto Cellini, one of Tom Sawyer's favorite authors,  from Cellini's &lt;a href="http://www.gutenberg.org/dirs/etext03/7clln10h.htm"&gt;autobiography&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-134561656634095861?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/134561656634095861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=134561656634095861' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/134561656634095861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/134561656634095861'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/09/all-men-of-whatsoever-quality-they-be.html' title='Quote'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-3322734033235916815</id><published>2007-09-18T14:14:00.001-07:00</published><updated>2007-09-18T14:16:36.101-07:00</updated><title type='text'>Windows Vista, Sockets, Java NIO, and TIME_WAIT</title><content type='html'>Blogging on behalf of &lt;a href="http://www.naradabrokering.org"&gt;Shrideep Pallickara&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre wrap=""&gt;When you are working with NIO sockets on Microsoft Vista you may run into a&lt;br /&gt;problem where you will sometimes be able to connect to a specific host/port&lt;br /&gt;combination, and sometimes the following error related to a bind exception&lt;br /&gt;would be thrown:&lt;br /&gt;java.net.SocketException: Invalid argument: sun.nio.ch.Net.setIntOption&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The reason this happens is that when a connection is closed it goes into a&lt;br /&gt;TIME_WAIT state. This can be checked with a tool such as netstat. Sometimes,&lt;br /&gt;it can take up to a couple of minutes to get out of this state. When you try&lt;br /&gt;to establish connections to the same host/port combination at a later time&lt;br /&gt;you may not be able to establish this connection, because the previous&lt;br /&gt;connection is still in a timeout state.&lt;br /&gt;&lt;br /&gt;To get around this problem you need to configure your socket so that it can&lt;br /&gt;reuse addresses. With this fix you can bind a socket to the specified&lt;br /&gt;Address even if there is a connection in the timeout state that utilizes the&lt;br /&gt;socket's address or port.&lt;br /&gt;&lt;br /&gt;Please note that on the client side you will need to configure the setup&lt;br /&gt;BEFORE you bind the socket. The code below shows how you do this for NIO.&lt;br /&gt;You will need to wrap this code-fragment in the appropriate try-catch block.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  SocketChannel sc = SocketChannel.open();&lt;br /&gt;  sc.socket().setReuseAddress(true);&lt;br /&gt;  sc.socket().setKeepAlive(true);&lt;br /&gt;  sc.configureBlocking(false);&lt;br /&gt; &lt;br /&gt;  InetSocketAddress ia = new InetSocketAddress(_hostName, _portNum);&lt;br /&gt;  sc.connect(ia);&lt;br /&gt;&lt;br /&gt;You will also need to do a similar configuration on the Server side of the&lt;br /&gt;socket as well.&lt;br /&gt;&lt;/pre&gt; &lt;span class="on" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-3322734033235916815?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/3322734033235916815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=3322734033235916815' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3322734033235916815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/3322734033235916815'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/09/windows-vista-sockets-java-nio-and.html' title='Windows Vista, Sockets, Java NIO, and TIME_WAIT'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-6722707770659135662</id><published>2007-09-12T09:16:00.000-07:00</published><updated>2007-09-12T09:24:05.197-07:00</updated><title type='text'>Restarting the ISCSI SAN</title><content type='html'>The ISCSI SAN periodically dies and the file systems become inaccessible.   Logwatch error symptoms can look like this:&lt;br /&gt;&lt;br /&gt;&lt;pre wrap=""&gt; --------------------- Kernel Begin ------------------------&lt;br /&gt;&lt;br /&gt;WARNING:  Kernel Errors Present&lt;br /&gt;   connection0:0: iscsi: detected conn error (1011) ...:  3 Time(s)&lt;br /&gt;  Buffer I/O error on device sdc1,  ...:  29 Time(s)&lt;br /&gt;  EXT2-fs error (device sdc1): e ...:  171 Time(s)&lt;br /&gt;  end_request: I/O error, dev sdc, sector ...:  2421 Time(s)&lt;br /&gt;  lost page write due to I/O error on sdc1 ...:  29 Time(s)&lt;br /&gt;  sd 3:0:0:0: SCSI error: return code = 0 ...:  2421 Time(s)&lt;br /&gt;  sd 3:0:0:0: SCSI error: return code ueu ...:  1 Time(s)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;To restart, follow these steps:&lt;br /&gt;&lt;br /&gt;1. Log into the local NavSphere Express web utility running on the SAN.&lt;br /&gt;2. Restart the SAN via NavSphere&lt;br /&gt;3. Reboot the Linux server that mounts the SAN.  If you don't want to reboot, try restarting the iscsi daemon and remounting the file system.  Use fdisk -l to make sure that the iscsi devices are visible.&lt;br /&gt;&lt;br /&gt;   services iscsi restart&lt;br /&gt;   fdisk -l&lt;br /&gt;   mount /my/iscsi/partition&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-6722707770659135662?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/6722707770659135662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=6722707770659135662' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6722707770659135662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/6722707770659135662'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/09/restarting-iscsi-san.html' title='Restarting the ISCSI SAN'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-970675920680655581</id><published>2007-08-09T18:53:00.000-07:00</published><updated>2007-08-14T08:39:43.918-07:00</updated><title type='text'>db4o and NFS problems</title><content type='html'>Strange unexpected errors running db4o on NFS file system.  Everything worked fine until a mysterious exception&lt;br /&gt;&lt;br /&gt;com.db4o.ext.DatabaseFileLockedException: Database locked: '/globalhome/gateway/queueservice3.db'&lt;br /&gt;       at com.db4o.internal.JDK_1_4.lockFile(Unknown Source)&lt;br /&gt;       at com.db4o.internal.Platform4.lockFile(Unknown Source)&lt;br /&gt;       at com.db4o.io.RandomAccessFileAdapter.&lt;init&gt;(Unknown Source)&lt;br /&gt;       at com.db4o.io.RandomAccessFileAdapter.open(Unknown Source)&lt;br /&gt;       at com.db4o.internal.IoAdaptedObjectContainer.open(Unknown Source)&lt;br /&gt;       at com.db4o.internal.IoAdaptedObjectContainer.&lt;init&gt;(Unknown Source)&lt;br /&gt;       at com.db4o.internal.ObjectContainerFactory.openObjectContainer(Unknown Source)&lt;br /&gt;       at com.db4o.Db4o.openFile(Unknown Source)&lt;br /&gt;       at com.db4o.Db4o.openFile(Unknown Source)&lt;br /&gt;       at org.apache.jsp.junk_jsp._jspService(junk_jsp.java:49)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This only happens on NFS directories.  Changing to a local directory, the same code works fine.&lt;/init&gt;&lt;/init&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-970675920680655581?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/970675920680655581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=970675920680655581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/970675920680655581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/970675920680655581'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/08/db4o-and-nfs-problems.html' title='db4o and NFS problems'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-1132441348501997751</id><published>2007-07-27T15:49:00.000-07:00</published><updated>2007-07-27T15:53:36.360-07:00</updated><title type='text'>Google Maps: EGeoXML</title><content type='html'>This is a wonderful little JS that allows you to work with KML files in your JavaScript code.  Also overcomes the rendering limits of KML, so you can show many more placemarks.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.econym.demon.co.uk/googlemaps/egeoxml.htm"&gt;http://www.econym.demon.co.uk/googlemaps/egeoxml.htm&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-1132441348501997751?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/1132441348501997751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=1132441348501997751' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1132441348501997751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1132441348501997751'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/07/google-maps-egeoxml.html' title='Google Maps: EGeoXML'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-1779535795311205661</id><published>2007-07-19T17:29:00.002-07:00</published><updated>2007-07-19T18:47:08.541-07:00</updated><title type='text'>Drupal Mac Install</title><content type='html'>I'm doing this in a unixie way rather than looking for Mac specific packages.&lt;br /&gt;&lt;br /&gt;0. sudo -H -u root /bin/bash&lt;br /&gt;&lt;br /&gt;1. Get Mysql and install.  Put this in /usr/local/msyql.  The mysql manual is pretty good, so I won't duplicate.  Make a db user ("drupaloompa")  and db as drupal tells you.&lt;br /&gt;&lt;br /&gt;2. Get Apache 2 and install. You'll need DSO support, so ./configure --enable-so. I wonder why they don't make this a default.  Anyway, Apache 2.2 gave an error:&lt;br /&gt;&lt;br /&gt;configure: error: Cannot use an external APR-util with the bundled APR&lt;br /&gt;&lt;br /&gt;I decided to punt and go back to Apache 2.0. This worked fine.  Probably I have another apache server pre-installed by Steve Jobs.  Looks so, so be be careful that your paths point to /usr/local/apache2.&lt;br /&gt;&lt;br /&gt;3. Get PHP 5.  Configure/make/make install had one variation:  ./configure failed unless I gave the full path to mysql, so I ran (in /usr/local/php-X.Y)&lt;br /&gt;&lt;br /&gt;./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Noticed an unusual problem with PHP's "make install": it looked for libs in&lt;br /&gt;&lt;br /&gt;/usr/local/mysql/lib/mysql/&lt;br /&gt;&lt;br /&gt;but my libs were in&lt;br /&gt;&lt;br /&gt;/usr/local/mysql/lib/&lt;br /&gt;&lt;br /&gt;I rectified this straighforwardly (it's late) but probably this is some ./configure issue.&lt;br /&gt;&lt;br /&gt;Checked php by creating a little file (phptest.php) with the line &amp;lt;? phpinfo() ?&amp;gt; in htdocs.  This worked/&lt;br /&gt;&lt;br /&gt;4. Copied drupal directory (after gnutarring) into htdocs.  Note you want to do this:&lt;br /&gt;&lt;br /&gt;  cp -r /path/to/drupal-5.1/* /usr/local/apache/htdocs&lt;br /&gt;&lt;br /&gt;You don't want the directory /usr/local/apache/htdocs/drupal-5.1.  For some reason, my PHP files did not get parsed in this directory, but everything worked fine when I moved things to the top level htdocs directory.&lt;br /&gt;&lt;br /&gt;5. Start apache and point to http://localhost/index.php.  You will see a complaint about write access to settings.php.  Do this:&lt;br /&gt;&lt;br /&gt;   chmod a+w sites/default/settings.php&lt;br /&gt;&lt;br /&gt;Run this, use your Mysql user account and password, and you are good.  Remove write permissions on settings.php.&lt;br /&gt;&lt;br /&gt;   chmod a-w sites/default/settings.php&lt;br /&gt;&lt;br /&gt;Point your browser to http://localhost/index.php again and get going.  Note that you will need to clear your browser cache if you loaded any Apache pages.  Use shift-reload or just quit the browser and start a new one.  In any case, http://localhost/ should show the index.php pages, not "It works" or any Apache feathers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-1779535795311205661?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/1779535795311205661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=1779535795311205661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1779535795311205661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/1779535795311205661'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/07/drupal-mac-install.html' title='Drupal Mac Install'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19457310.post-2561760918223578705</id><published>2007-07-11T14:57:00.000-07:00</published><updated>2007-07-11T15:16:36.006-07:00</updated><title type='text'>Some condor problems and solutions</title><content type='html'>As in my previous post, here were some problems I encountered along the way to getting condor installed on a set of lab PCs running linux with no shared file systems and no DNS.&lt;br /&gt;&lt;br /&gt;* Condor complains about missing libstdc++.so.5: install the compatibility patch for your OS.  See earlier post.&lt;br /&gt;&lt;br /&gt;* You get something like&lt;br /&gt;&lt;br /&gt;Failed to start non-blocking update to &lt;&lt;a rel="nofollow" href="http://10.237.226.81:9618/"&gt;10.237.226.81:9618&lt;/a&gt;&gt;.&lt;br /&gt;attempt to connect to &lt;&lt;a rel="nofollow" href="http://10.237.226.81:9618/"&gt;10.237.226.81:9618 &lt;/a&gt;&gt; failed: Connection refused (connect errno = 111).&lt;br /&gt;ERROR: SECMAN:2003:TCP connection to &lt;&lt;a rel="nofollow" href="http://10.237.226.81:9618/"&gt;10.237.226.81:9618&lt;/a&gt;&gt; failed&lt;br /&gt;&lt;br /&gt;This probably means you have not set HOSTALLOW_READ and HOSTALLOW_WRITE correctly.  Use the IP addresses you want to connect as the values.  Also be sure you have enabled the NO_DNS and DEFAULT_DOMAIN_NAME parameters in your condor_config file.&lt;br /&gt;&lt;br /&gt;* Jobs seem stuck in "idle".  This could just mean that condor is really being unobtrusive.  Try changing the START, SUSPEND, etc attributes in condor_config (see previous post and link).&lt;br /&gt;&lt;br /&gt;* Jobs only run on the machine they are submitted from.  Try adding&lt;br /&gt;&lt;br /&gt;should_transfer_files=YES&lt;br /&gt;when_to_transfer_output=ON_EXIT&lt;br /&gt;&lt;br /&gt;to your job submission script.&lt;br /&gt;&lt;br /&gt;* Need some general debugging help: here is a nice little link&lt;br /&gt;&lt;a href="http://www.cs.wisc.edu/condor/CondorWeek2004/presentations/adesmet_admin_tutorial/#DebuggingJobs"&gt;http://www.cs.wisc.edu/condor/CondorWeek2004/presentations/adesmet_admin_tutorial/#DebuggingJobs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In short, look at the log files in /home/condor/log.  Here are some useful commands:&lt;br /&gt;&lt;br /&gt;1. condor_q -better-analyze&lt;br /&gt;2. condor_q -long&lt;br /&gt;3. condor_status -long&lt;br /&gt;&lt;br /&gt;#1 will tell you why your job is failing to get matched.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19457310-2561760918223578705?l=communitygrids.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://communitygrids.blogspot.com/feeds/2561760918223578705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19457310&amp;postID=2561760918223578705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2561760918223578705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19457310/posts/default/2561760918223578705'/><link rel='alternate' type='text/html' href='http://communitygrids.blogspot.com/2007/07/some-condor-problems-and-solutions.html' title='Some condor problems and solutions'/><author><name>Marlon Pierce</name><uri>http://www.blogger.com/profile/11646814516542136925</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://www.servogrid.org/slide/iSERVO/Photos/TheGlassesComeOff.jpg'/></author><thr:total>0</thr:total></entry></feed>
