My Work Experience at FARM

Patrick Wright - Work Experience Guy

When I picked my work experience placement, I really wanted to find a place where I could enjoy what I was doing, learn more about website programming, and be in an environment where I felt comfortable. That was exactly what I found at FARM.

I’ve been working on content for several websites FARM have been developing for clients, including Treloars, Delfin Language School and The Dog and Cat Alliance. I feel like I have really been able to make a difference and been helpful to the company (I hope!).

Not only have I been working on pre-existing websites, but I have also been working on a website from scratch. FARM needed a website for the events they support within the tech community, so I have been working on that project as well.

This has been an interesting project to work on. Since I started designing it, I have developed my knowledge hugely. I have been using Bootstrap, a CSS framework used to quickly and effectively style a webpage, as well as another plugin called CSSSlider. CSSSlider is used to quickly create a fully functioning image slider with several options to customise the size, width and other properties of the image as well as choosing between different animations. I have also used a Javascript plugin to create a fully functioning contact form so users are able to email and comment on the website. This plugin also used PHP. All these tools combined with my previous knowledge have enabled me to be able to develop a relatively good looking website in a short amount of time.

I have had some difficulties on this project, but the people at FARM have been more than happy to help me out and thanks to them I have learnt a lot and got a really valuable experience from it. it has really helped me to understand what a workplace is like and how I will need to work in the future.

Over the past two weeks, I have learnt a lot about web development, and I have really enjoyed what I have been doing. The people I have been working with have all been fantastic, very friendly, and very willing to help me out and answer questions. I have been able to joke, chat and feel extremely comfortable around them. Everyone I have been working with have made it feel enjoyable and made me feel like a part of something.

Talk UX

Header Image

It’s safe to say the UX community is thriving in and around Manchester. Initiatives from Ladies that UX & Northern UX bring are at the forefront of this. Talk UX is the first foray into a conference by the team behind Ladies that UX. It's aim, to create an open space to meet, learn and collaborate within UX.

An image of Manchester Town Hall

The grandiose Manchester town hall was the venue for the days talks. With a lineup of speakers exploring every aspect of what it means to be a UX professional. Whether your a student, just working in the industry or on the fringes of UX. There was something for everyone.

An image of the Foyer

The Uncommon Denominator: Bloomberg for Mobile

By Yvonne Caravia

After some short introductions from compere Tim Mcavoy, Yvonne lead the first talk. Through various digital platforms Bloomberg delivers content through a powerful platform to financial professionals. 

The talk centered around the challenges of presenting data and the difficulties faced in providing access to content on mobile platforms. 

With a user averaging 1500 interactions with apps a month. The challenges of presenting complex information on mobile are clear.  The key point to take was not to treat mobile data as a special case. Rather than hiding information away, display in more effective ways on all platforms. For Bloomberg in particular the importance of “simplification without sacrifice’ is key. 

BBC – Cards for discovery

An image of the Meeting Hall

Cards as a UX component are becoming ever more prevalent. These blocks of information are used on Pinterest, Google maps and tinder. Cards are “portable snackable micro content” contained within small blocks.

These blocks of information are then shared amongst platforms. The BBC uses cards to serve content throughout their network. With over 2000 items of content produced every day at the BBC cards are a vital tool.

By making content portable, we can expand the reach of the information. The consistency, ease of scanning and portability makes cards ideal for use as components.

300 seconds lightning talks

When getting started with public speaking confidence can often be the biggest barrier. Taking those first steps into the conference scene speaking can be daunting.

300 seconds encourages new speakers to gain confidence in a friendly and supportive environment. This also has the side effect of allowing new speakers to talk about subjects that rarely get discussed

With just 300 seconds for each of the speakers. Topics ranged from the psychology of Twitter to how to achieve happiness through good design.

UX for Exponential Growth: Labour Party Case Study

by Molly Norris

Social media and effective digital platforms have become an essential tool in election campaigns.

Over 250 individuals formed the digital team for Barack Obama a vital asset in the leadup to the USA Presidential elections. One of the biggest social media teams involved in a campaign to date.

Molly explained the steps taken in using UX to mobilise a group of committed supporters. By creating personalised experiences, a small group of action obsessed individuals can be mobilised.

Digital afterlife

by Alberta Soranzo Slides

An image of the Meeting Hall

What becomes of our personal data after our death? Alberta tackled this difficult subject in one of the stranger talks on the schedule.

On average an individual has three social accounts (and usually several more). The difficult question of how to deal with this information after death remains. Facebook allows for the nomination of trustee to take ownership of an account. But for other social networks preserving a digital legacy isn't quite so simple.

Few solutions exist to deal with these situations. As our lives become ever more entwined with tech what should we do with our digital lives?

Designing for VR

By Laura Cortesn & Cyrièle Piancastelli Slides

I know little about VR, at Farm we’ve experimented with Google cardboard as a way of enhancing experiences on client projects.

Just scratching the surface of VR design the talk covered the challenges of developing for this new tech.

One of the biggest barriers to VR currently is the lack of a full immersive experience. VR provides a mostly passive experience, the next big frontier will come in bridging the gap between these passive and immersive experiences.

Designers: Guilty By Association

by Lauren Currie

As a keynote Laurens talk tackled the subject of design responsibility. How can we as UX designers make a meaningful change in the world?

Service design is nothing new, since the earliest days of brands design as a service has gained ever more importance.

We’ve all been guilty of it indulgent ideas, stylistic gestures and design for designs sake. But should we have a responsibility to tackle some of the bigger problems in society through design?

