Work This Week – Week 1

Since I’ve been falling off on my weekly photo posts, I figure I’ll start a weekly work series. While that doesn’t seem to make sense . . . it does. I am really bad about keeping track of the good things, the progress, the little bits that add up. I am very good at looking at large, looming disasters. I’m hoping that documenting progress will help convince me that I am making progress, that I am doing small things to help people do a bit more.


VCU Qatar – Online Art History/Museology Courses

This is part of three online courses being created to help teach art history and two other arts/museology related courses for VCU Qatar. My role in this is more of a consultant (web design is being done externally by CHIPS NYC1) but I’ve built a few things to help get us past (or into) some sticking points.

I used one of the HTML5up templates to make this super quick example. I’m not thrilled to have a white guy doing the video but it was the highest production value I found after a quick search (that might be shaped by having to use English). The text is from one of the professors although I chopped it up a bit. There’s the ugly start to a Timeline JS project in there.2

Instagram Shortcode

After getting frustrated with the requirements for the Instagram API stuff, I made a plugin that uses the PHP scraper so I can grab a certain number of images by user or tag without having to authenticate. It’s an evolution of the page template version I made a while back. It’s one of those moves from a one-off item to something that’s more flexible in a variety of scenarios. I need to figure a better way to show that kind of progression of time/energy/tools.

Random Post

Dan wanted a random post from his Sports Law Spotting site. Facet WP made it easy for me to do that without doing any custom work. Just make a new template. In this case, it’s getting posts that are in the question category and the “orderby” => “rand” gets us the random post. Now we can stick it wherever via shortcode. Nothing fancy but far handier than creating a whole child theme . . .

