ux scrutiny

ramblings about code and ux

August 16, 2014
by ktnode
1 Comment

flock 2014

I recently got back from my trip to Flock, held in Prague, Czech Republic. This is the first Fedora conference I’ve attended and, while the memories are still somewhat fresh in my mind, I thought I’d jot down some of my thoughts & reflections about the event.

I arrived the night before the conference and was pleasantly surprised to find that getting to the conference venue was pretty easy. Prague’s public transit system is extremely convenient – the metro, bus, and tram system are all integrated and tickets are very affordable. Buses from the airport run frequently, so catching a bus wasn’t a problem. The conference hotel (Hotel Diplomat) was literally steps away from the bus stop. The conference venue was a short walk from the hotel and the weather was perfect while we were there. You really can’t ask for too much more from a conference venue!

My Flock talk (on user experience, aka UX) was scheduled in the afternoon on the first day and I ended up spending much of the time prior to my session prepping my slides and rehearsing my talk. I was a bit nervous giving this talk. While I can certainly talk hours on end about UX, I still consider myself a newbie to the FOSS community and was unsure if my talk would be relevant and/or interesting to others. In my very short time as a FOSS contributor so far, I sometimes felt that folks may rush through UX stuff in order to get to the development part of the project. I also sometimes got the feeling that folks may think of UX very narrowly. (I should note that I’ve observed these issues outside of FOSS too!) Based on those two observations, I thought it might be interesting to focus my talk on breadth – to give folks a sense of how broad the UX process can be and that there are actually lots of design methods & usability tests that can be done. Of course, how relevant each of the methods are and which tests one should use will depend on the specific project. But hopefully the talk gave folks a general idea that the UX toolbox is in fact very large and to use a particular UX tool, you don’t have to be a rocket scientist. Many of the methods are actually quite approachable and easy to conduct, especially given with the right guidance/example to follow.

Overall, I think the talk went well. The room was much more crowded than I expected. At the time, I found that a bit nerve-wracking (are all these people really interested in my talk??), but in thinking back, I think it’s a good sign – it shows that there are FOSS folks who appreciate UX, are curious about it, and/or want to learn more about it. Any combination of the above is a win from my point of view. I think, if I had a chance to do another UX talk, I’d considering use a case-study approach. For example, what is project N doing in terms of UX and what is (or isn’t) working for them? Or perhaps doing a critique of a project’s UX – not just the user-facing UX aspects, but also a critique of the project’s overall UX process (i.e., how they handle UX issues/concerns).

I got a lot of good questions in the Q&A of my talk as well. Lots of folks had questions about what users can do to help with the usability process. I think it’s great that project contributors are thinking about this issue. One good suggestion from the audience was to create templates for bug reports for UX-related issues. I definitely think this would be a great start to standardizing how UX issues are reported and standardization can be particularly useful when projects are trying to learn from each other about how to solve usability problems. I have a few ideas for what this template might look like and it would be interesting to try it out on a small project first to see how effective it might be.

For those that are interested in watching the talk, you can catch the video on Flock’s YouTube channel. In fact, all of the conference’s talk are posted so browse and listen to your heart’s content! I’d like to give a quick shout-out to Mo, who I heard did a fantastic job of transcribing my talk (live!) on irc. I unfortunately can’t find the log for the irc channel, but I definitely appreciate the effort, especially since I know I tend to talk fast in my presentations!

Other sessions that I attended included:

  • Marie’s talk on Fedora Badges: I’m a big fan of her illustrations and all the different badges she’s contributed. I also think her style guide is a huge win for the community. As a relative newcomer to the FOSS community, I’m always thinking about how to make things more approachable for first-time contributors and having a style guide makes it much more understandable for folks who are new to the badge design process. I’m hoping to try my hand at creating a badge or two soon!
  • The keynote talk on open hardware: It was interesting to hear the genesis story of how Kosagi started out and to see how far they’ve come along. I’m excited to see how the Novena open computing platform shapes up. Yes, the hardware looks a bit pricey, but hopefully the quality (both in terms of openness and performance) will make it worth it. I heard folks were trying to install Fedora on the Novena soon after the conference – I’m wondering how that turned out?
  • Aurelien’s Hyperkitty workshop: Having worked on Hyperkitty, I was looking forward to this workshop. It was a smaller group than I anticipated, but we were able to walk through the install process with a couple of users and, in doing so, uncovered some interesting issues. I was also able to use the time to work with a fellow designer and run a mini-heuristic evaluation session with him. I got lots of really useful feedback from him that I hope to write up soon. I’m hoping that at least some of the usability issues he uncovered can be fixed either in the next version.