Lauren argued that designers have a responsibility to reformulate the role of design. And how through we can tackle social problems and real world issues.

Conclusion

The first TalkUX posed some interesting questions on the role of UX. One of only a few dedicated UX conferences it was great to meet some of the more passionate figures in the community.

If you’d like to learn more about the TalkUX conference you can follow the group on Twitter @talkux or http://www.talk-ux.com/

HTTPie

Sometimes you come across software which is so perfect, it immediately becomes part of your toolbox:

HTTPie (pronounced aych-tee-tee-pie) is a command line HTTP client. Its goal is to make CLI interaction with web services as human-friendly as possible. It provides a simple http command that allows for sending arbitrary HTTP requests using a simple and natural syntax, and displays colorized output. HTTPie can be used for testing, debugging, and generally interacting with HTTP servers.

HTTPie is really well designed. Like any good tool, it does what you expect 99% of the time. Combined with something to parse responses (or even piping to something like bcat), it makes testing forms and APIs really simple. I love it.

Restricting access to user-uploaded files in Django

As a core aspect of nearly every company website, the contact form is not something that would usually make us pause for thought here at FARM. However, we recently needed to include a file upload in a contact form, and to subsequently restrict access to those uploads to the site administrators. We thought we'd share a useful little bit of Django/nginx configuration to do just that.

First, the trick of hiding these files from the public. While it's possible to store these files out of the web root, you're then relying on Django alone serve the files. This is not ideal as it holds up the Python thread whilst the entire transfer occurs. This could provide a trivial way for a malicious user (or even just an unfortunate set of circumstances) to deny access to your site.

The solution then is creating an area in your media folder that's not directly web accessible.

Here's the simple way to do this with nginx. Inside your nginx configuration file:

location /media/protected/uploads/ {
    internal;
    root /srv/www/project/src/;
}

This would suffice fine if you never actually planned to view the submissions, but we require access to the files for site administrators via the admin interface.

So in the the app's urls.py, you need:

urlpatterns = patterns(
    ...,
    url(r'^(?P<filename>[^/]+)/$', 'file_serve', name='upload_file_serve'),
)

And the corresponding view in views.py:

def file_serve(request, filename):
    if request.user.is_superuser:
        response = HttpResponse()
        url = "/media/protected/" + filename
        response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(filename)
        length = os.path.getsize(MEDIA_ROOT + "media/protected/" + filename)
        response['Content-Length'] = str(length)
        response['X-Accel-Redirect'] = url
        return response
    else:
        return HttpResponseForbidden("Restricted Access")

The view uses Django's built-in security to handle all authentication matters and simply checks if the user is authenticated. If they're not they get served a 403. If they are authenticated, then it uses Nginx's X-Accel-Redirect header to pass them the file as a download. This could then easily be customised further to suggest rendering instead of saving depending the circumstances or anything else that you want to do here.

The final piece of the puzzle is simply rending the new url in the admin.

In the model in models.py:

class MyModel(models.Model):

    ...

    upload = models.FileField(upload_to='protected')

    ...

    def protected_file(self,):
        """
        Returns the url for the file using the view that ensures user is logged in
        """
        url = reverse('contact_file_serve', args=[os.path.basename(self.upload.file.name)])
        return format_html('<a href="'+url+'">File</a>')
        protected_file.short_description = 'Upload'

And in the admin.py:

class CareersApplicationAdmin(admin.ModelAdmin):
    readonly_fields = (..., 'protected_file')
    exclude = ('upload', )

A Python API wrapper for GatherContent.

We started to use GatherContent recently to help collate the content for some of our larger web projects.

While GatherContent is a useful tool in isolation, it's a lot more useful when you can integrate it with a CMS — to automatically populate content, or to quickly find content which is out-of-sync with the website.

We're writing a bridge between GatherContent and django-cms, which we're going to release soon, but we wanted to release our Python gathercontent package as soon as we could. This package takes care of communicating with the GatherContent API, and converting the responses into Python dictionaries to use however you want:

>>> from gathercontent import GatherContent
>>> gc = GatherContent(
        api_key="your-api-key-here", 
        account_name="your-account-name-here"
    )
>>> gc.get_page(id=1234)
{
    u 'page': {
        u 'due_date': u '0000-00-00 00:00:00',
        u 'name': u 'Example Page',
        u 'config': [{
            u 'hidden': False,
            u 'elements': [{
                u 'microcopy': u '',
                u 'name': u 'el1413970102668',
                u 'required': False,
                u 'plain_text': False,
                u 'value': u 'Some page content here.',
                u 'label': u 'Content',
                u 'limit': u '0',
                u 'limit_type': u 'words',
                u 'type': u 'text'
            }, {
                u 'microcopy': u '',
                u 'required': False,
                u 'type': u 'files',
                u 'name': u 'el1421147134096',
                u 'label': u 'This is a label.'
            }],
            u 'name': u 'tab1',
            u 'label': u 'Content'
        }, {
            u 'hidden': True,
            u 'elements': [],
            u 'name': u 'tab2',
            u 'label': u 'Meta'
        }],
        u 'created_at': u '2014-10-22 10:28:17',
        u 'updated_at': u '2015-01-14 15:00:07',
        u 'template_id': None,
        u 'parent_id': u '0',
        u 'custom_state_id': u '122947',
        u 'position': u '62',
        u 'project_id': u '34209',
        u 'type': u 'page',
        u 'id': u '1370975'
    },
    u 'success': True
}

Version 0.2 is available on PyPi, right now.

wearefarm / gathercontent