Back to home page

PeerPigeon Wraps Up

September 18th, 2007 by dem

So the PeerPigeon project has now finished. We started with the intention of providing a set of services for the e-framework that would support peer review (and in particular the challenge of moving resources between peers). In the end we have moved slightly away from a pure Service-Oriented Architecture, and have instead created a working system with REST interfaces.

Through Patrick and Daime’s hard work I think we have created something rather special. Over the next few months we intend to roll the system out and do some further soak testing, we also need to create a larger set of review patterns. I also intend to move the current demo to a more permanent public home that people can actually use to support their own peer review processes and produce some tutorials to help people use the site.

Patrick and Daime have now left the project, so if you have any questions then please contact me, Dave Millard (dem@ecs.soton.ac.uk).

Getting started with PeerPigeon

September 5th, 2007 by pass

With PeerPigeon coming to an end, we want to make sure that all of the relevant material is available to anyone interested in the project.

We have an alpha version of the system running on a server in our department, available at:

http://droopy.ecs.soton.ac.uk/peerpigeon

(note: this might not be publicly accessible at the moment, we are working to fix this.)

The source code is available on the PeerPigeon UGForge site, and here are some links to some useful stuff on the site:

Peer Pigeon REST Services: a look under the hood

August 30th, 2007 by pass

A while ago we discussed what our RESTful PeerPigeon services looked like, and promised an “under the hood” look at the code driving the services.

This is the Participations Controller class in the Peer Pigeon application. In Ruby on Rails, controllers contain the program logic that builds the data that will then be rendered and sent back to the client.

class ParticipationsController < ApplicationController
  before_filter :login_required 

  # GET /participations
  # GET /participations.xml
  def index
    @current_person = current_person
    @reviews = Participation.find_by_participants(@current_person) 

    respond_to do |format|
      format.html
      format.xml  { render :xml => @reviews.to_xml({...}) }
    end
  end 

  ... 

end

This snippet of code drives the display of the reviews the user is participating in, as shown in the screenshot.

When a request is made to the /participations URL, Rails will execute the index method in the participations controller. (Note the before_filter :login_required, which means that the person needs to be logged into the system to view the page). The first step is to obtain the information necessary to render the page, such as the current person and the reviews they are participating in.

Rails then has the fantastic respond_to feature: the controller will respond according to the format requested, i.e. /partipations (html) or /partipations.xml (xml).

The default is format.html, which just renders the content using the default view, while format.xml generates the XML that is then returned to the browser. As the Rails API Documentation says: “if the client wants HTML in response to this action, just respond as we would have before, but if the client wants XML, return them the list of participations in XML format.”

Obviously this is just a very brief overview of REST in Rails. For more information, I strongly recommend watching the excellent PeepCode RESTful Rails tutorial. It costs $9 but it’s worth every penny!

Exposing RESTful Peer Pigeon Services

August 8th, 2007 by pass

We have continued developing the Peer Pigeon web application using Ruby on Rails, and are making good progress on the web interface side of things. We are now looking at exposing the Peer Pigeon functionality through RESTful web services.

So how are we going about this, and what will it look like for someone wanting to write an application interfacing with Peer Pigeon?

Let’s take at how the web interface looks like to students participating in a review. This is the participation page (screen shot) they view to see the actions they need to take on the current review. It appears that they have a paper to write, and when they click on the link to submit their paper they are taken to the artefact submission page (screen shot). In this case they can either write their paper in the text box provided or submit an actual document file. When they submit their paper they are taken back to the participation page where they can view or download their document, and also resubmit if they choose to do so.

So how can we make this interaction RESTful?

The beauty of using Ruby on Rails is that we’re already three quarters of the way there!

By making an HTTP get request to the participations URL but appending an ‘.xml’ (i.e. /participations.xml rather than /participations) to it we get back an XML formatted view of the data (screen shot).

This is the XML for the particular action we’re interested in:

<cycle>
  <name>paper</name>
  <description>Write Paper</description>
  <start type="datetime">2007-08-08T09:05:00+01:00</start>
  <end type="datetime">2007-08-08T10:05:00+01:00</end>
  <tolerance type="datetime">2007-08-08T10:06:00+01:00</tolerance>
  <actions>
    <action>
      <prerequisites>
      </prerequisites>
      <artefact>
        <label>paper_one</label>
        <permalink>16f433e98</permalink>
      </artefact>
    </action>
  </actions>
</cycle>

We can also submit the artefact through the RESTful interface, for example using the cURL tool (Windows users will have to download cURL). Running this command will submit the document defined in the XML snippet as a new attachment for the artefact 134d39657.

curl -u one:pass -i -H 'Content-Type: application/xml' 
  -d '<attachment><attachment-format-name>Text</attachment-format-name><data>My paper...</data></attachment>' 
  http://localhost:3000/participations/1/artefacts/134d39657/attachments.xml

But how does this work under the hood? We will describe a brief overview of the Ruby on Rails REST functionality, together with pointers to useful resources, in a separate blog post shortly.

PeerPigeon at ICALT

July 27th, 2007 by dem

I have returned from ICALT where I presented our PeerPigeon paper on the processes behind Peer Review.  The presentation is on our main website.

I have blogged about my experience at ICALT elsewhere. But as far as PeerPigeon was concerned the conference has been a success, in the presentation I was able to expand on the paper slightly and include some material on how we had encoded the peer review stages as cycles in Ruby DSL.

Although there were some questions asked about the encoding of the review patterns (which was after all the topic of our paper) - the main interest was in the system itself, with many people speaking to me afterwards as practitioners who would love to have access to a system like PeerPigeon. This has helped to persuade me that we have been right to extend our scope slightly and try and provide a runnable system, rather than just services that might be used to build one.