return array(
  "post_type" => "post",
  "post_status" => "publish",
  "orderby" => "rand",
  "order" => "DESC",
  "posts_per_page" => 1,
  "tax_query" => array(
      "taxonomy" => "category",
      "field" => "slug",
      "terms" => "question"

H5P – Empty Library

Michael mentioned that after creating content using the H5P plugin his library remained empty. I hadn’t noticed that but it proved to be the case for me as well on another site in our install. On my local development install things worked correctly. I’m still trying to figure out why it’s not finding content (I suspect either our divided database or maybe NGINX) but in the meantime, I went to create a new H5P element and took note of the URL. Even with an empty library we can navigate through the content using the URLs. gets us to the edit page for our 3rd item. Not a solution but a temporary way to limp along and proof the items are saving, they just don’t show up on the library page for some reason.

Flux Tower & Other Rice Center Data

I had a meeting with the VCU Rice Center group and will be working with them around constructing some explorable explanation options for the data they’re capturing around all sorts of environmental variables. Some of this is driven by the installation of a Flux Tower but there’s also just a ton of data they gather that will be fun to figure out. There is much, much data. I’m looking at options like Crossfilter to deal with both scale and getting some of the interaction done without tons of custom work.

Digital Humanities History Syllabus

I’m co-teaching a digital humanities history course next semester with Dr. Ryan Smith. We’re working on the syllabus now. It’s going to be an interesting experience as it’s a new course for VCU. I was a history major as an undergrad but it’s been a good while for me. Just thinking about some general skill/disposition/tool relationships has been a bit intimidating. There is a lot to consider. I threw some notes on one of the readings Ryan suggested as a bit of practicing what I preach and trying to get a better handle on how digital humanities thinks about itself. It’s kind of weird in that I think about this stuff all the time but not really through the same lenses/words. At times “digital humanities” feels a bit confining.


I’m reading Maria Montessori’s works from Project Gutenburg. I may re-read some Papert and, if I can take the depression, Illich.

Sports, Social Media, and Freedom of Speech

I did a guest spot in Dan’s Sports Law class to talk about issues involving student-athletes and social media restrictions. Once upon a time I played football in college and then went on to be an academic coordinator for student-athletes for a few years. That gives me a bit of credibility beyond the social media stuff. I did a little research getting ready and was really impressed by this article (and a bit dismayed by the comment). The presentation is embedded below. Click on it once and then you can navigate with your sideways arrow keys.

Sites in Progress

I’m working on Footsteps on the James and revising the Text Set site I did about 3 years ago. It’s always crazy to look back at how bad I was at things. I did all sorts of crazy stuff to make this particular site work and I won’t be able to easily undo them.

The one semi-interesting thing that I did to improve things was to deal with associating books with particular units. Originally, I’d sort of made this work by filling in a Gravity Form field via a URL parameter. So when you make a Unit that has many books associated with it, you’d end up with a URL that would fill in the right tag for the book. That works fine until you navigate away and come back to the naked URL (no ?tag=item777).

With a bit of javascript I am now able to set that field no matter what.

Luckily, I have the tag written in the body of the post (although this could be better and it could be in a specific div with an id).

So with some jQuery . . . I can get the item and then set the field.

jQuery(document).ready(function($) {
	if (jQuery(".items").find("strong").html()){
	var unique = jQuery(".items").find("strong").html(); //get item
	document.getElementById('input_1_18').value=unique; //set field


Odds & Ends

I presented a one hour workshop on Rampages/WordPress. Not sure how effective that is with low attendance (~6 people). At some point it seems you’re so small there’s no size benefit and you just lose out on individualizing the conversation. I think targeting by discipline or something might make more sense. It also feels like any sessions ought to getting increasingly specific – move from a survey to more particular items with increasing specificity/sophistication.

Also sat through any number of meetings. Some beneficial. I continue to assure people that ALT Lab (my department) still exists and will continue to exist.

1 Who do seem pretty awesome. Their work is really nice and I love thinking about this move from a FileMaker Pro/AppleScript solution into WordPress.

2 I’ve had issues with that site loading very slowly in Chrome Canary so I’ve been linking to the version I keep on GitHub to increase speed.

Weekly Web Harvest for 2016-11-06

  • Episodes – Do Not Track
  • Young Adolescents as Likely to Die From Suicide as From Traffic Accidents – The New York Times

    It is now just as likely for middle school students to die from suicide as from traffic accidents.

    That grim fact was published on Thursday by the Centers for Disease Control and Prevention. They found that in 2014, the most recent year for which data is available, the suicide rate for children ages 10 to 14 had caught up to their death rate for traffic accidents.
    The immediate lunge into blaming social media seems like it needs more factual/research support.

  • Spanish parents urged to put children on weekend homework strike | World news | The Guardian

    Parents in Spain are being urged to go on a weekend homework strike this month in protest against the “unacceptable” amount of after-school tasks their children are given.

    The homework load of Spanish children has long been a sore point with some parents, who argue that the burden is too great, places too much pressure on pupils and eats into family time.

    According to a 2012 study by the Organisation for Economic Co-operation and Development, Spanish 15-year-olds have 6.5 hours of homework a week compared with an average of 4.9 across the 38 OECD countries.

  • Nothing To Do With Arbroath: Mystery monkey on the loose in Florida thought to be heading south

    Humans find them interesting and think they’re cute so humans try to make friends with them. They end up inevitably getting bit and then people want to kill the monkey.”

  • no, Microsoft Word really is that bad – Text Patterns – The New Atlantis

    Word is a nightmare, because in such matters its consistent practice is to do what it thinks you probably want to do, or what it thinks you should do. Contrast that to a program that genuinely cares about formatting, LaTeX, which always does precisely what you tell it to do. Now, this mode of doing business can generate problems of its own, as every user of LaTeX knows, since from time to time you will manage to tell it to do something that you don’t really want it to do. But those problems are always fixable, and over time you learn to avoid them, whereas in Word anything can happen at any time and you will often be completely unable either to figure out what happened or set it right.

    Feels a bit like other systems/programs/people who pretend to know what you want to do . . .

Weekly Web Harvest for 2016-10-30

Weekly Web Harvest for 2016-10-23

  • Of Course Westworld’s Costumes Are 3D-Printed, Too – Racked

    With the exception of some places in Italy or maybe England, you honestly can’t find beautiful, intricate fabrics anymore. It’s really sad! So we had to hire 3D printers in Los Angeles to reprint all our vintage fabrics so we could have more — and then beg them to work around our crazy TV schedules.

  • Vine star Logan Paul profile – Business Insider

    A source close to the stars went so far as to say it’s a combination of living on Vine Street and the re-Vine tool — not necessarily talent — that keeps these stars on top.

    “You literally have the top 30 Viners creating what is nearly all of the content that is being viewed on Vine,” he said. “And all they do is just help each other get bigger and bigger. It’s not a democracy,” he adds. “Probably for a lot of people who want to do cool things on Vine, it’s discouraging.”

  • Found Objects & Focus on the Details: A Look at Sculpture Artist Nemo Gould’s Upcoming Solo Show | SF Station – San Francisco’s City Guide

    Each piece is a feat of engineering with many moving parts, lights and little secret components—rewarding tidbits for observant viewers who are also willing to take their time and go in for a careful look.

    Each piece evolves through a very long chain of improvised connections between the many objects in my collection. The process really starts with the gathering and sorting of these found objects. I often describe what happens next like a jigsaw puzzle. I look for obvious connections between shapes and themes, and then gradually work through finer levels of detail and complexity until a piece feels finished.

  • This ‘disgusting’ app for rich people is actually all of us – The Washington Post

    This was, incidentally, part of CEO Juraj Ivan’s motivation for launching Rich Kids: to separate the boring capitalist antics of the bourgeoisie from the more impressive Instagram posturing of the super-rich. Since 2012, Instagram’s upper crust has used the hashtag #RKOI to flag their extravagant displays of wealth — but over time, it’s gotten far less exclusive.

    “The problem with a hashtag,” the 28-year-old quips, “is that anyone can use it.”

  • terra.js

    A JavaScript library for simple biological simulations and cellular automata.

  • Attending to the Digital

    O, but they say the tongues of dying men
    Enforce attention like deep harmony:
    Where words are scarce, they are seldom spent in vain.

    “You get a push notification on your phone to tell you Kim Kardashian was robbed at gunpoint in her exclusive Paris hotel room. What are we supposed to do with that information? How do we learn to see differently and not just react to what’s “obvious” about these sorts of stories?”

    It’d be fun to build a push interceptor/judo thrower that appends various actions around wandering/creating to push messages . . . Kim Kardashian was robbed . . . write a poem about it . . . research the area . . . localize it . . . make it relevant . . . donate to prevent/encourage future occurrences etc. etc. It wouldn’t help attention but it’d be interesting.

  • Asked and Answered – Futility Closet

    It was true. On his application form Turing had encountered the question “Do you understand that by enrolling in the Home Guard you place yourself liable to military law?” He could see no advantage in answering yes, so he answered no, and the clerk had filed the form without looking at it.

Making Google Scripts & Google Sidebars Talk

flickr photo shared by Internet Archive Book Images with no copyright restriction (Flickr Commons)

Sometimes you want a Google Sidebar element to be able to pull variables from a Google Script. The key element is I’m still not entirely sure I have this in my head deeply/correctly but this is functional and might help someone else (even if that someone is just me at a later point in time when I’ve forgotten this).

This one sets some default times based on spreadsheet variables stashed elsewhere and then automates some date/time entries using the form sidebar.

Sidebar Code

function onSuccess(startTime) {        
        document.getElementById('startTime').value = startTime; //thing you want done after getting the variable
          .getDefaultStartTime(); //name of Google Script function you want the variable from                

Google Script Code

function getDefaultStartTime(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('validation');
  var am = sheet.getRange("C1").getValue();
   h = (am.getHours()<10?'0':'') + am.getHours(),
   m = (am.getMinutes()<10?'0':'') + am.getMinutes();
   var startHr = h + ':' + m;
   return startTime;

The entire sidebar/script setup is below in case anyone cares for some reason.

//adds menu item
function onOpen() {
      .createMenu('Add Time')
      .addItem('Do it!', 'addTime')

//set validation elements 
function validationRighter(){
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var meetColumn = ss.getSheetByName('Sheet1').getRange('C2:C'); //meeting types
    var meetValidationValues = ss.getSheetByName('validation').getRange('A1:A40').getValues();
    var meetRule = SpreadsheetApp.newDataValidation().requireValueInList(meetValidationValues).build();
    var appColumn = ss.getSheetByName('Sheet1').getRange('D2:D'); //application options
    var appValidationValues = ss.getSheetByName('validation').getRange('B1:B40').getValues();
    var appRule = SpreadsheetApp.newDataValidation().requireValueInList(appValidationValues).build();
    var userColumn = ss.getSheetByName('Sheet1').getRange('E2:E'); //teacher signup options
    var userValidationValues = ss.getEditors();
    var userRule = SpreadsheetApp.newDataValidation().requireValueInList(userValidationValues).build();

//add time sidebar creation
function addTime() {
  var html = HtmlService.createHtmlOutputFromFile('sidebar')
      .setTitle('Add Time')
  SpreadsheetApp.getUi() // Or DocumentApp or FormApp.

//enter days in 15 min intervals
function enterDay(theDate,startTime,endTime) {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getActiveSheet();
 var lastRow = parseInt(sheet.getLastRow())+1;
  var startH = startTime.split(':')[0];
  var endH = endTime.split(':')[0];
  var startM = startTime.split(':')[1];
  var d = new Date();
  var totalHours = endH-startH;
  for (i = 0; i < (totalHours*4)+1; i++) { 
    var mins = (d.getMinutes()<10?'0':'') + d.getMinutes();//make sure has leading 0
    d = new Date(d.getTime() + (15*60000)); //adds 15 mins

function hideAllRows(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lastRow = sheet.getLastRow();
  sheet.hideRows(2, lastRow);

function processForm(formObject) {
  var theDate = formObject.theDate;
  var startTime = formObject.startTime;
  var endTime = formObject.endTime;
  var hideRows = formObject.hider;
  if (hideRows === 'on'){
  enterDay(theDate, startTime, endTime);

function getDefaultStartTime(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('validation');
  var am = sheet.getRange("C1").getValue();
   h = (am.getHours()<10?'0':'') + am.getHours(),
   m = (am.getMinutes()<10?'0':'') + am.getMinutes();
   var startHr = h + ':' + m;
   return startHr;

function getDefaultEndTime(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('validation');
  var pm = sheet.getRange("C2").getValue();
   h = (pm.getHours()<10?'0':'') + pm.getHours(),
   m = (pm.getMinutes()<10?'0':'') + pm.getMinutes();
  var endHr = h + ':' + m;;
  return endHr;

Pick Your Date

Start/End Times

Hide Previous Dates

Interactive Google Sheets Dashboards


It’s pretty easy to put a bunch of data and charts in a spreadsheet and call it a dashboard. It became a more interesting challenge to make those charts change to reflect variables chosen via dropdown cell menus.

The key it turns out is using =query.

I can do some really powerful things with query and as long at the data bounds (columns/rows) are the same, I can change the content and it’ll replicate in the chart assigned to those columns/rows.

For instance, I can have raw data on a sheet called data.

I can use query on that data on another sheet with something like =query(data!A1:N,”select B,C,D,E,F,G,H,I,J,K,L,M,N where A=”&”‘”&A2&”‘”)

That formula is going to the sheet named data and querying cells A1 through N(whatever the last row is) and selecting columns B through N where the content of cell A matches the text of cell A2 on the local page. As a result we can manipulate the contents of cell A2 and change the data being returned. In this case I did a little data validation drop down to restrict it to the three items for which we have data. Do take note that for numbers I could have just appended the cell reference (&A2 in this case) but because it was a text match I had to staple on single quotes on either side of the value (“&”‘”&A2&”‘”). It took me a while to realize that. Hopefully this saves someone else from the hassle.

Once you’ve got the data you want showing up, you can select it and insert the chart. Now changing your drop down variable changes your chart because it changes the data it’s based off of. Neat.

You’ll note I stuck the query data way off to the right. Turns out hidden columns won’t display chart data.

The actual spreadsheet is embedded below. You should be able to select different values in cells A2 and B2 and see the subsequent change in charts.

Weekly Web Harvest for 2016-10-16

  • Infinite Jukebox for Make It Funky by John Lee Hooker

    fun tool

    h/t John Freyer

  • WordPress Without Shame

    Ultimately, as a director, I am obligated to consider all the technologies that can help our client achieve our goals—including the old, boring ones. Enter WordPress.

  • Monday Night Raw To Host Presidential Tables, Ladders, and Chairs Match


    The school also plans to host various social media workshops focused on teaching people how to effectively communicate via social media. These seminars will cover subjects like, do’s and don’ts of Facebook (with an emphasis on posting “like a mom”), what all the five primary social media outlets are and how to tell the difference between them, and why no one likes rampages.

Spreadsheet Karma

=QUERY({C:C,C:C},”select Col1, count(Col2) where Col1 <> ” group by Col1″,1)

This is just so handy for getting all the unique values from a column and spitting them out with the counts of their occurrences.1

I can’t tell you how many times I’ve done this a much harder way.

I saw the function above as an answer after I’d responded to a Stack Overflow question about getting unique word counts.

Just another little example of how doing things in the open and being involved in communities ends up benefitting you in unexpected ways.

flickr photo shared by New York Public Library with no copyright restriction (Flickr Commons)

1 If you data isn’t in column C, just change it to the right letter.

Weekly Web Harvest for 2016-10-09

  • Monday Night Raw To Host Presidential Tables, Ladders, and Chairs Match


    The school also plans to host various social media workshops focused on teaching people how to effectively communicate via social media. These seminars will cover subjects like, do’s and don’ts of Facebook (with an emphasis on posting “like a mom”), what all the five primary social media outlets are and how to tell the difference between them, and why no one likes rampages.

  • Chrome Music Lab

    Some fun stuff

  • Avoid “Culture Fit” If You Want Innovation – The Creativity Guru

    “that human-resources staff, when considering recent college hires, ranked cultural fit above a candidate’s referrals, coursework and grades.” (If you’re not white and male, this probably isn’t a surprise. And you’re probably not excited by the idea of playing a spin the wheel game, with three white guys, in a pit full of balls.)

    Your work is meaningless. Your grades don’t matter. Just agree with us on stuff.

    Also I would not enjoy playing spin the wheel in a ball pit with three white guys.

  • Officials confirm 4-year-old Rebecca Lewis found safe in Memphis; West Hogs in custody

    Polk County Sheriff Grady Judd of Florida has a message for the suspected kidnapper, who legally changed his name to West Wild Hogs from Matthew Clark Pybus: “Don’t you hurt that baby.”

  • Hillary Clinton’s campaign builds a bot that sends you Donald Trump quotes – The Verge

    —really an interesting application of new possibilities

    In the last month alone, HFA has also produced a Pokémon Go-aping game designed to influence swing states, and an online fact-checking tool that worked overtime during the debates themselves. As it launched Text Trump this week, the campaign also released its I Will Vote bot, an assistant for Facebook Messenger that checks whether you’re registered to vote, and helps you sign up if you’re not yet on the books.