I attended several other sessions (including a few on Fedora.next, one on security, and another on boot loaders). To be honest, I often found a lot of the details in these sessions going over my head, but it’s nice to get exposed to new topics, even if it does take me a bit longer to digest the material.

As with all conferences, I think the best parts happen outside the sessions and especially with meeting other attendees. Flock introduced me to a lot of new folks in the Fedora community. I feel very fortunate to have been given an opportunity to talk at the conference. As a newcomer, giving a talk was a great way to break the ice with others and find others with similar interests. For example, I was able to meet previous OPW alum (like Marie) and I also met a bunch of FOSS designers (like Sirko, Sarup, Garrett, and many others!). And of course, conferences are also great for serendipitous meetings too. One evening I had dinner with some very seasoned Red Hat folks and felt lucky to be in their company. It’s clear there’s a great sense of community in Fedora and I absolutely love how approachable and down-to-earth everyone is. The conference organizers (Ruth, Tom, Josh, Miro) did a wonderful job putting together some wonderful social events too. I especially liked the boat party. The views from the river were fantastic and it was a great venue to mingle & chat with others.

Attending Flock has refueled my enthusiasm about Fedora. I’m excited to be able to count myself as a part to this community and am looking forward to making many more contributions soon!

March 19, 2014
by ktnode
1 Comment

404 and 500 errors in django

Problem: Server Error 500. In the server log, all it mentions is a line that looks something like

"GET / HTTP/1.1" 500 27

Potential fix: There are two potential reasons for this error.

  • Ensure that ALLOWED_HOSTS is configured properly in the settings file. In the default settings file, there’s a line for ALLOWED_HOSTS=[]. In my case, I was deploying things locally, so I edited this line to be ALLOWED_HOSTS=['127.0.01','localhost']. If you’re deploying things on a specific domain, list that here. Others have suggested using ALLOWED_HOSTS=['*'], but this setting should really only be used for testing deployments, as it’s not a secure setting for production deployment scenarios.
  • Create a template for 500 errors. Note that the docs recommend you create a template that is very simple because you can never know for sure why the error was generated. In other words, you can’t rely on something that might potentially be broken; that’s why the sample one mentioned in the docs doesn’t do anything fancy and doesn’t use any template inheritance.

One quick note about creating a 500-error template: in my case, I wanted my 500 page, like my 404 page, to fit in with the same look & feel as the rest of the site. This meant utilizing template inheritance (i.e., {% extends "base.html" %}). Now, even though the docs say this is no-no, it ended up working out OK. At first, I ran into this error message:

OfflineGenerationError: You have offline compression enabled but key "SOMEKEYHERE" is missing from offline manifest. You may need to run "python manage.py compress"

