All 6 entries tagged Web Development

View all 10 entries tagged Web Development on Warwick Blogs | View entries tagged Web Development at Technorati | There are no images tagged Web Development on this blog

October 14, 2010

Start.Warwick

Writing about web page https://start.warwick.ac.uk/

Portal has always been a dirty word in web development. Many people remember the late 90s and the early 2000s, where “portal” referred to a website such as Excite, Lycos and Hotbot. They didn’t provide any intrinsic value of their own, they were just wrappers for a search page that had lots of advertising.

hotbot lycos excite

So when I was tasked with building a “Personalised Information Portal” for staff and students at the University, I was sceptical – it’s the natural progression of every web developer that they will eventually be asked by their employer to build a “portal” for something or other. At Warwick, I think there is actually a lot of scope for pulling together a lot of the services that we provide into a single place, particularly with the anecdotal evidence we have that a lot of students simply don’t know about a lot of the services that are available to them. In that sense, building a portal that was little more than a directory of all of our other services still had some intrinsic value.

In the end, we settled on something remarkably similar to iGoogle in terms of usability. Each window to another application is actually a “gadget”, which are organised in columns on a number of “tabs”. This is a similar model to that used by other University institutions who have tried something like this, such as myHome at Ithaca (http://www.ithaca.edu/myhome/) and go.edgehill.ac.uk.

myhome ithaca go.edgehill.ac.uk

The magic comes from a standard called OpenSocial, originally developed by Google and implemented by LinkedIn, MySpace etc. (but not Facebook). This has a specification for rendering gadgets for users, while also provided the features to potentially build the base of social networking – though it should be noted that we aren’t using any of the social features in Start.Warwick at the moment.

Once we had a gadget container up and running, the real trick was building gadgets for a lot of IT Services (and non-IT Services) applications so that users can add them to their pages. This is deceptively simple to start doing, but difficult to take to completion! Each gadget is a mini-application in itself, and as such has to go through the same strenuous process of design, implementation, testing, review, etc. of a period of multiple iterations. We’ve built around 25 of these gadgets, plus a few more that didn’t make it into the final cut, for everything from the weather to your email inbox.

At the moment, with the gadgets that we’ve been able to provide, we’ve targeted undergraduate students. This was a simple decision based on the fact that we unfortunately can’t get Microsoft Exchange information for users on our staff email system at the moment, but, with the student move to live@edu, we are able to provide users with a view of their email, calendar and TODO list.

If you want to start using Start.Warwick, you can do so today, whether you’re an undergraduate student or not (even if you’re an alumnus!). Just go to http://start.warwick.ac.uk/ and sign in with your IT Services username and password. The first time you visit, it’ll take us a little while to generate a page based on who you are (around 10 seconds) but after that, you can customise the page any way you want.

We’ve created some introductory videos to get you started, these are at http://go.warwick.ac.uk/starthelp/videos


September 14, 2009

Using subsample averaging instead of scaling in JAI to get better results

I was looking over this press release about using parallel computing with Xboxes this morning and was struck by just how rubbish the resized images look in it. We use JAI to do image resizing in pure Java in our CMS, and obviously it’s not coming out very well. We’re turning a high quality source image into a very low quality thumbnail.

I tried fiddling with the interpolation on our operation, from Bilinear to Bicubic or Nearest-Neighbour but nothing seemed to make a noticable difference. In the end, however, I stumbled upon this which suggested using Subsample Averaging instead of Scaling as the operation in JAI. Success!


// We have sourceSS, a SeekableStream, and an OutputStream, out

// Load the image from a source stream
RenderedOp source = JAI.create("stream", sourceSS);

// scale the image
float width = source.getWidth();
float height = source.getHeight();

// assume no resizing at first
double scale = 1;

// if the image is too wide, scale down
if (shouldResizeWidth(source, maxWidth)) {
    scale = maxWidth / width;
}

// if the image is too hight, scale down
// IF that makes it smaller than maxWidth has done already
if (shouldResizeHeight(source, maxHeight)) {
    float heightScale = maxHeight / height;
    if (heightScale < scale) {
scale = heightScale;
    }
}

ParameterBlock params = new ParameterBlock();
params.addSource(source);
params.add(scale);// x scale factor
params.add(scale);// y scale factor
params.add(0.0F);// x translate
params.add(0.0F);// y translate

Map<RenderingHints.Key, Object> map = Maps.newHashMap();
map.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
map.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
map.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
map.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

RenderingHints hints = new RenderingHints(map);

params.add(interpolation);

// Here's the important bit - use "SubsampleAverage" instead of "scale" 
RenderedOp alteredImage = JAI.create("SubsampleAverage", params, hints);

ImageEncoder encoder;

switch (fileType) {
    case gif:
    case jpg:
        // now re-encode
        JPEGEncodeParam jpegEncodeParam = new JPEGEncodeParam();
        jpegEncodeParam.setQuality(DEFAULT_SAMPLING_QUALITY);
        // who knows what all this could possibly mean ?
        jpegEncodeParam.setHorizontalSubsampling(0, 1);
        jpegEncodeParam.setHorizontalSubsampling(1, 2);
        jpegEncodeParam.setHorizontalSubsampling(2, 2);
        jpegEncodeParam.setVerticalSubsampling(0, 1);
        jpegEncodeParam.setVerticalSubsampling(1, 1);
        jpegEncodeParam.setVerticalSubsampling(2, 1);
        final int restartInterval = 64;
        jpegEncodeParam.setRestartInterval(restartInterval);

        // done messing with the image. Send the bytes to the
        // outputstream.
        encoder = ImageCodec.createImageEncoder("JPEG", out, jpegEncodeParam);

        break;
    case png:
        PNGEncodeParam.RGB pngEncodeParam = new PNGEncodeParam.RGB();
        encoder = ImageCodec.createImageEncoder("PNG", out, pngEncodeParam);
        break;
    default:
        throw new IllegalArgumentException("Unrecognised image");
}

PlanarImage planarImage = alteredImage.getRendering();
encoder.encode(planarImage);

The difference is actually pretty startling.

Resized using “scale” with bicubic interpolation Resized using “SubsampleAverage”

August 28, 2008

Hug a developer

Writing about web page http://develop-one.net/blog/2008/08/27/HugADeveloper.aspx

Note - most of these don't actually apply to working here


August 14, 2008

Sequence Diagrams: Does not compute

Do you understand what this means? Nope, I don't either. And I drew the thing, about half an hour ago.

Sequence diagram


July 28, 2008

Blogging as a web team

Writing about web page http://blogs.edgehill.ac.uk/webservices/2008/07/28/blogging-web-teams/trackback/

I was pushed onto Mike Nolan's post on the Edge Hill University Web Services blog by a colleague, and found it quite interesting to consider what it would be like to have a web team blog here. There are a few members of the web team who already blog about work-related things, albeit on personal blogs (and as a result entwined with all sorts of randomness):

If we had a single, over-arcing web development team blog then content would most likely include a selection from above - probably not everything (as that'd be a lot of stuff) but a lot of relevant posts. In this case, I guess we'd get quite a lot of good content on there, but would it actually be interesting to someone?

Mike also mentions that one of the main reasons for blogging as a web services team is to be able to "Communicate what you're doing":

One of the best uses of a blog is to talk about what you’re doing within the Web Services team. Informing colleagues of current projects, changes to sites, even reporting on problems that have happened to the website keeps them in the loop and it’s less likely to be a surprise at the end of the day. A blog can complement and support other methods of communication. Many IT Services (or Marketing, or Communications, or wherever-you-are) departments have a regular (if not necessarily frequent) newsletter and often blog posts can be adapted for use there.

At the moment we tend to communicate what we're doing on each separately for each of our main projects. For example, when we release new functionality in Warwick Blogs/Blogbuilder, we announce it on the Blogbuilder News blog, and for most other projects we tend to announce things on the forum that is set up for each. (Such as on the Sitebuilder forum)

I think we have explored ways of exposing new releases to users but it's difficult to find a balance between boring people and actually getting the information over to them. When we deploy new versions of Sitebuilder (the University's CMS system), for example, Chris tends to Twitter about it, but that only reaches two people outside the web team who (may or may not) care that a new version is being released. For very large changes, such as the new search interface that I blogged about, it gets mentioned on the University's Intranet and also in the IT Services newsletter that is sent to departments.

In this case, I'm not sure I agree with Mike that the usefulness of a blog is to keep users in the loop - although it is obviously useful to collate this kind of information into one place as it would allow those who care about it to subscribe to what we're doing. Since we have tagging in blogs it would seem sensible that some people would only want to subscribe to certain posts and that would seem easy enough with the current system. The way that using a blog would provide more functionality than, say, a news feed (which also allows tag filtering) is that it allows comments. On the Blogbuilder news blog this has allowed users to give feedback and bug reports directly, which can be helpful.

So, in theory, a web services blog seems like an excellent idea - but possibly with a few caveats. If the blog was neglected and forgotten about, what message does that send out to our users, that we're not interested in conversing with them anymore or that we're not doing anything? Also, you need to take into example occasions when this kind of thing can turn into a PR disaster. When Southampton re-launched their web presence, they posted a blog post announcing it and inviting comments from their users - most of the responses were negative and their scheduled downtime attracted a bit of stir on other institution's blogs.

Although I'd definitely be interested in contributing on a team-wide web services blog, there are a lot of pitfalls!


<about />

 

I’m a Web Developer in e-lab, part of IT Services at the University of Warwick.

<input type="search" />

<ol id="recentComments">

  • First commit was around 12 months ago, but there was a long period where it was put on the back burn… by Mathew Mannion on this entry
  • So, how long did it take?! by Phil Wilson on this entry
  • Hi Matthew, having a problem putting favourites into folders, it only seems to let me put them in on… by Rupert Elder on this entry
  • I wrote one entry in Chinese. It published the content as lots of questions marks. by Hongfeng Sun on this entry
  • I'm sure there's a setting somewhere that'd filter it out. by Nick on this entry

<ol id="archive">

Loading…

Am I still fat?

Not signed in
Sign in

Powered by BlogBuilder
© MMXVII