Alpha release of PeerPigeon

July 4th, 2007 by pass

We are happy to announce an early release of the PeerPigeon web application. It is available on the PeerPigeon UGForge site.

This is the basic PeerPigeon web application, which allows allows tutors to perform peer review exercises that are defined in a peer review pattern language.

We are now working on integrating the system with our internal student records data service, in the form of an optional plug-in, that other institutions can then adapt to use with their own records systems. We are also intending to develop an external application based around the RESTful web services that would demonstrate the practicality of building applications upon the PeerPigeon services.

This is a very basic of the system, so there is a lot of work to be done to the documentation, installation instructions and so on. Please contact Patrick Sinclair for any questions regarding this release.

PeerPigeon on Rails

June 7th, 2007 by pass

We’ve been busy developing the PeerPigeon system using Ruby on Rails.

Things are running smoothly and we’ve deployed a publicly accessible version of the system as part of our preparation of the JISC peer review that’s happening over the next few days.

There are some screenshots available:

It’s still a very early version of the system, and it’s a little rough around the edges. If you want to try it out, contact Patrick Sinclair and we’ll give you details on how to access the system.

Thoughts on managing work submission

May 17th, 2007 by pass

As we’ve described in previous posts (see this post for more details), we’re splitting up the peer review process into a number of cycles, e.g. write paper, review paper and so on.

We’ve started thinking on how to manage the duration of the different cycles, in particular how the end of a cycle should be handled.

Typically in a coursework hand-in system a deadline will be specified but people will be able to submit work after the deadline has passed, although they might incur a penalty. For example, imagine there was a deadline for Friday evening at 5.00pm and a student hands their work in at 5.02pm - it would be tremendously unfair to simply refuse their work!

The issue with our system is that most of the work submitted must then be sent onto another participant in the review process. Although we still want to accept work handed in late, there must be a cut-off point otherwise it will be unfair to the person that needs to act on the submitted work.

We discussed diverse approaches for handling this, but decided to simply come up with this simple approach for each cycle:

   |--------------------------|------------------------------|
(start)  should hand in  (deadline)  can still hand in  (tolerance)
  • Each cycle will have a start, a deadline and a tolerance time stamp.
  • Between the start and the deadline times, people will submit their work and it will be stored in the system.
  • At the deadline time, the system will take all of the currently stored work and distribute it according to the cycle’s distribution pattern (see this post for more details).
  • Between the deadline and the tolerance times, when a user submits their work it will be distributed immediately to the appropriate participants.
  • After the tolerance time, no further work will be accepted.

In this way, well-behaved participants will be able to submit their work to the system as before and it will be held until the convenient time. However, if work is late it is distributed immediately to minimize the inconvenience caused to the participant performing an action on the work (e.g. a reviewer of a paper).

Modifications to Website

May 10th, 2007 by dos

This week we updated the peerpigeon project website.  New links were added to make navigation between pages clearer.  There is now a link to the UGForge repository, as well as a link to the XMarks project on the blog.   These updates tie in with the suggestions given at the JISC Peer Review Workshop at Bolton.

Peer Review Pattern in a Ruby DSL: Distributing artefacts

April 24th, 2007 by pass

In my last post I described how we are using a Ruby DSL for describing review patterns in PeerPigeon. However, we need to record how each artefact gets distributed between the review participants.

We’ve decided to record this using the notion of transforms: at each review cycle, a participant takes an existing artefact and produces a new artefact based on the existing one. For example, a reviewer takes a paper and transforms it into a review.

In our Ruby DSL, this might look like this:

    c.transform :paper_1, 2, :review_1

We define a transform in the cycle, where :paper_1 is transformed into :review_1 by participant 2.

For the simple review scenario from my previous post, each reviewer reviews someone else’s paper. The easiest way to model this is to simply pass each paper along to the next person, for example in a group with person 1, 2 and 3:

  • 1’s paper is reviewed by 2
  • 2’s paper is reviewed by 3
  • 3’s paper is reviewed by 1

In our Ruby DSL:

  cycle :review do |c|
    c.description 'Write Review'
    c.deadline '2 days from now','4 days from now'

    c.transform :paper_1, 2, :review_1
    c.transform :paper_2, 3, :review_2
    c.transform :paper_3, 1, :review_3
  end

In our experiments we have seen that this simple mechanism copes with a range of different peer review scenarios. So we will use it to model the distribution of material between participants in the PeerPigeon system.

However, it is crucial that these transform lists do not have to be manually generated. If we now wanted to run this simple review on a group of 100 people instead of 3, we would have to write 100 transforms! So we must have a way of describing these distributions programatically.

Luckily as we are working with a Ruby DSL, we can define a block of Ruby code to do this:


    c.distribution :reviewers, lambda { |group,person|
      c.transform
		group.wrap('paper', person, -1),
		person,
		group.wrap('review', person, +1)
    }

This defines a distribution pattern in the cycle that is applied to the reviewers (:reviewers). The distribution code block takes a group and a person as an argument, and is run on each each reviewer in the group. For each reviewer, you create a transform as before. The input/output of the transform (e.g. :paper_1, :review_1) is calculated using the group.wrap method with either the next (+1) or previous person in the group (-1). For example, in a group [1,2,3], calling group.wrap('paper', 1, -1) will return :paper_1.

Using this technique we can apply the review pattern to an any sized group. We can also define more complex distribution patterns in Ruby code. However, it may be possible to tweak the Ruby DSL to provide a cleaner syntax for these.