You are here

Feed aggregator

Jason Ronallo: Closing in on Client-side IIIF Content Search

planet code4lib - Sun, 2016-09-25 13:33

It sounds like client-side search inside may at some point be feasible for a IIIF-compatible viewer, so I wanted to test the idea a bit further. This time I’m not going to try to paint a bounding box over an image like in my last post, but just use client-side search results to create IIIF Content Search API JSON that could be passed to a more capable viewer.

This page is a test for that. Some of what I need in a Presentation manifest I’ve only deployed to staging. From there this example uses an issue from the Nubian Message. First, you can look at how I created the lunr index using this gist. I did not have to use the manifest to do this, but it seemed like a nice little reuse of the API since I’ve begun to include seeAlso links to hOCR for each canvas. The manifest2lunr tool isn’t very flexible right now, but it does successfully download the manifest and hOCR, parse the hOCR, and create a data file with everything we need.

In the data file are included the pre-created lunr.js index and the documents including the OCR text. What was extracted into documents and indexed is the the text of each paragraph. This could be changed to segment by lines or some other segment depending on the type of content and use case. The id/ref/key for each paragraph combines the identifier for the canvas (shortened to keep index size small) and the x, y, w, h that can be used to highlight that paragraph. We can just parse the ref that is returned from lunr to get the coordinates we need. We can’t get back from lunr.js what words actually match our query so we have to fake it some. This limitation also means at this point there is no reason to go back to our original text for anything just for hit highlighting. The documents with original text are still in the original data should the client-side implementation evolve some in the future.

Also included with the data file is the URL for the original manifest the data was created from and the base URLs for creating canvas and image URLs. These base URLs could have a better, generic implementation with URL templates but it works well enough in this case because of the URL structure I’m using for canvases and images.

manifest URL: base canvas URL: base image URL:

Now we can search and see the results in the textareas below.

Raw results that lunr.js gives us are in the following textarea. The ref includes everything we need to create a canvas URI with a xywh fragment hash.

Resulting IIIF Content API JSON-LD:

Since I use the same identifier part for canvases and images in my implementation, I can even show matching images without going back to the presentation manifest. This isn’t necessary in a fuller viewer implementation since the content search JSON already links back to the canvas in the presentation manifest, and each canvas already contains information about where to find images.

I’ve not tested if this content search JSON would actually work in a viewer, but it seems close enough to begin fiddling with until it does. I think in order for this to be feasible in a IIIF-compatible viewer the following would still need to happen:

  • Some way to advertise this client-side service and data/index file via a Presentation manifest.
  • A way to turn on the search box for a viewer and listen to events from it.
  • A way to push the resulting Content Search JSON to the viewer for display.

What else would need to be done? How might we accomplish this? I think it’d be great to have something like this as part of a viable option for search inside for static sites while still using the rest of the IIIF ecosystem and powerful viewers like UniversalViewer.

Ed Summers: Nicolini (6)

planet code4lib - Sun, 2016-09-25 04:00

This chapter focuses on Ethno-Methodology (EM) which Nicolini characterizes as practice-oriented much like the earlier praxeology of Bourdieu, but more interested in description and less in theory building and particularly the correctness of the descriptions. Garfinkel (1967) is cited as codifying EM around the idea of accountability or making activities legible to others. It’s interesting that Garfinkel originally went to school to study accounting, at least according to Wikipedia. There are several characteristics of accountability:

  • social activities have an order
  • the order is public (observable)
  • the order is mundane, banal, witnessed by anyone
  • orders are oriented to each other
  • the order makes sense to the people performing
  • experts in the order can describe it, they have language for it

This attention to rules is borrowed from some extent from Husserl and Schutz, but comes very close to Wittgenstein’s notion of rules, and rule following. His idea of relexivity is different from Bourdieu and Giddens in that reflexivity is connected with accountability: people make their practices accountable by making them reflexive. Similarly Garfinkel uses the idea of indexicality to talk about the way meanings are embedded in actions, and much of EM’s work can be found in the study of how people work with this indexicality when it pushes up against the way things work in the world: How do people do it?

EM is also concerned with how people perform their competency in an activity, and their membership in a group of other competent people. EM inspired two lines of research: work studies and conversation analysis. It’s interesting and curious that Nicolini says that these ideas of accountability, indexicality, membership and reflexivity are used just to open the space for research, and are abandoned as concepts when it comes to doing the work of EM.

It is important for the descriptions to embody just-thisness or haecceity (a new word for me) – they are told from the perspective of the people involved in the action, using their distinctive words and motivations. To do this the researcher must immerse themself in the domain under study. They must become a legitimate participant to understand the language, rules and activities. This idea is known as unique adequacy. It can require the researcher to dedicate their life to becoming a proficient member of a community. Mehan & Wood (1975) goes so far as to claim that EM isn’t so much a method or a theory but a form of life (recalling Wittgenstein again). This strong version of EM can lead to researchers giving up their research as their membership in the community under study takes over. It feels like there must be some pretty strong parallels with this approach to Bourdieu’s habitus.

EM was apparently the subject of fierce debate in the sociology community, and EM practitioners found it difficult to get academic jobs. In the 1990s EM practices got new life in the work of Suchman, Dourish (who are on my reading list for later in the semester) and others who conducted workplace studies, examining the effects of technology in order to inform design.

EM-orientated workplace studies are not limited, in fact, to claiming in principle—as other theories do—that actors are bricoleurs, that they improvise and construct their world, that there is power and hierarchy. Rather, such studies go to great length to present living instances of bricolaging, improvisation, and power and hierarchy making and unmaking. They are not limited to claiming that organizations and society are socially constructed, that decisions and conducts are context-dependent, and that knowledge is practical and situated. Instead, they set out to provide evidentiary empirical substantiation to these claims, describing in detail how ordered and organized scenes of action are accomplished, how members build on contextual clues for accomplishing their activities, how knowing is visibly exhibited in what members actually do or refrain from doing. (p. 148)

EM feels like the most humanistic of the practice theories reviewed so far. It doesn’t attempt to make a theory, but instead embodies a sensibility, or a set of questions, and a way of approaching study, rather than a formula for conducting the research. EM is data driven and at the same time it is a literary genre.


Garfinkel, H. (1967). Studies in ethnomethodology. Prentice Hall.

Mehan, H., & Wood, H. (1975). The reality of ethnomethodology. John Wiley & Sons Inc.

Cynthia Ng: Yet Another Tips Post on Job Applications

planet code4lib - Sat, 2016-09-24 22:28
There is so much literature out there already on how to write job applications (namely cover letters and resumes) that I wasn’t sure I was going to write this post, but based on the job applications that I was looking over, I’m almost amazed at how many glaring errors people still make. Applying for jobs … Continue reading Yet Another Tips Post on Job Applications

Villanova Library Technology Blog: Sravanthi Adusumilli – New Library Technology Development Graduate Assistant

planet code4lib - Sat, 2016-09-24 17:00

Sravanthi (Sravs) Adusumilli , a graduate of Acharya Nagarjuna University, Guntar, India, joined the Library Technology Development team in August. She reports to Demian Kratz, team leader. She is currently working on redesigning “Finding Augustine.” “Finding Augustine” is “[a] rich and readily accessible biographical collection concerning Augustine of Hippo and his legacy;” it is sponsored by the Augustinian Institute at Villanova University.

Adusumilli has a bachelor’s degree in computer science engineering and is now enrolled in the Master of Science in Computer Engineering program with an anticipated graduation in May 2018. She plans to work as a data scientist.

Her hometown is Machilipatnam, India, a city on the southeast coast. Adusumilli’s hobbies are cooking and gardening.


Jason Ronallo: Client-side Search Inside for Images with Bounding Boxes

planet code4lib - Sat, 2016-09-24 15:26

It is possible to create a Level 0 IIIF Image API implementation with just static images and an info.json. And some institutions are probably pre-creating Presentation API manifests or even hand-crafting them. All that’s required then is to put those files up behind any web server with no other application code running and you can provide the user with a great viewing experience.

The one piece that currently requires a server-side application component is the IIIF Content Search API. This usually involves a search index like Solr as well as application code in front of it to convert the results to JSON-LD. I’ve implemented search inside using the content search via Ocracoke. With decent client-side search from libraries like lunr.js it ought to be possible to create a search inside experience even for a completely static site.

Here’s a simple example:

This works first of all because the page has been OCR’d with Tesseract which outputs hOCR. (I developed Ocracoke in part to help with automating an OCR workflow.) The hOCR output is basically HTML that also includes the bounding boxes of sections of the page based on the size of the digitized image. We can then use this information to draw boxes over top of the corresponding portion of the image. So how do we use search to find the section of the page to highlight?

The first step in this case for simplicity’s sake was to use an image of known size. This is possible to do hit highlighting in a tiling pan/zoom viewer like OpenSeadragon as evidenced by UniversalViewer. The page image at 20% of the original fits within the width of this site:

I then used some code from Ocracoke to rescale the original hOCR to create bounding box coordinates that would match on the resized page image. I parsed that resized hOCR file to find all the paragraphs and recorded their position and text in a JSON file.

At this point I could have created the lunr.js index file ahead of time to save the client some work. In this example the client requests the JSON file and adds each document to the index. The Fabric.js library is used to create a HTML canvas, add the page image as a background, and draw and remove rectangles for matches over top of the relevant section. Take a look at the JavaScript to see how this all works. Pretty simple to put all these pieces together to get a decent search inside experience.

If you gave this a try you’ll notice that this implementation does not highlight words but sections of the page. It might be possible to make this work for individual words, but it would increase the total size of the documents as the bounding boxes for each word would need to be retained. Indexing each word separately would also disrupt the ability to do phrase searching. There’s some discussion in lunr.js issues about adding the ability to get term start positions within a text that may make this possible in the future without these drawbacks. I had originally considered just trying to achieve getting the user to the correct page, but I think targeting some level of segment of the page is a reasonable compromise.

I don’t use the IIIF Content Search API in this demonstration, but it ought to be enough of a proof of concept to show the way towards a viewer that can support a completely static site including search inside. Anyone on ideas or thoughts on how a static version of content search could be identified in a IIIF Presentation manifest? Without a URL service point what might this look like?

District Dispatch: Pew: A generation gap for digital readiness

planet code4lib - Fri, 2016-09-23 22:09

Digital Readiness Gaps,” a new Pew Research Center report, explores a spectrum of digital readiness, from digitally ready to unprepared. Researcher John Horrigan finds that more than half (52%) of U.S. adults may be considered “relatively hesitant” and the least likely to use digital tools for personal learning.
The research explores three dimensions of digital readiness: (1) the digital skills required to use the internet; (2) trust, namely, people’s ability to assess the trustworthiness of information found online and to protect their personal information; and (3) use, that is, the extent to which people use digital tools to complete online activities (e.g., personal learning or online courses).