Following the suggestion made here, I got things working again by using a custom class-based view. [Side note: it looks like offline generation loads the manifest once, and then remembers the result so that it doesn't have to refetch it on every request. What this means is that once I got offline compression working (by using the custom class-based view), it's possible to remove the code for the custom view (i.e., the calls in url.py and the class handler500.py) and things would still work out OK. Nonetheless, it's probably best to just keep the code there.]

Problem: You’d like to see what your 404/500 error pages look like when DEBUG=FALSE
Potential fix: One easy hack to ‘trigger’ django to show 404/500 pages is to add the routes to your `url.py`:

from django.views.generic.base import TemplateView
if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^500/$', TemplateView.as_view(template_name="404.html")),
        (r'^404/$', TemplateView.as_view(template_name="404.html")),

If you want to see django’s default 500 error page, you can use this instead:

from django.views.defaults import server_error as server_error_view
if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^500/$', server_error_view),

Now you can just navigate to /500/ or /404/ to see the respective error pages.

March 16, 2014
by ktnode

getting DEBUG=FALSE to work correctly

Problem: Static resources (images, js, css, etc.) lead to 404 errors.
Potential fix: A similar question was posted here and here. This is actually by design, as django is not meant to server static resources when DEBUG=False.

Basically, when you’re in DEBUG mode, static files are being served via the staticfiles app (which uses settings like STATICFILES_DIRS and STATICFILES_FINDERS to properly locate your static resources). When DEBUG=FALSE, the staticfiles app doesn’t run and your static resources aren’t being referenced correctly by the django webserver. However, if you were to host the files are an actual webserver, the STATIC_URL settings should hold up.

There is a way to force the staticfiles app to run in DEBUG=FALSE mode though, which can be useful when you want to test a deployment locally with django. You just have to add an --insecure flag when you run the django webserver:

django-admin.py runserver --insecure

As noted here, the --insecure option should only be used for testing purposes.

March 15, 2014
by ktnode

django + less, updated

In a previous post, I described how I configured the hyperkitty django project to use LESS. Briefly, my steps were:
- install django-compressor, django-less, nodejs, npm, and lessc
- update settings.py with configuration settings for django-compressor and django-less
- restart webserver

However, it turns out some of those steps are a bit outdated. First, PyPI says that django-less is not maintained and suggests using django-static-precompiler instead. Second, while LESS suggests that the easiest way to install the compiler is via npm, it is just as easy to install the LESS compiler via nodejs-less. So here are my updated steps for configuring a django project to use LESS:

pip install django-compressor
pip install django-static-precompiler
sudo yum install nodejs-less # installs lessc

I also realized that my settings.py needed to be updated too. I was previously using DEBUG=TRUE and, under that case, everything worked fine. But when I switched over to DEBUG=FALSE, I noticed a few extra settings needed to be added. So, for the sake of completeness, here are all the changes I made to settings for the hyperkitty project.

  • Add settings to INSTALLED_APPS:
    # other apps..
  • Add settings for django-static-precompiler (more details here):
    # other finders..
  • Add these settings for django-compressor settings (more details here and here):
    # other finders..
    ('text/less', 'lessc {infile} {outfile}'),
    INTERNAL_IPS = ('',) # enables local compiling
    COMPRESS_ENABLED = True # defaults to opposite of DEBUG
    COMPRESS_OFFLINE = True # allow pre-compression of files

February 23, 2014
by ktnode
1 Comment

list overview: other potential features?

I’m wondering if there are other worthwhile personalization features that could be added to the list overview page? For example, I’ve added personalized groups of discussions (bookmarked discussions, discussion you’ve posted to), which contrasts with the general groups of discussions (most recent discussions, most active discussions, etc.). Could we do something similar with the section for list stats? Right now, there’s only general list stats – overall posting frequencies and a leader board of the top posters. Would it be meaningful to add personalized stats? Some ideas I had for this might be:

  • timestamp of when you subscribed to the list
  • timestamp of the last message you posted to that list
  • number of messages you’ve posted to the list
  • number of people who’ve bookmarked/following your discussion/posts
  • average votes for the posts you’ve contributed for that list

What do you think – would you be interested in seeing these personalized list stats? What other personal list stats might be helpful and/or meaningful to add?

Speaking of list stats, I’m also wondering how useful the general stats are, as they are currently designed. Specifically, the chart showing the posting frequency for the last 30 days is definitely informative in that it shows short-term trends. For example, perhaps a big milestone/release is coming up, so you’ll see a big spike in the chart because more people are posting messages. However, long-term trends are not really evident in the current design.

Given that, I’m wondering whether if it would be meaningful to add details like:

  • timestamp of when the list started – is this a relatively new list or one of the older, more established lists?
  • how representative is the chart – by adding a small visual cue (perhaps an up/down arrow), we could indicate whether the posting frequency in the last 30 days is higher/the same/lower than the average posting frequency across the list’s entire lifetime
  • how recent is the activity from the folks on the leader board – is the poster someone who’s still actively posting, or from someone who used to post a lot but is no longer around? We could add a simple timestamp of their last activity to provide a cue for this type of information
  • total number of subscribers to the list – this could be helpful in indicating how popular the list to others
  • categories aren’t implemented yet, but the interface does have a section for listing discussions by category – would it perhaps be more meaningful to have a simple infographic (like a pie chart) in lieu of a listing by category, which gives an overview of what kinds of labels are used in this list? The downside to this idea is that it would be easy to skew the data. For example, if only 1% of the threads in the list are labeled and the entire 1% are put into the flame category, then the pie chart would show a category distribution that makes the list look like it contains an overwhelming number of flame messages.

What do you think – would adding these details be helpful? Are there other list stats that you’d be interested in having on the list overview page?