“Digital Readiness Gaps,” a new Pew Research Center report, explores a spectrum of digital readiness.

The analysis identifies five distinct groups on the spectrum:

Relatively more prepared

  • Digitally Ready (17%): Have technology resources and are confident in their digital skills and capacity to determine the trustworthiness of online information. The Digitally Ready enjoy high-income and education levels, and are likely to be in their 30s or 40s.
  • Cautious Clickers (31%): Have strong levels of tech ownership, are confident in their digital skills, and are relatively knowledgeable about new online learning concepts. Unlike the Digitally Ready, they are less likely to use the internet for personal learning. The Cautious Clickers have above average educational and income levels, and are usually in their 30s or 40s.

Relatively hesitant

  • The Reluctant (33%): Have below average confidence in their digital skills, little concern about their ability to trust information online, and very low awareness of online learning concepts. The Reluctant are middle-aged and have relatively lower levels of income and education.
  • Traditional Learners (5%): Are active learners and have technology, but are unlikely to use the internet for learning purposes, tend to need help with using digital devices, and express above average concern about the trustworthiness of information online. This group is more likely to be middle-aged, ethnically diverse, and lower- to lower-middle income.
  • The Unprepared (14%): Have relatively lower levels of tech adoption, very low confidence in their digital skills, and a high degree of difficulty determining whether online information is trustworthy. The Unprepared are older, with relatively low income and educational levels.

By examining digital readiness, rather than the “digital divide,” Pew’s research highlights the fact that people’s lack of digital skills and trust in technology may, in turn, impact their use of digital resources. In other words, digital literacy and trust may boost meaningful internet use.

As the report observes, libraries understand that digital readiness involves digital skills combined with the digital literacy tools to enable people to assess the trustworthiness of online information. The report also notes that library users and the highly wired are more likely to use the internet for personal learning (55% and 60%, respectively, compared with 52% of all personal learners) and more likely to have taken an online course.

Horrigan notes that the research focuses on online learning, and may not project to people’s capacity (or lack of capacity) to perform health-related web searches or use mobile apps for civic activities, for instance. There also is some fluidity among the groups identified, and the finding represent a snapshot in time that may change in coming years as e-learning evolves.

Unsurprisingly, libraries have long been at the forefront of digital literacy efforts in their communities, as ALA documented in 2013. As the recent Digital Inclusion Survey indicated, all public libraries provide free public access to the internet, and most offer diverse digital content and services, as well as formal and informal technology training.

What’s more, the public trusts libraries to teach digital literacy skills. In a prior report, Pew found that 47 percent of American adults agree that libraries contribute “a lot” to providing a trusted place for people to learn about new technologies. Another Pew report revealed that 80 percent of adults believe that libraries should “definitely” offer programs to teach people how to use digital tools.

This newest report is an important addition to the body of research conducted by the Pew Research Center (including a previous public library engagement typology) and fodder for planning related to digital inclusion efforts, including work underway at the Federal Communications Commission.

Note: OITP Deputy Director Larra Clark will interview Pew researcher John Horrigan for a Public Libraries Online podcast interview, which will be posted in coming weeks.

The post Pew: A generation gap for digital readiness appeared first on District Dispatch.

Jason Ronallo: Client-side Video Search Inside

planet code4lib - Fri, 2016-09-23 21:42

Below the video use the input to search within the captions. This is done completely client-side. Read below for how it was done.

As part of thinking more about how to develop static websites without losing functionality, I wanted to be able to search inside a video.

To create the WebVTT captions file I used random words and picked 4 randomly to place as captions every 5 seconds throughout this 12+ minute video. I used an American English word list, randomly sorted it and took the top 100 words. Many of them ended with “’s” so I just removed all those for now. You can see the full word list, look at the WebVTT file, or just play the video to see the captions.

sort -R /usr/share/dict/american-english | head -n 100 > random-words.txt

Here’s the script I used to create the WebVTT file using our random words.

#!/usr/bin/env ruby random_words_path = File.expand_path '../random-words.txt', __FILE__ webvtt_file_path = File.expand_path '../search-webvtt.vtt', __FILE__ def timestamp(total_seconds) seconds = total_seconds % 60 minutes = (total_seconds / 60) % 60 hours = total_seconds / (60 * 60) format("%02d:%02d:%02d.000", hours, minutes, seconds) end words = cue_start = 0 cue_end = 0, 'w') do |fh| fh.puts "WEBVTT\n\nNOTE This file was automatically generated by\n\n" 144.times do |i| cue_words = words.sample(4) cue_start = i * 5 cue_end = cue_start + 5 fh.puts "#{timestamp(cue_start)} --> #{timestamp(cue_end)}" fh.puts cue_words.join(' ') fh.puts end end

The markup including the caption track looks like:

<video preload="auto" autoplay poster="" controls> <source src="" type="video/mp4"> <source src="" type="video/webm"> <track id="search-webvtt" kind="captions" label="captions" lang="en" src="/video/search-webvtt/search-webvtt.vtt" default> </video> <p><input type="text" id="search" placeholder="Search the captions..." width="100%" autocomplete='off'></p> <div id="result-count"></div> <div class="list-group searchresults"></div> <script type="text/javascript" src="/javascripts/search-webvtt.js"></script>

In the browser we can get the WebVTT cues and index each of the cues into lunr.js:

var index = null; // store the cues with a key of start time and value the text // this will be used later to retrieve the text as lunr.js does not // keep it around. var cue_docs = {}; var video_elem = document.getElementsByTagName('video')[0]; video_elem.addEventListener("loadedmetadata", function () { var track_elem = document.getElementById("search-webvtt"); var cues = track_elem.track.cues; index = lunr(function () { this.field('text') this.ref('id') }); for (var i = 0; i <= cues.length - 1; i++) { var cue = cues[i]; cue_docs[cue.startTime] = cue.text; index.add({ id: cue.startTime, text: cue.text }); } });

We can set things up that when a result is clicked on we’ll get the data-seconds attribute and make the video jump to that point in time:

$(document).on('click', '.result', function(){ video_elem.currentTime = this.getAttribute('data-seconds'); });

We create a search box and display the results. Note that the searching itself just becomes one line:

$('input#search').on('keyup', function () { // Get query var query = $(this).val(); // Search for it var result =; var searchresults = $('.searchresults'); var resultcount = $('#result-count'); if (result.length === 0) { searchresults.hide(); } else { resultcount.html('results: ' + result.length); searchresults.empty(); // Makes more sense in this case to sort by time than relevance // The ref is the seconds var sorted_results = result.sort(function(a, b){ if (a.ref < b.ref) { return -1; } else { return 1; } }); // Display each of the results for (var item in sorted_results) { var start_seconds = sorted_results[item].ref; var text = cue_docs[start_seconds]; var seconds_text = start_seconds.toString().split('.')[0]; var searchitem = '<a class="list-group-item result" data-seconds="'+ start_seconds +'" href="#t='+ start_seconds + '">' + text + ' <span class="badge">' + seconds_text + 's</span></a>'; searchresults.append(searchitem); }; } });

And that’s all it takes to create search within for a video for your static website.

Video from Boiling Process with Sine Inputs–All Boiling Methods.

Jason Ronallo: Site Search with Middleman and lunr.js

planet code4lib - Fri, 2016-09-23 21:00

One of the tasks I have for this year is to review all the applications I’ve developed and consider how to lower their maintenance costs. Even for applications that aren’t being actively fed new content they need to be updated for security vulnerabilities in the framework and libraries. One easy way to do that is to consider shutting then down, and I wish more applications I have developed were candidates for sunsetting.

We have some older applications that are still useful and can’t be shut down. They’re are largely static but occasionally do get an update. We’ve thought about how to “pickle” certain applications by taking a snapshot of them and just making that static representation live on without the application code running behind it, but we’ve never pursued that approach as making changes that need to be applied across the site can be annoying.

For a couple of these applications I’m considering migrating them to a static site generator. That would allow us to make changes, not worry about updating dependencies, and remove concerns about security. One feature though that seemed difficult to replace without a server-side component is search. So I’m newly interested in the problem of site search for static sites. Here’s how I added site search to this blog as a way to test out site search without a server-side component.

Before making this change I was just pointing out to a Google site search, which isn’t the kind of thing I could do for one of our sites at work. What I’m doing now is certainly more complex than a simple search box like that, but the middleman-search gem made it rather simple to implement. There were a few things that took me a little time to figure out, so I’m sharing snippets here to maybe save someone else some time.

First, if using this with Middleman 4 using the master version might help:

gem 'middleman-search', github: 'manastech/middleman-search'

Then the code to activate the plugin in config.rb was updated for the structure of my blog. The pages for tagging polluted the index so I added a very rudimentary way to skip over some paths from getting indexed. I also added a way to store the section of the site (as “group”) in order to be able to display that along with any search result.

activate :search do |search| search.resources = ['about/', 'blog/', 'bots/', 'bots-blog/', 'demos/', 'experience/', 'presentations/', 'projects/', '/writing'] search.fields = { title: {boost: 100, store: true, required: true}, content: {boost: 50}, url: {index: false, store: true} } search_skip = ['Articles Tagged', 'Posts by Tag'] search.before_index = do |to_index, to_store, resource| if search_skip.any?{|ss| ss ==} throw(:skip) end to_store[:group] = resource.path.split('/').first end end

When the site is built is creates a search.json file at the root (unless you tell it to put it somewhere else). In order to encourage the client to cache it, we’ll set our ajax request to cache it. As the site gets updated we’ll want to bust the cache, so we need to add “.json” to the list of extensions that Middleman will create a digest hash for and properly link to. The way of doing this that is in all of the documentation did not work for me. This did, but required spelling out each of the extensions to create a hash for rather than just trying to append “.json” to asset_hash.exts.

activate :asset_hash do |asset_hash| asset_hash.ignore = [/demos/] asset_hash.exts = %w[ .css .js .png .jpg .eot .svg .ttf .woff .json ] end

Now I just created a simple erb file (with frontmatter) to make up the search page. I’ve added a form to fallback to a Duck Duck Go site search.

--- title: Search --- <%= javascript_include_tag 'search' %> <h1>Search</h1> <p> <input type="text" id="search" placeholder="Search..." width="100%"> </p> <div id="result-count"></div> <div class="list-group searchresults"> </div> <div id="duckduckgo-fallback-search"> <p>If you can't find what you're looking for try searching this site via Duck Duck Go:</p> <form action="" method="get" role="search"> <div class="form-group"> <input class="search form-control" type="text" name="q" value=" " autocomplete="off"> </div> </form> </div>

And here’s the JavaScript, the beginnings of it borrowed from the middleman-search readme and this blog post. Unfortunately the helper search_index_path provided by middleman-search did not work–the method was simply never found. One magic thing that took me a long time to figure out was that using this helper was completely unnecessary. It is totally fine to just include the URL as /search.json and Middleman will convert it to the asset hash name when it builds the site.

The other piece that I needed to open the console for was to find out why the search results only gave me back documents with a ref and score like this: { ref: 6, score: 0.5273936305006518 }. The data packaged into search.json includes both the index and the documents. Once we get the reference to the document, we can retrieve the document to give us the url, title, and section for the page.

Updated 2016-09-23 to use Duck Duck Go as the fallback search service.

var lunrIndex = null; var lunrData = null; // Download index data $.ajax({ url: "/search.json", cache: true, method: 'GET', success: function(data) { lunrData = data; lunrIndex = lunr.Index.load(lunrData.index); } }); $(document).ready(function () { var duckduckgosearch = $('#duckduckgo-fallback-search'); duckduckgosearch.hide(); $('input#search').on('keyup', function () { // Get query var query = $(this).val(); // Search for it var result =; // Output it var searchresults = $('.searchresults'); var resultcount = $('#result-count'); if (result.length === 0) { // Hide results searchresults.hide(); resultcount.hide(); if (query.length == 0) { duckduckgosearch.hide(); } else { } } else { // Show results resultcount.html('results: ' + result.length); searchresults.empty(); for (var item in result) { // A result only gives us a reference to a document var ref = result[item].ref; // Using the reference get the document var doc =[ref]; // Get the section of the site var group = " <span class='badge'>" + + '</span>'; var searchitem = '<a class="list-group-item" href="' + doc.url + '">' + doc.title + group + '</a>'; searchresults.append(searchitem); }; } }); });

That’s it. Solr-like search for a completely static site. Try it.

Brown University Library Digital Technologies Projects: Workflows and Tools

planet code4lib - Fri, 2016-09-23 16:34

Digital preservation is simultaneously a new and old topic. So many libraries and archives are only now dipping their toes into these complicated waters, even though the long-term preservation of our born-digital and digitized holdings has been a concern for a while now. I think it is often forgotten that trustworthy standard-bearers, like the Digital Preservation Management Workshop and The Open Archival Information System (OAIS) Model, have been around for over a decade. The OAIS Reference Model in particular is a great resource, but it can be intimidating. Full implementation requires a specific set of resources, which not all institutions have. In this way, comparing one’s own program to another which is further along in an attempt to emulate their progress is often a frustrating endeavor.

I’ve witnessed this disparity most notably at conferences. Conferences, unconferences, and colloquia can be really helpful in that people are (thankfully) very open with their workflows and documentation. It’s one of my favorite things about working in a library; there aren’t trade secrets, and there isn’t an attitude of competition. We celebrate each other’s successes and want to help one another. With that said, some of the conversations at these events are often diluted with tool comparison and institution-specific jargon. The disparity of resources can make these conversations frustrating. How can I compare our fledgling web archiving initiative with other institutions who have entire web archiving teams? Brown has a robust and well-supported Fedora repository, but what about institutions who are in the early stages of implementing a system like that? How do we share and develop ideas about what our tools should be doing if our conversations center around the tools themselves?

For our digital accession workflow, I’ve taken a different approach than what came naturally at first. I initially planned our workflow around the implementation of Artefactual’s Archivematica, but I could never get a test instance installed adequately. This, of course, did not stop the flow of digitized and born-digital material in need of processing. I realized I was trying to plan around the tool, when I wasn’t even sure what I needed to tool to do. Technology will inevitably change, and unless we have a basis for why a tool was implemented, it will be very difficult to navigate that change.

For this reason, I’ve been working on a high-level born-digital accessioning workflow where I can insert or take out tools as needed (see above). This workflow outlines the basic procedures of stabilizing, documenting, and packaging content for long-term storage. It has also been a good point of discussion among both internal and external colleagues. For example, after sharing this diagram on Twitter, someone suggested creating an inventory before running a virus scan. When I talked about this in our daily stand-up meeting, one of the Library’s developers mentioned that compressed folders may in fact strengthen their argument. Unless both the inventory and the virus scan account for items within a compressed folder, there is actually a risk that the scan might miss something. This is one example of the type of conversations I’d like to be having. It’s great to know which tools are available, but focusing strictly on tool implementation keeps us from asking some hard questions.

Access Conference: Crowne Plaza Shuttle

planet code4lib - Fri, 2016-09-23 15:18

For Access and Hackfest attendees who are staying at the Crowne Plaza Fredericton Lord Beaverbrook, daily shuttle runs between the Crowne Plaza and the Wu Conference Centre have been arranged.

Tuesday, Oct. 4

  • Crowne to Wu: 7:30am & 7:50am
  • Wu to Crowne: 4:15pm & 4:35pm

Wednesday, Oct. 5

  • Crowne to Wu: 7:30am & 7:50am
  • Wu to Crowne: 4:30pm & 4:50pm

Thursday, Oct. 6

  • Crowne to Wu: 7:30am & 7:50am
  • Wu to Crowne: 5:10pm & 5:30pm

Friday, Oct. 7

  • Crowne to Wu: 7:30am & 7:50am
  • Wu to Crowne: 4:45pm

See? We love you that much! Thanks to the Crowne Plaza and UNB Conference Services for helping make this service available!

In the Library, With the Lead Pipe: The Collective Approach: Reinventing Affordable, Useful, and Fun Professional Development

planet code4lib - Fri, 2016-09-23 13:30

In Brief:  In 2014, a small group of librarians at the University of Tennessee set out to redefine the library conference landscape. Frustrated by the high cost and lack of tangible skills and takeaways at professional organization gatherings, they conceived of a low-cost, high-value symposium where academic librarians might learn, create, and collaborate together. The resulting event, The Collective, first took place in February 2015 and is now an annual opportunity for librarians from around the US and the globe to redefine scholarly communication and professional development in a fun and creative platform. The Collective model offers a practical and repeatable blueprint for other librarians or academics looking to further reinvent and revolutionize their continuing education and convocation.

by Ashley Maynor and Corey Halaychik


In 2014, a small group of librarians at the University of Tennessee set out to redefine the library conference landscape. Frustrated by the high cost and lack of tangible skills and takeaways at professional organization gatherings, they conceived of a low-cost, high-value symposium where academic librarians might learn, create, and collaborate together. The resulting event, The Collective, first took place in February 2015 and is now an annual opportunity for librarians from around the US and the globe to redefine scholarly communication and professional development in a fun and creative platform. The Collective model offers a practical and repeatable blueprint for other librarians or academics looking to further reinvent and revolutionize their continuing education and convocation.

Current Professional Development Landscape

There are a number of professional organizations that service library professionals, many of which offer annual conferences where librarians come together to share knowledge, skills, and learn about new products. These gatherings, however, tend to be costly for participants, rely heavily on trade industry sponsorships (that may impact or influence programming decisions), and tend towards “show and tell” or “sage on a stage” presentations with little time dedicated towards audience interaction. Few, if any, offer transparency in their review process (i.e. sharing reviewer names or qualifications, disclosing the procedure or nature of the review process, sharing feedback with submitters, etc.). There is also often a large span of time between the proposal process and conference itself; as just one example, the American Library Association solicits proposals fifteen months before the annual conference gathering.

At their worst, the result is stale programming, bait and switch session descriptions, and undue corporate influence on panels and program content with a low return on the registration fee and cost of attendance for conference goers. Discounts are often offered tiered or offered only to select individuals. It is common for conferences to offer “early bird” registrations and special rates for, presenters, organizers, or other privileged individuals. Furthermore, many conferences highlight differences among attendees types using paraphernalia, such as ribbons, to designate organizers, presenters, sponsors, committee members, and the like as “special” attendees. The gatherings are often large (400+). The size combined with the typical presentation format often translates into an intimidating environment for connecting with new people.

Figure 1: 2015 Registration and lodging costs and conferred benefits by conference. Data taken from official conference websites.

The Collective Mission & Values

The Collective is designed as an alternative to these large, expensive, traditional professional gatherings that compose the professional development landscape. Figure 1 above shows how The Collective measures in terms of its costs and confered benefits compared to some of the most well-known conferences for academic librarians. Its mission is to support learning, networking, and kick-starting new ideas among next-generation librarians and library stakeholders where the participants determine the content.

The Collective seeks to achieve the following goals:

  • To dissolve the traditional conference divide between “presenters” and “attendees” by making everyone active participants.
  • To make a low-cost event— where all participant costs are subsidized and everyone, even conference organizers, pay an equally low registration fee. We believe participants should receive more value than the registration fee paid, as opposed to the traditional profit-generating conference.
  • To eliminate vendor expo areas and create an event climate where vendors are treated as colleagues who can learn and collaborate with us to better serve our users. We believe developing relationships is far more effective than hard sales and we think sessions should contain content, not sales pitches.
  • To have a practitioner-oriented gathering—aimed at librarians on the front lines rather than highlighting administrators or those in positions of top-level leadership.
  • To offer interactive sessions—no “sage on a stage,” with an emphasis on tangible takeaways, networking, conversation, hands-on activities, and collaboration.
  • To offer transparency and fairness in the proposal review process. Session content is solicited through a public forum (see Figure 2) with a public voting process combined with a blind peer-review and committee review. We offer feedback on all submissions, including all non-accepted proposals.To help keep our content relevant, we shorten the lag between proposals and the event; ours is less than six months.

To help librarians “learn, create and collaborate” as our tagline professes, we have carefully designed our programming process to support these goals.


The quality of a conference and its utility to participants is often in correlation to the quality of its programming, so we sought to program The Collective in a new way to ensure high quality content. The overall style of The Collective draws on the best of conferences and un-conferences alike, including THATCamp and The Conversation (a unique coming together in the film industry in 2008 and 2010). We hope to achieve a balance of the flexibility, surprise, and active participation of an unconference combined with the organization, programming rigor, and geographic diversity of a national or international conference.

For the main program, conference organizers solicit session topics, ideas, and feedback through a transparent, inclusive three-step process. Rather than create a niche conference to serve a limited type of librarians, we solicit ideas each year around a broad theme that encourages cross-pollination among attendee types/librarian roles. Past themes include Libraries as Curators & Creators (2015), Adopt, Adapt, Evolve: Reinvigorating & Rejuvenating Our Libraries (2016), and Make It Beautiful, Make It Usable (2017).

First, ideas for conference sessions are solicited through a public “Session Picker,” an online, public idea generation, commenting, and voting platform inspired by the SXSW Interactive Conference PanelPicker (Figure 2). First round submissions are quick and easy: all that’s required is a title, three-sentence description, and indication of session format. The formats encouraged include but are not limited to lightning talks, pecha kucha, dork shorts, interactive plenaries, interactive panels, roundtable discussions, hands-on workshops, Q&A sessions, small group breakouts, skill-building workshops, make hack and play sessions.

Figure 2: A screenshot from the 2017 Session Picker.

While some conferences include workshops for additional fees pre- or post conference, we aim to make every single session a worthwhile opportunity for hands-on learning, discussion, skill-building, and/or networking with no special fees or paid events. Proposals are solicited through dozens of listservs, on The Collective website, through social media the summer/fall before the gathering, and strategic partnerships. At this early proposal stage, all presenters in a session do not have to be known; in fact, we encourage prospective attendees to use the platform to network outside their known circle to find additional presenters to collaborate with. Collective organizers will also assist with finding session collaborators via a call for participation. Lastly, unlike many conferences, individuals are free to suggest sessions they might find interesting but they themselves won’t directly be involved in organizing.

When the picker closes, a programming committee of academic librarians reviews the proposals for feasibility, diversity, interest (based in part on public votes), and quality. At this stage, some submitters might be encouraged to combine or collaborate on proposals if theirs are similar. Most proposals are invited to round two – peer review. Those that do not make it to the second round are rejected due to content overlap, lack of interactivity, or otherwise failing meet the spirit of The Collective motto (i.e. “learn, create, collaborate”).

In the second phase, invitations are sent to round one applicants who are asked to submit more detailed proposals, roughly 200-500 words, with special attention to the format and interactivity of their session. Submitters are encouraged to outline any handouts/tip sheets, tangible takeaways or skills, or anticipated outcomes of their session. Each of these proposals is then scored on a rubric (Figure 3) and commented on by at least two (and usually three) outside reviewers. The review panel is constituted of a rotating combination of academic librarians, library product designers/vendors, and independent information professionals. While reviewers do not know the identity of the submitters, the reviewer names and qualifications are posted on the conference website. We also screen all submissions for any obvious conflicts of interest and assign reviews according to the topic of the session (as designated by the submitter) vis-à-vis a particular reviewer’s qualifications (Figure 4).

Reviewers are asked to evaluate submissions on relevance to the upcoming Collective’s theme, whether or not the topic is timely and current, the interest or novelty of the session’s approach, whether or not the presentation is conducive to participation, and evidence that the idea can and will be further developed before the actual event (Figure 3). Sessions are then ranked according to their public vote and peer review score before the final phase, program committee review.

Figure 3: A scoring rubric from the 2015 Collective peer review.

Figure 4: Topic areas for proposals for the 2016 Collective and for reviewer expertise.

The programming committee carefully examines each proposal, its ranking, and the balance among session types or focus for making final selections. Regardless of whether or not a session is selected for inclusion, each submitter receives their rubric scores, vote tally, and anonymized comments from the peer review. Often, non-accepted proposal submitters are invited to collaborate with accepted sessions or may reply to open calls for participation for accepted sessions. Because of the emphasis on interactive sessions, the traditional hierarchy of presenter and non-presenter is subverted; even those not presenting will have much to gain from attending The Collective.

Finally, the organizers of all accepted sessions are required to participate in a planning phone call with a member of The Collective’s programming team. This phone call is used to assist in further development of interactive components, to discuss technical needs, decide on space requirements, and to troubleshoot any issues that session organizers are having. This personal, one-on-one contact helps ensure a smooth event, creates a personal connection before the occasion, and ensures that what is proposed on paper can be translated in person.

We strive to treat programming as ongoing relationships with professionals in our field rather than a simple “submit and forget it” process. The programming committee endeavors to develop relationships of support that begin with the proposal submission, continue with the planning call, and extend beyond the gathering as a long-term network of peers.

Importantly, The Collective’s programming is not limited to sessions from the open call. We also include two non-keynote plenary sessions. In the past, these have included an interactive discussion of library leadership and a board-game networking mashup. Day one of The Collective traditionally closes with the “Failure Confessions” – a series of lightning talks, followed by an open mic, where librarians share stories about spectacular failures we can all learn from.

To encourage informal networking and collaboration, our meeting space also features various pop-up “unconference” spaces, which include the IdeaLibrary, TinkerLab, and Shhh Room. The IdeaLibrary (Figure 5) is a space for impromptu brainstorming, networking, and discussion. We provide inspirational books on creativity, notepads, and other supplies to help participants kick-start conversations. The TinkerLab (Figure 6) is a mobile makerspace with some simple tools and kits for hands-on exploration and demonstrations of gaming, conductivity and DIY electronics, music-making, 3-D printing, and prototyping. Past available equipment included Creopop pens, Ozobot robots, 3Doodlers, Makey-Makeys, and LittleBits electronic kits. The Shhh Room is a space free of cell phones and computers and dedicated to quiet reflection. The space is also equipped with yoga mats, seat cushions, and meditative coloring books.

Figure 5: Books and a postcard mailing station in the 2016 IdeaLibrary.

Figure 6: Photos from the 2016 TinkerLab.

Because of the highly interactive hands-on nature of the sessions, we do not stream or record sessions. Instead, we emphasize real-time, face-to-face interaction. Instead, , to encourage that takeaways travel home with the attendees, we aim to document and share information from each year through community notetaking.. Each session has a designated volunteer notetaker who takes notes in an open Google document, which is open for editing and additions from all participants. Documents, such as slides, handouts, and takeaways are shared through both Sched, our online schedule manager, and through Google Docs post-conference.

The conference closes with a door prize raffle—open to everyone who completes our conference feedback survey. Immediately following the raffle, we host an open mic for sharing best conference lessons and feedback. The unedited, anonymous survey results are made public each year and are used for continuous re-thinking and improving of future events.

Networking & Local Connections

A major focus of The Collective is providing multiple opportunities for attendees to network with their peers. This is an important aspect of The Collective which builds a sense of community among attendees and, more importantly, presents opportunities for future collaboration outside of the annual gathering. We believe that the best networking events are those that build camaraderie through informal, shared experiences. We also use our networking events as a way to introduce attendees to the city of Knoxville as a great place to live and work by highlighting the best of Knoxville’s local dining and entertainment scenes. Professional gatherings often seem to take place in a vacuum, confined to the grounds of sterile conference centers. At The Collective, however, we’ve made concerted efforts to emphasize the place of our gathering—Knoxville, Tennessee, and just minutes from the University of Tennessee—and conduct the business of the meeting so as to benefit the community we call home.

Rather than host lunch or dinner at a hotel or conference center, we make it easy for participants to explore the city by locating our gathering a few minutes’ walk to downtown, providing custom maps of the city with recommended dining spots, and hosting our social events outside of the meeting space. Our first social activity offering is optional dine-arounds the evening before the conference: dutch-style dinners at downtown restaurants arranged by local hosts. These small group dinners provide an easy way to dine well in Knoxville and get to know attendees ahead of the main event. Each group of diners is led by a local host that not only leads the group’s walk to and from dinner but also answers questions about Knoxville attractions, what to expect at The Collective, etc.

We also partner with our local tourism board, VisitKnoxville, to use uncommon spaces for our complimentary reception and dinner for all attendees. In 2015, we hosted a Blues and BBQ night atop the iconic Sunsphere, built for the 1982 World’s Fair. In 2016, we organized a Southern Speakeasy at The Standard event venue in downtown Knoxville where the fifteen-piece Streamliners Jazz Orchestra performed while participants had photos taken in our photo booth, and enjoyed cocktails, a catered dinner from locally owned Rickard Ridge Barbeque, and nationally renowned Mag-Pies cakes.

Other community efforts include working with local artists to design artwork for our conference tote, hiring local musicians for our reception, sourcing branded swag from local suppliers, and using locally owned restaurants and bakers to cater our receptions. We’ve also scheduled our event during a typical low tourist season for our city. This scheduling not only provides a benefit to our community but also to our participants: hotels offer great room rates during this time of year to help our attendees maximize their travel budgets.

Finally, each closing night, we invite attendees to join in a“Literary Libations” pub crawl, organized in partnership with VisitKnoxville, our local tourism bureau. Local establishments offer appetizer specials and literary-themed cocktails to entice Collective attendees to come out and socialize; in 2016, the closing night outing wrapped up with an exclusive party Collective attendee-only event at the Oliver Royale restaurant and bar. This self-directed socializing showcases our city and also helps to boost our local economy in the off-season, which makes it an attractive partnership opportunity for venues.

Incentives & Partnerships

In the same way we’re breaking the mold of how to host a gathering, we also seek to redefine how an organization works with event sponsors. First, we don’t exchange money for programming directly or implicitly. Instead, we gladly work with vendors who wish to submit session proposals to move beyond the “show and tell” and sales demonstrations that are so common in the conference landscape. We require that vendor sessions adhere to the same standards of participation of other sessions and must not skew towards a sales pitch.

Rather than looking for one or two sponsors to foot the bill of the conference, we ask for small amounts of money from many different organizations. We keep it simple by offering sponsorship opportunities set at two funding levels. Each level provides a package of benefits including registrations, sponsorship acknowledgment, and, in the case of the higher funding tier, opportunity to include marketing materials in the conference tote. We aim to foster interactions between vendor representatives and librarians who normally wouldn’t interact with one another, which helps to redefine vendors as not “other” than librarians but instead as thoughtful partners who share the same commitment to getting the right information to the right user at the right time.

In this spirit, we do not provide a vendor expo area or marquee or sponsored programming sessions. This approach helps ensure that we don’t privilege one product or service over another and also means smaller businesses and start-ups have a chance to participate in our unique event, which we believe fosters meaningful and long-term relationships with librarians instead of elevator pitches as folks walk the conference floor.

We keep our conference bag design free of any advertising and our commemorative drink bottle only displays The Collective logo. Furthermore, we highly encourage sponsoring organizations to send technical experts, product development managers, and user experience employees in the place of sales staff as a way to connect product users directly to those designing the products.

Additionally, we create opportunities for all sponsor representatives to participate as equals during the gathering. All attendees (regardless of status) are invited and encouraged to participate in any session they’d like to. By removing the sales-focused channels that frequently occur at conferences (expos, product demos, etc.) we believe this also removes the tension between vendors and librarians. Because vendors aren’t tied up focusing on sales, they are free to participate in the sessions. Both of these factors help create an environment of idea exchange where everyone has the ability to redefine the roll between vendor and librarian as adversarial to one of collaborative partnership.

Finally, The Collective was started in large part to relieve discontent with the state of many contemporary conferences. While we are excited about what the Collective provides, we believe the movement to change the landscape is more important than any one particular conference or “brand.” We therefore welcome organizers from other conferences to participate in The Collective and willingly share our documentation and provide advice to anyone interested in starting their own non-profit, regional gatherings.

Logistics & Funding

The size, scheduling, and event overlap can greatly color the participant’s experience of a conference. So, while we encourage and receive registrations from more than 36 states and 140 organizations, we intentionally limit the size of the gathering (170 in 2015, 225 in 2016, 300 in 2017) and don’t plan to grow beyond an annual attendance of 350, so that attendees can easily meet new people and not feel intimidated by the environment. We use software to make our session schedule easy to use and have no more than four concurrent sessions happening at any one time. The programming committee takes great pains to distribute session content so that like-themed sessions are not competing in the same time slots and that there’s something for everyone during each session period. We also keep the pop-up spaces open for the duration of the gathering, so that there is always an informal unconference alternative to any planned session.

The cost of any professional development can be significant and how funds are used equally shapes the conference goers’ experience. Our smaller sponsorship level approach requires more entities to be contacted about funding, so we dedicate a significant amount of time to fundraising with the campaign typically starting around the time of ALA Annual (June/July preceding The Collective) and continuing until the first day of the event. Further complicating this funding challenge is our pledge to be an affordable alternative to large mega-conferences. The cost of attendance is heavily subsidized by sponsorship funds with the registration fees covering roughly half of the actual cost of the event per person, so we must raise more funds than the typical event since costs are not passed on to attendees.

While the amount and source of funding received matters to us, equally important is how funds are used. The Collective employs a number of strategies for being good stewards of sponsorship dollars so that we can do more with less. First, we use a mixed approach to procuring goods and services; when possible, we borrow material from other institutions, such as the University of Tennessee, the University of Dayton, or North Carolina State University libraries, especially for our TinkerLab. Borrowing materials such as laptop carts, additional microphones, etc., significantly cuts down on the expense of buying or renting overpriced AV technology.

We also think carefully about our food and beverage costs at the meeting venue. Rather than pay exorbitant amounts for soft drinks (a canned cola at one venue was $4.00 per can consumed) or bottled water, we provide endless coffee and supply each attendee with a beautiful commemorative bottle for water, which has the added eco-friendly benefit. We also minimize the size of our printed program (to save paper and printing costs) and instead encourage attendees to use the free Sched mobile app for our schedule.

These simple savings free up funds to purchase supplies that directly support presenters, inspire creativity, and help off-set total costs. We also strive to purchase materials that can be used beyond the event as a way to demonstrate value to our institutional sponsor and promote The Collective year-round. For example, many of the demo tools and equipment we purchase for the TinkerLab can be used by the University of Tennessee Libraries, our primary institutional sponsor, throughout the year for their studio and makerspaces. While it’s a hassle to store reception décor items, we’ve found that purchasing linens (and paying to have them laundered), purchasing reusable items such as LED candles and the like is significantly lower than the rental cost for these supplies.

Our choice of host city is also key in keeping our costs down. We are able to leverage existing community relationships of The Collective co-directors, resulting in discounts, cost-in-kind donations of goods and services, and unique experiences for attendees. As mentioned earlier, our making The Collective a “Knoxville event” allowed us to partner with the local, VisitKnoxville tourism office.  VisitKnoxville has assisted in negotiating conference and reception venues, resulting in lower room rates, discounted reception expenses, and free meeting venue space with a reasonable minimum food and beverage spend.

We also strive to keep our marketing efforts affordable by using a combination of low- or no-cost marketing channels. Low-cost efforts involve using printed marketing material sparingly and ensuring that material is not tied to a specific year so that it may be reused. We also take advantage of free modes of communication including social media and listservs to advertise both calls for proposals and to share registration updates.

We rely on an energetic volunteer staff of individuals as passionate as we are about revolutionizing the professional development landscape. Our collective, unpaid work means we can program, plan logistics, and maintain our website and marketing at no cost to the conference participant.

Building A Community

Building a community requires an online presence and identity, social media and sharing, and year-round activities. When we created The Collective, we spent many hours working with a group to develop an inspiring logo and website that represents our mission: to learn, create, and collaborate. As our logo’s Venn diagram illustrates, we look for connections, overlap, and opportunities among seemingly disparate groups and ideas.

During the event, we highly encourage the use of Twitter, Instagram, and Facebook posts to share information and takeaways. Additionally, our collaborative note-taking documents live on via our website for those unable to attend in person or those wishing to review the content of past gatherings.

We also design our conference swag to provide year-round brand presence and awareness. Our unique conference totes offer fun designs that are free of any marketing and sure to to conversation topics. Our complimentary drink bottles are high-quality and branded only with The Collective logo to help attendees remember their great experience throughout the year.

While The Collective’s unique approach to professional development offers plenty of opportunities for networking and collaboration during the gathering, we believe that the good work being born from it shouldn’t end when the event does. We therefore have focused on building a year-round community among our attendees: we use social media to both keep our alumni and future participants informed and as a way for them to connect once the annual event has concluded to promote the work of and celebrate the success of past attendees. Social media is also used to advertise meetups between Collective attendees at other conferences. Finally, this article itself is an attempt to created documentation and share with like-minded individuals interested in hosting a similar event.

The focus we have given to community building has paid off in terms of an increasing number of and increased involvement from attendees year after year. In our first year, we were surprised to have attendance from over 170 individuals from 31 states. (We would have been pleased with a regional gathering of 70!) In 2016, we moved to a larger venue and attendance between 2015 and 2016 increased by 40% with participants hailing from over 140 institutions. This diversity has been especially helpful in gaining wider points of view with regards to programing preferences and we are especially excited to see a growing range of geographic diversity with our first international participants from Canada and Sweden in 2016.


With two successful gatherings completed and a third in planning, we believe we have found a recipe for organizing and executing a successful and useful professional development event. Those wishing to revitalize or start their own event can employ the following tips to ensure their own success:

  1. There’s no substitute for excellent content. Make programing the main focus of the event; aim to attract and offer sessions that allow for learning, creating, and collaboration. Keep activities fresh, ensure participants walk away with tangible skills, and open the door to the sharing of ideas and future collaboration. We strongly suggest that traditional “sage on the stage” style conference presentations be eschewed and aim for hands-on or highly interactive sessions that make the participants the focus instead of the presenter. This interactivity brings more people into the conversation, opens the door for better discovery, higher interaction, and builds a stronger sense of community.
  2. Make the event about everyday practitioners. Administrators can certainly bring a wealth of knowledge, level of expertise, and unique point of view to sessions, but we believe that the ratio of administrators to practitioners at a conference should be reflective of the real-world landscape. This ensures that those individuals who are in the field have an opportunity to both share their experiences and learn from colleagues who face the same daily challenges. Furthermore, all sessions should offer an opportunity for the free exchange of ideas to occur. No one should be harassed or put down for their ideas; while dissent is an important aspect of discussion it should be done in a respectful manner and in an atmosphere of openness.
  3. Because librarians don’t work in a vacuum, we believe professional development shouldn’t either. Conferences planned around a broad theme rather than a job specialization facilitates cross-pollination between various groups and stakeholders which can lead to better understanding of personal roles and creative solutions to common challenges. It also opens the door for broader collaboration between the multitude of specializations that exist in today’s universities.

Finally, work hard to keep costs down. Professional development shouldn’t feel like tithing and participants will be more energized – and likely to return – if they feel the value to cost ratio is high. Keeping registration rates affordable also lowers the entry threshold for librarians with small or non-existent travel budgets. This creates a broader range of experiences, opinions, and points of view during sessions which improves the overall quality of idea exchanges taking place.


Many thanks to the peer reviewers for this article, Bethany Messersmith and Kathy Hart, and publishing editor Sofia Leung for their contributions. Thanks also to the many volunteers and attendees of The Collective who have made our dream of better professional development a reality.

Works Cited & Further Reading

THATCamp – The Humanities and Technology Camp – is “an open, inexpensive meeting where humanists and technologists of all skill levels learn and build together in sessions proposed on the spot.” Read more about this inexpensive unconference format here:

The Conversation – This grass-roots gathering was “developed by a group of filmmakers, investors, entrepreneurs, journalists, and consultants interested in the new creative and business opportunities — and new ways of connecting with audiences.” It took place at a pivotal moment for film distribution in 2008 and 2010. See for more information.

SXSW Festival PanelPicker – South by Southwest uses a three-part process to select content for its annual Interactive Conference that combines public votes, an advisory board, and staff. This format helped inspire our three-part programming process. Read about it here:

The Collective –

Brown University Library Digital Technologies Projects: New Theses &amp; Dissertations site

planet code4lib - Fri, 2016-09-23 12:54

Last week, we went live with a new site for Electronic Theses and Dissertations.

My part in the planning and coding of the site started back in January, and it was nice to see the site go into production (although we do have more work to do with the new site and shutting down the old one).

Old Site

The old site was written in PHP and only allowed PhD dissertations to be uploaded. It was a multi-step process to ingest the dissertations into the BDR: use a php script to grab the information from the database and turn it into MODS, split and massage the MODS data as needed, map the MODS data files to the corresponding PDF, and run a script to ingest the dissertation into the BDR. The process worked, but it could be improved.

New Site

The new site is written in Python and Django. It now allows for Masters theses as well as PhD dissertations to be uploaded. Ingesting the theses and dissertations into the BDR will be a simple process of selecting the theses/dissertations in the Django admin when they are ready to ingest, and running the ingest admin action – the site will know how to ingest the theses and dissertations into the BDR in the correct format.

Ed Summers: Nicolini (5)

planet code4lib - Fri, 2016-09-23 04:00

In Chapter 5 Nicolini takes a look at how practice theories have been informed by activity theory. Activity theory was pioneered by the psychologist Lev Vygotsky in the 1920s and 1930s. Since Vygotsky activity theory has grown and evolved in a variety of directions that are all characterized by the attention to the role of objects and an attention to the role of conflict or dialectic in human activity. Nicolini spends most of the chapter looking specifically at cultural and historical activity theory.

He starts off by recalling the previous discussion of Marx, particularly his description of work in Das Kapital, where work is broken up into a set of interdependent components:

  1. the worker
  2. the material upon which the worker works
  3. the instruments used to carry out the work
  4. the actions of the worker
  5. the goal towards which the worker works
  6. the product of the work

The identity of the worker is a net effect of this process. Vygotsky and other activity theorists took these rough categories and refined them. Vygotsky in particular focused attention on mediation, or how we as humans typically interact with our environments using cultural artifacts (things designed by people) and that language itself was an example of such an artifact. These artifacts transform the person using them, and the environment: workers are transformed by their tools.

Instead of focusing on individual behavior, activity theorists often examine how actions are materially situated at various levels: actions, activities and operations which are a function of thinking about the collective effort involved. This idea was introduced by Leont’ev (1978). Kuutti (1996) is cited a few times, which is interesting because Kuutti & Bannon (2014) is how I found out about Nicolini in the first place (small world). To illustrate the various levels Leont’ev has an example of using the gears in a car with manual transmission, and how a person starts out performing the individual actions of shifting gears as they learn, but eventually they become automatic operations that are performed without much thinking during other activities such speeding up, stopping, going up hills, etc. The operations can also be dismantled and reassembled and recomposed to create new actions. I’m reminded of push starting my parent’s VW Bug when the battery was dead. The example of manual transmission is particularly poignant because of the prevalence of automatic cars today, where those shifting actions have been subsumed or embodied in the automatic transmission. The actions can no longer be decomposed, at least not by most of us non-mechanics. It makes me wonder briefly about the power dynamics are embodied in that change.

It wasn’t until Y. Engeström (1987) that the focus came explicitly to bear on the social. Yrjö Engeström (who is referenced and linked in Wikipedia but there is not an article for him yet) is credited for starting the influential Scandinavian activity theory strand of work, and helping bring it to the West. The connection to Scandinavia makes me think about participatory design which came from that region, and what connections there are between it and activity theory. Also action research seems similarly inflected, but perhaps it’s more of a western rebranding? At any rate Engeström got people thinking about an activity system which Nicolini describes as a “collective, systemic, object-oriented formation”, which is summarized with this diagram:

This makes me wonder if there might be something in this conceptual diagram from Engeström for me to use in analyzing my interviews with web archivists. It’s kind of strange to run across this idea of object-oriented again outside of the computer science context. I can’t help but wonder how much cross-talk there was between psychology/sociology and computer science. The phrase is also being deployed in humanistic circles with the focus on object oriented ontology, which is a philosophy of decentering the human. It’s kind of ironic given how object-oriented programming has fallen out of favor a bit in software development, with a resurgence of interest in functional programming. But functions can be objects, but then there is the post-functionalism move, so…but I digress, completely.

This is where Cultural and Historical Activity Theory (CHAT) come in, which is concerned with the ways in which objects are both socially and objectively constructed. It seems like an attempt at a middle path between social sciences and the physical sciences. This focus on the material and where it intersects with the social is something I really like about this line of thought coming from Marx. It’s interesting that Nicolini uses the phrase “bite back” here to talk about how objects can affect us as well. I seem to remember running across this idea in some of Ian Bogost’s work but I can’t place it right now. It’s an interesting phrase that might be fun to follow in the literature. Anyway CHAT is a relatively recent formulation (relative to activity theory) and credited to Miettinen & Virkkunen (2005). It seems like a useful thing to follow up on in the context of my Web archiving study because I do need a way to talk about the material of the archive, the archival system, the Web and the people working with it (archivists, researchers, etc)–and fitting the analysis into existing work will be helpful.


  • objects and agents emerge together and define each other (Miettinen & Virkkunen, 2005)
  • the object is inherently fragmented (never completely visible, seen in multiple ways)
  • objects evolve: they are always contestable and (often) contested

CHAT folks will often look at at least two activity systems, to show how interactions between activities embed social practices: Knotworking. The resulting networks (???) looks like an important paper to read to follow up on this idea.

Activity systems are, in fact, by definition internally fragmented and inconsistent. The tensions and conflicts emerging from such contradictions constitute the origin and the source of energy for the continuous change and expansion of activity systems and their components. (p. 114)

I’m wondering if there is a connection between the idea of Broken-ness, fragmentation and broken world thinking & repair. The idea of Knotworking (Y. Engeström, Engeström, & Vähäaho, 1999) specifically recalls Jackson, Gillespie, & Payette (2014). I like the idea of zooming on sites of conflict or contradiction as a way of locating activities and practices, and seeing them as integral features, and locations for dialectical processes and resolution (Marx). CHAT also stresses that these sites are also useful as spaces for intervention and redesign. It is suggested that it might be necessary to engage at this level to truly understand the activity. [Antonio Gramsci] is cited here for his idea of organic intellectuals. Engestrom (2000) and Y. Engeström (2001) both look like they could be good things to read to follow up on this idea about interventions, particularly for its focus on ethnographic methods, the necessity to generate thick description. Also there is a connection back to American Pragmatism that seems like an important connection, at least for me (Miettinen, 2006).

It’s a bit early to say, but after reading this chapter about CHAT I feel like I’ve found the conceptual tool I was missing for analyzing my interview transcripts. It also situates my work on DocNow by positioning that work as an intervention for understanding, which is extremely helpful. Nicolini’s critique of a strong version of CHAT, one that treats the activity system itself into a thing itself seems very apt here. Also, some Marxists have criticized CHAT for its conservative use of Marx: fixing small local problems, without looking at the larger picture.


Engestrom, Y. (2000). Activity theory as a framework for analyzing and redesigning work. Ergonomics, 43(7), 960–974.

Engeström, Y. (1987). Learning by expanding: N activity-theoretical approach to developmental research. Orienta-Konsultit.

Engeström, Y. (2001). Expansive learning at work: Toward an activity theoretical reconceptualization. Journal of Education and Work, 14(1), 133–156.

Engeström, Y., Engeström, R., & Vähäaho, T. (1999). Activity theory and social practice: Cultural- historical approaches. In S. Chaiklin, M. Hedegaard, & U. J. Jensen (Eds.),. Aarhus University Press Aarhus,, Denmark.

Jackson, S. J., Gillespie, T., & Payette, S. (2014). The policy knot: Re-integrating policy, practice and design in CSCW studies of social computing. In Proceedings of the 17th ACM Conference on Computer Supported Cooperative Work & Social Computing (pp. 588–602). Association for Computing Machinery.

Kuutti, K. (1996). Activity theory as a potential framework for human-computer interaction research. Context and Consciousness: Activity Theory and Human-Computer Interaction, 17–44.

Kuutti, K., & Bannon, L. J. (2014). The turn to practice in HCI: Towards a research agenda. In Proceedings of the 32nd annual ACM Conference on Human Factors in Computing Systems (pp. 3543–3552). Association for Computing Machinery. Retrieved from

Leont’ev, A. N. (1978). Activity, consciousness, personality. Prentice Hall.

Miettinen, R. (2006). Epistemology of transformative material activity: John dewey’s pragmatism and cultural-historical activity theory. Journal for the Theory of Social Behaviour, 36(4), 389–408.

Miettinen, R., & Virkkunen, J. (2005). Epistemic objects, artefacts and organizational change. Organization, 12(3), 437–456.

Jason Ronallo: The Lenovo X240 Keyboard and the End/Insert Key With FnLk On as a Software Developer on Linux

planet code4lib - Thu, 2016-09-22 15:44

As a software developer I’m using keys like F5 a lot. When I’m doing any writing, I use F6 a lot to turn off and on spell correction underlining. On the Lenovo X240 the function keys are overlaid on the same keys as volume and brightness control. This causes some problems for me. Luckily there’s a solution that works for me under Linux.

To access the function keys you have to also press the Fn key. If most of what you’re doing is reloading a browser and not using the volume control, then this is a problem, so they’ve created a function lock which is enabled by pressing the Fn and Esc/FnLk key. The Fn key lights up and you can press F5 without using the Fn modifier key.

That’s all well and good until you get to another quirk of this keyboard where the Home, End, and Delete keys are in the same function key row in a way that the End key also functions as the Insert key. When function lock is on the End key becomes an Insert key. I don’t ever use the Insert key on a keyboard, so I understand why they combined the End/Insert key. But in this combination it doesn’t work for me as a software developer. I’m continually going between something that needs to be reloaded with F5 and in an editor where I need to quickly go to the end of a line in a program.

Luckily there’s a pretty simple answer to this if you don’t ever need to use the Insert key. I found the answer on askubuntu.

All I needed to do was run the following:

xmodmap -e "keycode 118 = End"

And now even when the function keys are locked the End/Insert key always behaves as End. To make this is permanent and the mapping gets loaded with X11 starts, add xmodmap -e "keycode 118 = End" to your ~/.xinitrc.

Jason Ronallo: Styling HTML5 Video with CSS

planet code4lib - Thu, 2016-09-22 15:44

If you add an image to an HTML document you can style it with CSS. You can add borders, change its opacity, use CSS animations, and lots more. HTML5 video is just as easy to add to your pages and you can style video too. Lots of tutorials will show you how to style video controls, but I haven’t seen anything that will show you how to style the video itself. Read on for an extreme example of styling video just to show what’s possible.

Here’s a simple example of a video with a single source wrapped in a div:

<div id="styled_video_container"> <video src="/video/wind.mp4" type="video/mp4" controls poster="/video/wind.png" id="styled_video" muted preload="metadata" loop> </div>

Add some buttons under the video to style and play the video and then to stop the madness.

<button type="button" id="style_it">Style It!</button> <button type="button" id="stop_style_it">Stop It!</button>

We’ll use this JavaScript just to add a class to the containing element of the video and play/pause the video.

jQuery(document).ready(function($) { $('#style_it').on('click', function(){ $('#styled_video')[0].play(); $('#styled_video_container').addClass('style_it'); }); $('#stop_style_it').on('click', function(){ $('#styled_video_container').removeClass('style_it'); $('#styled_video')[0].pause(); }); });

Using the class that gets added we can then style and animate the video element with CSS. This is a simplified version without vendor flags.

#styled_video_container.style_it { background: linear-gradient(to bottom, #ff670f 0%,#e20d0d 100%); } #styled_video_container.style_it video { border: 10px solid green !important; opacity: 0.6; transition: all 8s ease-in-out; transform: rotate(300deg); box-shadow: 12px 9px 13px rgba(255, 0, 255, 0.75); } Stupid Video Styling Tricks Style It! Stop It!


OK, maybe there aren’t a lot of practical uses for styling video with CSS, but it is still fun to know that we can. Do you have a practical use for styling video with CSS that you can share?

Jason Ronallo: HTML5 Video Caption Cue Settings in WebVTT

planet code4lib - Thu, 2016-09-22 15:44

TL;DR Check out my tool to better understand how cue settings position captions for HTML5 video.

Having video be a part of the Web with HTML5 <video> opens up a lot of new opportunities for creating rich video experiences. Being able to style video with CSS and control it with the JavaScript API makes it possible to do fun stuff and to create accessible players and a consistent experience across browsers. With better support in browsers for timed text tracks in the <track> element, I hope to see more captioned video.

An important consideration in creating really professional looking closed captions is placing them correctly. I don’t rely on captions, but I do increasingly turn them on to improve my viewing experience. I’ve come to appreciate some attributes of really well done captions. Accuracy is certainly important. The captions should match the words spoken. As someone who can hear, I see inaccurate captions all too often. Thoroughness is another factor. Are all the sounds important for the action represented in captions. Captions will also include a “music” caption, but other sounds, especially those off screen are often omitted. But accuracy and thoroughness aren’t the only factors to consider when evaluating caption quality.

Placement of captions can be equally important. The captions should not block other important content. They should not run off the edge of the screen. If two speakers are on screen you want the appropriate captions to be placed near each speaker. If a sound or voice is coming from off screen, the caption is best placed as close to the source as possible. These extra clues can help with understanding the content and action. These are the basics. There are other style guidelines for producing good captions. Producing good captions is something of an art form. More than two rows long is usually too much, and rows ought to be split at phrase breaks. Periods should be used to end sentences and are usually the end of a single cue. There’s judgment necessary to have pleasing phrasing.

While there are tools for doing this proper placement for television and burned in captions, I haven’t found a tool for this for Web video. While I haven’t yet have a tool to do this, in the following I’ll show you how to:

  • Use the JavaScript API to dynamically change cue text and settings.
  • Control placement of captions for your HTML5 video using cue settings.
  • Play around with different cue settings to better understand how they work.
  • Style captions with CSS.

Track and Cue JavaScript API

The <video> element has an API which allows you to get a list of all tracks for that video.

Let’s say we have the following video markup which is the only video on the page. This video is embedded far below, so you should be able to run these in the console of your developer tools right now.

<video poster="soybean-talk-clip.png" controls autoplay loop> <source src="soybean-talk-clip.mp4" type="video/mp4"> <track label="Captions" kind="captions" srclang="en" src="soybean-talk-clip.vtt" id="soybean-talk-clip-captions" default> </video>

Here we get the first video on the page:

var video = document.getElementsByTagName('video')[0];

You can then get all the tracks (in this case just one) with the following:

var tracks = video.textTracks; // returns a TextTrackList var track = tracks[0]; // returns TextTrack

Alternately, if your track element has an id you can get it more directly:

var track = document.getElementById('soybean-talk-clip-captions').track;

Once you have the track you can see the kind, label, and language:

track.kind; // "captions" track.label; // "Captions" track.language; // "en"

You can also get all the cues as a TextTrackCueList:

var cues = track.cues; // TextTrackCueList

In our example we have just two cues. We can also get just the active cues (in this case only one so far):

var active_cues = track.activeCues; // TextTrackCueList

Now we can see the text of the current cue:

var text = active_cues[0].text;

Now the really interesting part is that we can change the text of the caption dynamically and it will immediately change:

track.activeCues[0].text = "This is a completely different caption text!!!!1"; Cue Settings

We can also then change the position of the cue using cue settings. The following will move the first active cue to the top of the video.

track.activeCues[0].line = 1;

The cue can also be aligned to the start of the line position:

track.activeCues[0].align = "start";

Now for one last trick we’ll add another cue with the arguments of start time and end time in seconds and the cue text:

var new_cue = new VTTCue(1,30, "This is the next of the new cue.");

We’ll set a position for our new cue before we place it in the track:

new_cue.line = 5;

Then we can add the cue to the track:


And now you should see your new cue for most of the duration of the video.

Playing with Cue Settings

The other settings you can play with including position and size. Position is the text position as a percentage of the width of the video. The size is the width of the cue as a percentage of the width of the video.

While I could go through all of the different cue settings, I found it easier to understand them after I built a demonstration of dynamically changing all the cue settings. There you can play around with all the settings together to see how they actually interact with each other.

At least as of the time of this writing there is some variability between how different browsers apply these settings.

Test WebVTT Cue Settings and Styling

Cue Settings in WebVTT

I’m honestly still a bit confused about all of the optional ways in which cue settings can be defined in WebVTT. The demonstration outputs the simplest and most straightforward representation of cue settings. You’d have to read the spec for optional ways to apply some cue settings in WebVTT.

Styling Cues

In browsers that support styling of cues (Chrome, Opera, Safari), the demonstration also allows you to apply styling to cues in a few different ways. This CSS code is included in the demo to show some simple examples of styling.

::cue(.red){ color: red; } ::cue(.blue){ color: blue; } ::cue(.green){ color: green; } ::cue(.yellow){ color: yellow; } ::cue(.background-red){ background-color: red; } ::cue(.background-blue){ background-color: blue; } ::cue(.background-green){ background-color: green; } ::cue(.background-yellow){ background-color: yellow; }

Then the following cue text can be added to show red text with a yellow background. The

<>This cue has red text with a yellow background.</c>

In the demo you can see which text styles are supported by which browsers for styling the ::cue pseudo-element. There’s a text box at the bottom that allows you to enter any arbitrary styles and see what effect they have.

Example Video

Test WebVTT Cue Settings and Styling

Jason Ronallo: HTML Slide Decks With Synchronized and Interactive Audience Notes Using WebSockets

planet code4lib - Thu, 2016-09-22 15:44

One question I got asked after giving my Code4Lib presentation on WebSockets was how I created my slides. I’ve written about how I create HTML slides before, but this time I added some new features like an audience interface that synchronizes automatically with the slides and allows for audience participation.

TL;DR I’ve open sourced starterdeck-node for creating synchronized and interactive HTML slide decks.

Not every time that I give a presentation am I able to use the technologies that I am talking about within the presentation itself, so I like to do it when I can. I write my slide decks as Markdown and convert them with Pandoc to HTML slides which use DZslides for slide sizing and animations. I use a browser to present the slides. Working this way with HTML has allowed me to do things like embed HTML5 video into a presentation on HTML5 video and show examples of the JavaScript API and how videos can be styled with CSS.

For a presentation on WebSockets I gave at Code4Lib 2014, I wanted to provide another example from within the presentation itself of what you can do with WebSockets. If you have the slides and the audience notes handout page open at the same time, you will see how they are synchronized. (Beware slowness as it is a large self-contained HTML download using data URIs.) When you change to certain slides in the presenter view, new content is revealed in the audience view. Because the slides are just an HTML page, it is possible to make the slides more interactive. WebSockets are used to allow the slides to send messages to each audience members’ browser and reveal notes. I am never able to say everything that I would want to in one short 20 minute talk, so this provided me a way to give the audience some supplementary material.

Within the slides I even included a simplistic chat application that allowed the audience to send messages directly to the presenter slides. (Every talk on WebSockets needs a gratuitous chat application.) At the end of the talk I also accepted questions from the audience via an input field. The questions were then delivered to the slides via WebSockets and displayed right within a slide using a little JavaScript. What I like most about this is that even someone who did not feel confident enough to step up to a microphone would have the opportunity to ask an anonymous question. And I even got a few legitimate questions amongst the requests for me to dance.

Another nice side benefit of getting the audience to notes before the presentation starts is that you can include your contact information and Twitter handle on the page.

I have wrapped up all this functionality for creating interactive slide decks into a project called starterdeck-node. It includes the WebSocket server and a simple starting point for creating your own slides. It strings together a bunch of different tools to make creating and deploying slide decks like this simpler so you’ll need to look at the requirements. This is still definitely just a tool for hackers, but having this scaffolding in place ought to make the next slide deck easier to create.

Here’s a video where I show starterdeck-node at work. Slides on the left; audience notes on the right.

Other Features

While the new exciting feature added in this version of the project is synchronization between presenter slides and audience notes, there are also lots of other great features if you want to create HTML slide decks. Even if you aren’t going to use the synchronization feature, there are still lots of reasons why you might want to create your HTML slides with starterdeck-node.

Self-contained HTML. Pandoc uses data-URIs so that the HTML version of your slides have no external dependencies. Everything including images, video, JavaScript, CSS, and fonts are all embedded within a single HTML document. That means that even if there’s no internet connection from the podium you’ll still be able to deliver your presentation.

Onstage view. Part of what gets built is a DZSlides onstage view where the presenter can see the current slide, next slide, speaker notes, and current time.

Single page view. This view is a self-contained, single-page layout version of the slides and speaker notes. This is a much nicer way to read a presentation than just flipping through the slides on various slide sharing sites. If you put a lot of work into your talk and are writing speaker notes, this is a great way to reuse them.

PDF backup. A script is included to create a PDF backup of your presentation. Sometimes you have to use the computer at the podium and it has an old version of IE on it. PDF backup to the rescue. While you won’t get all the features of the HTML presentation you’re still in business. The included Node.js app provides a server so that a headless browser can take screenshots of each slide. These screenshots are then compiled into the PDF.


I’d love to hear from anyone who tries to use it. I’ll list any examples I hear about below.

Here are some examples of slide decks that have used starterdeck-node or starterdeck.

Jason Ronallo: A Plugin For Mediaelement.js For Preview Thumbnails on Hover Over the Time Rail Using WebVTT

planet code4lib - Thu, 2016-09-22 15:44

The time rail or progress bar on video players gives the viewer some indication of how much of the video they’ve watched, what portion of the video remains to be viewed, and how much of the video is buffered. The time rail can also be clicked on to jump to a particular time within the video. But figuring out where in the video you want to go can feel kind of random. You can usually hover over the time rail and move from side to side and see the time that you’d jump to if you clicked, but who knows what you might see when you get there.

Some video players have begun to use the time rail to show video thumbnails on hover in a tooltip. For most videos these thumbnails give a much better idea of what you’ll see when you click to jump to that time. I’ll show you how you can create your own thumbnail previews using HTML5 video.

TL;DR Use the time rail thumbnails plugin for Mediaelement.js.

Archival Use Case

We usually follow agile practices in our archival processing. This style of processing became popularized by the article More Product, Less Process: Revamping Traditional Archival Processing by Mark A. Greene and Dennis Meissner. For instance, we don’t read every page of every folder in every box of every collection in order to describe it well enough for us to make the collection accessible to researchers. Over time we may decide to make the materials for a particular collection or parts of a collection more discoverable by doing the work to look closer and add more metadata to our description of the contents. But we try not to allow the perfect from being the enemy of the good enough. Our goal is to make the materials accessible to researchers and not hidden in some box no one knows about.

Some of our collections of videos are highly curated like for video oral histories. We’ve created transcripts for the whole video. We extract out the most interesting or on topic clips. For each of these video clips we create a WebVTT caption file and an interface to navigate within the video from the transcript.

At NCSU Libraries we have begun digitizing more archival videos. And for these videos we’re much more likely to treat them like other archival materials. We’re never going to watch every minute of every video about cucumbers or agricultural machinery in order to fully describe the contents. Digitization gives us some opportunities to automate the summarization that would be manually done with physical materials. Many of these videos don’t even have dialogue, so even when automated video transcription is more accurate and cheaper we’ll still be left with only the images. In any case, the visual component is a good place to start.

Video Thumbnail Previews

When you hover over the time rail on some video viewers, you see a thumbnail image from the video at that time. YouTube does this for many of its videos. I first saw that this would be possible with HTML5 video when I saw the JW Player page on Adding Preview Thumbnails. From there I took the idea to use an image sprite and a WebVTT file to structure which media fragments from the sprite to use in the thumbnail preview. I’ve implemented this as a plugin for Mediaelement.js. You can see detailed instructions there on how to use the plugin, but I’ll give the summary here.

1. Create an Image Sprite from the Video

This uses ffmpeg to take a snapshot every 5 seconds in the video and then uses montage (from ImageMagick) to stitch them together into a sprite. This means that only one file needs to be downloaded before you can show the preview thumbnail.

ffmpeg -i "video-name.mp4" -f image2 -vf fps=fps=1/5 video-name-%05d.jpg montage video-name*jpg -tile 5x -geometry 150x video-name-sprite.jpg 2. Create a WebVTT metadata file

This is just a standard WebVTT file except the cue text is metadata instead of captions. The URL is to an image and uses a spatial Media Fragment for what part of the sprite to display in the tooltip.

WEBVTT 00:00:00.000 --> 00:00:05.000,0,150,100 00:00:05.000 --> 00:00:10.000,0,150,100 00:00:10.000 --> 00:00:15.000,0,150,100 00:00:15.000 --> 00:00:20.000,0,150,100 00:00:20.000 --> 00:00:25.000,0,150,100 00:00:25.000 --> 00:00:30.000,100,150,100 3. Add the Video Thumbnail Preview Track

Put the following within the <video> element.

<track kind="metadata" class="time-rail-thumbnails" src=""></track> 4. Initialize the Plugin

The following assumes that you’re already using Mediaelement.js, jQuery, and have included the vtt.js library.

$('video').mediaelementplayer({ features: ['playpause','progress','current','duration','tracks','volume', 'timerailthumbnails'], timeRailThumbnailsSeconds: 5 }); The Result Your browser won’t play an MP4. You can [download it instead](/video/mep-feature-time-rail-thumbnails-example.mp4).

See Bug Sprays and Pets with sound.


The plugin can either be installed using the Rails gem or the Bower package.


One of the DOM API features I hadn’t used before is MutationObserver. One thing the thumbnail preview plugin needs to do is know what time is being hovered over on the time rail. I could have calculated this myself, but I wanted to rely on MediaElement.js to provide the information. Maybe there’s a callback in MediaElement.js for when this is updated, but I couldn’t find it. Instead I use a MutationObserver to watch for when MediaElement.js changes the DOM for the default display of a timestamp on hover. Looking at the time code there then allows the plugin to pick the correct cue text to use for the media fragment. MutationObserver is more performant than the now deprecated MutationEvents. I’ve experienced very little latency using a MutationObserver which allows it to trigger lots of events quickly.

The plugin currently only works in the browsers that support MutationObserver, which is most current browsers. In browsers that do not support MutationObserver the plugin will do nothing at all and just show the default timestamp on hover. I’d be interested in other ideas on how to solve this kind of problem, though it is nice to know that plugins that rely on another library have tools like MutationObserver around.

Other Caveats

This plugin is brand new and works for me, but there are some caveats. All the images in the sprite must have the same dimensions. The durations for each thumbnail must be consistent. The timestamps currently aren’t really used to determine which thumbnail to display, but is instead faked relying on the consistent durations. The plugin just does some simple addition and plucks out the correct thumbnail from the array of cues. Hopefully in future versions I can address some of these issues.


Having this feature be available for our digitized video, we’ve already found things in our collection that we wouldn’t have seen before. You can see how a “Profession with a Future” evidently involves shortening your life by smoking (at about 9:05). I found a spinning spherical display of Soy-O and synthetic meat (at about 2:12). Some videos switch between black & white and color which you wouldn’t know just from the poster image. And there are some videos, like talking heads, that appear from the thumbnails to have no surprises at all. But maybe you like watching boiling water for almost 13 minutes.

OK, this isn’t really a discovery in itself, but it is fun to watch a head banging JFK as you go back and forth over the time rail. He really likes milk. And Eisenhower had a different speaking style.

You can see this in action for all of our videos on the NCSU Libraries’ Rare & Unique Digital Collections site and make your own discoveries. Let me know if you find anything interesting.

Preview Thumbnail Sprite Reuse

Since we already had the sprite images for the time rail hover preview, I created another interface to allow a user to jump through a video. Under the video player is a control button that shows a modal with the thumbnail sprite. The sprite alone provides a nice overview of the video that allows you to see very quickly what might be of interest. I used an image map so that the rather large sprite images would only have to be in memory once. (Yes, image maps are still valid in HTML5 and have their legitimate uses.) jQuery RWD Image Maps allows the map area coordinates to scale up and down across devices. Hovering over a single thumb will show the timestamp for that frame. Clicking a thumbnail will set the current time for the video to be the start time of that section of the video. One advantage of this feature is that it doesn’t require the kind of fine motor skill necessary to hover over the video player time rail and move back and forth to show each of the thumbnails.

This feature has just been added this week and deployed to production this week, so I’m looking for feedback on whether folks find this useful, how to improve it, and any bugs that are encountered.

Summarization Services

I expect that automated summarization services will become increasingly important for researchers as archives do more large-scale digitization of physical collections and collect more born digital resources in bulk. We’re already seeing projects like fondz which autogenerates archival description by extracting the contents of born digital resources. At NCSU Libraries we’re working on other ways to summarize the metadata we create as we ingest born digital collections. As we learn more what summarization services and interfaces are useful for researchers, I hope to see more work done in this area. And this is just the beginning of what we can do with summarizing archival video.

LITA: Social Media For My Institution – a new LITA web course

planet code4lib - Thu, 2016-09-22 14:22

Social Media For My Institution: from “mine” to “ours”

Instructor: Dr. Plamen Miltenoff
Wednesdays, 10/19/2016 – 11/9/2016
Blended format web course

Register Online, page arranged by session date (login required)

This course has been re-scheduled from a previous date.

A course for librarians who want to explore the institutional application of social media. Based on an established academic course at St. Cloud State University “Social Media in Global Context”. This course will critically examine the institutional need of social media (SM) and juxtapose it to its private use. Discuss the mechanics of choice for recent and future SM tools. Present a theoretical introduction to the subculture of social media. Show how to streamline library SM policies with the goals and mission of the institution. There will be hands-on exercises on creation and dissemination of textual and multimedia content, and patrons’ engagement. And will include brainstorming on suitable for the institution strategies regarding resources, human and technological, workload share, storytelling, and branding and related issues such as privacy, security etc.

This is a blended format web course:

The course will be delivered as 4 separate live webinar lectures, one per week on Wednesdays, October 19, 26, November 2, and 9 at 2pm Central. You do not have to attend the live lectures in order to participate. The webinars will be recorded and distributed through the web course platform, Moodle, for asynchronous participation. The web course space will also contain the exercises and discussions for the course.

Details here and Registration here


By the end of this class, participants will be able to:

  • Move from the state of personal use of social media (SM) and contemplate the institutional approach
  • Have a hands-on experience with finding and selecting multimedia resources and their application for branding of the institution
  • Participants will acquire the foundational structure of the elements, which constitute meaningful institutional social media

Dr. Plamen Miltenoff is an information specialist and Professor at St. Cloud State University. His education includes several graduate degrees in history and Library and Information Science and in education. His professional interests encompass social Web development and design, gaming and gamification environments. For more information see

And don’t miss other upcoming LITA fall continuing education offerings:

Beyond Usage Statistics: How to use Google Analytics to Improve your Repository
Presenter: Hui Zhang
Tuesday, October 11, 2016
11:00 am – 12:30 pm Central Time
Register Online, page arranged by session date (login required)

Online Productivity Tools: Smart Shortcuts and Clever Tricks
Presenter: Jaclyn McKewan
Tuesday November 8, 2016
11:00 am – 12:30 pm Central Time
Register Online, page arranged by session date (login required)

Questions or Comments?

For questions or comments, contact LITA at (312) 280-4268 or Mark Beatty,

Open Knowledge Foundation: Spotlight on tax evasion: Connecting with citizens and activists working on tax justice campaigns across Africa

planet code4lib - Thu, 2016-09-22 10:40

Open Knowledge International is coordinating the Open Data for Tax Justice project in partnership with the Tax Justice Network to create a global network of people and organisations using open data to inform local and global efforts around tax justice.

Tax evasion, corruption and illicit financial flows rob countries around the world of billions in revenue which could be spent on improving life for citizens.

That much can be agreed. But how many billions are lost, who is responsible and which countries are worst affected? Those are difficult questions to answer given the lack of transparency and public disclosure in many tax jurisdictions.

The consensus is that it is the economies of the world’s poorest countries which are proportionally most affected by this revenue loss, with African governments estimated to be losing between $30 billion and $60 billion a year to tax evasion or illicit financial flows, according to a 2015 report commissioned by the African Union and United Nations.

International bodies have been slow to produce solutions which fight for the equitable sharing of tax revenues with lobbying leading to a retrenchment of proposed transparency measures and scuppering efforts to create a global tax body under the auspices of the UN.

More transparency and public information is needed to understand the true extent of these issues. To that end, Open Knowledge International is coordinating the Open Data for Tax Justice project with the Tax Justice Network to create a global network of people and organisations using open data to improve advocacy, journalism and public policy around tax justice.

And last week, I joined the third iteration of the International Tax Justice Academy, organised by the Tax Justice Network – Africa, to connect with advocates working to shed light on these issues across Africa.

The picture they painted over three days was bleak: Dr Dereje Alemayehu laid out how the views of African countries had been marginalised or ignored in international tax negotiations due in part to a lack of strong regional power blocs; Jane Nalunga of SEATINI-Uganda bemoaned politicians who continue to “talk left, walk right” when it comes to taking action on cracking down on corrupt or illicit practices; and Professor Patrick Bond of South Africa’s Witwatersrand School of Governance foresaw a rise in violent economic protests across Africa as people become more and more aware of how their natural capital is being eroded.

Several speakers said that an absence of data, low public awareness, lack of political will and poor national or regional coordination all hampered efforts to generate action on illicit financial flows in countries across Africa. Everyone agreed that these debates are not helped by the opacity of key tax terms like transfer pricing, country-by-country reporting and beneficial ownership.

“…an absence of data, low public awareness, lack of political will and poor national or regional coordination all hampered efforts to generate action on illicit financial flows”

The governments of South Africa, Nigeria, Kenya and Tanzania may have all publicly pledged measures like creating beneficial ownership registers to stop individuals hiding their wealth or activities behind anonymous company structures. But at the same time a key concern of those attending the academy was the closing of civic space in many countries across the continent making it harder for them to carry out their work and investigate such activities.

Michael Otieno of the Tax Justice Network – Africa told delegates that they should set the advocacy agenda around tax to ensure that human rights and development issues could be understood by the public in the context of how taxes are collected, allocated and spent. He encouraged all those present to combine forces by adding their voices to the Stop the Bleeding campaign to end illicit financial flows from Africa.

Through our Open Data for Tax Justice project, Open Knowledge International will be looking to incorporate the views of more civil society groups, advocates and public policy makers like those at the tax justice academy into our work. If you would like to join us or learn more about the project, please email


Subscribe to code4lib aggregator