Data Wrangling

I decided to roll our own form and review management for the Network Music Festival despite how much work this was the last time I did it. I also wanted to stop using Google and to have more flexibility.

So we deployed Ninja Forms, which has high ratings and worked great on a test website.

But then we started getting some emails. Some forms would not submit. There were no error messages in the logs. I tried a lorem ipsum generator and it wasn’t the amount of text. It wasn’t the special symbols. It worked great on the test website!

So we switched to google docs.

So then, when the call ended, I had to merge a bunch of spreadhseets together and then break them up again by what sort of performance people submitted. This is tedious and there’s always a risk of clobbering somebody’s data.

Then everything must get an ID. Rather than write a macro, I did it by hand. Which, again, is risky.

Finally, that done, I need to generate documents or whatever for reviewers to look at. In this case, I did write a macro. But then I wanted to convert all the URLs into clickable links. So I learned a little bit about how the python API works with LibreOffice.

I generally think of myself as fairly intelligent, but I found the documentation extremely hard to navigate. It definitely would have been faster and easier to also do this by hand, but by then the time reading the documents was a sunk cost.

So here’s how I’ve done it. I did a merge with the spreadsheets and a template, which is also a convoluted process that tends to crash things, because why wouldn’t it? I generated a large number of .odf files, one for each submission.

In open office, I went to Tools → AutoCorrect Options... → Options tab →
☑ ☑ URL Recognition

I turned off everything else in autocorrect. I don’t want to mangle anybody’s spelling capitalisation, etc.

Then I wrote a Python script:

# import socket  # only needed on win32-OOo3.0.0
import uno

# get the uno component context from the PyUNO runtime
localContext = uno.getComponentContext()

# create the UnoUrlResolver
resolver = localContext.ServiceManager.createInstanceWithContext(
				"", localContext )

# connect to the running office
ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
smgr = ctx.ServiceManager

# get the central desktop object
desktop = smgr.createInstanceWithContext( "",ctx)

# access the current writer document
model = desktop.getCurrentComponent()

# get the dispatcher
dispatcher = smgr.createInstanceWithContext( "", ctx)
doc = model.getCurrentController()

# run the commands
dispatcher.executeDispatch(doc, ".uno:AutoFormatApply", "", 0, ())
dispatcher.executeDispatch(doc, ".uno:Save",  "", 0, ())
dispatcher.executeDispatch(doc, ".uno:Quit", "", 0, ())

I found a lot of useful documentation for this at:

Now, obviously, that connects to a running version of libreoffice which has the document you want already open. Obviously. There’s a command line for libreoffice that does a few things, including opening a port to listen for python commands. It also does file conversions.

Before I go, I /know/ I could have done a file conversion in the python script, but sometimes, when evaluating time save shortcuts, it’s important to make a note of how long it would take to figure out the shortcut. None of the commands called in my python script take arguments. I’m sure passing arguments is straightforward and also not documented anywhere on the official site. (If this is wrong, I’m sorry, but yikes, you guys.)

So I wrote a bash script that traverses a directory and also calls the python script


for file in *.odt
    soffice $file --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager" --headless &
    sleep 3
    python3 ../
    wait $pid
    soffice --headless --convert-to htm:HTML $file
    rm $file

That sleep is in there because you have to wait for writer to get going and allocate a port or else the python script hangs and everything goes to hell.

The next step is to allocate 2 reviewers (one from column A and one from column B) to every item, making sure that every reviewer gets no more than 5 items, mark this in a spreadsheet and email them off.

I expect this will also take about 5 times as long as doing it by hand.

Collaborative Live Coding via Jitsi Meet for Linux Users

Jitsi Meet works best in Chromium, so these instructions are for that browser. It also assumes that your live coding language uses Jack Audio.

Jack and Pulse

The first thing you need to do is to get Pulse Audio and Jack Audio running at the same time and talking to each other. For me, I was able to solve this in Qjackctl. In settings, under the option tab, go to Execute Script after startup. Paste in “pactl load-module module-jack-sink channels=2; pactl load-module module-jack-source channels=2; pacmd set-default-sink jack_out” without the quotes.

You can test if both are running at once by starting jack and then playing audio from a normal system program like your web browser. If you hear sounds, it worked.

More information about getting both running is here.

Jack Audio – Pulse Sink

Make Connections

You get two sinks. One of them is going to be used to send audio into Jitsi and the other will be used to get audio out.

Jack with two Pulse sinks and the system in/out

Start your live coding language audio server. (Ie Boot SuperCollider). Go back to Qjackctl. Click on connections. Go to the Audio tab. Make a connection from your live coding language output to Pulse Audio Jack Source-01 input. Do this by clicking on the language in the left column and the Source-01 in the right column so both are highlighted. Then click the “Connect” button on the lower left.

Disconnect the the system output from that Source’s input if you want to turn off your microphone. Do this by clicking on the system in the left column and Source-01 in the right column and clicking the “Disconnect” button.

Everything connected correctly

Chromium Settings

(These will also work for Chrome.)

First open your Jitsi Meet connection. If you are using the server at, you can skip this step.

For most other Jitsi servers, in Chromium, go to chrome://settings/content/microphone Change the mic input to Pulse Audio Jack Source-01.

Chromium Settings

Jitsi Settings

As we’re live coding, you’ll want to share your screens. Mouse over the screen so you can see the icons at the bottom appear. The one in the lower left corner looks like a screen. Click on it.

The farthest left is the screen

It lets you pick a video source. If you’re on Wayland, like most linux users have been for years now, you can share your entire screen, but you should be able to share a single window. If you don’t see your live coding language listed as a window, make sure Chromium and it are on the same virtual desktop.

Share Your Screen

Click the screen icon again to switch back to your webcam.

Fancy New Options

If you’re on a shiny new version of jitsi, such as the one at, You’ll see little carrots by the mic and video icons in the centre bottom of your browser window.

New Features!!

These allow you to pick your audio source without having to go into Chrom/ium settings. If you have more than one webcam, you can also pick which one you want to use there, without having to go into Chrom/ium settings for that either.

Be Careful of Levels!

Jitsi was made assuming that more or less one person would be talking at a time, so multiple streams at full volume can distort. Make sure to leave your output low enough to leave room for your collaborators. Your system volume controls will not work, so be sure to set the levels in your live coding language IDE.

Also be aware that while the compression sounds good for free improvisation on acoustic instruments, the transformations on digital audio will seem more pronounced. Go with it. This is your aesthetic now.

Scores for Quarantine 2: Homage to Norman Rockwell

For four or more players.


Players assign themselves positions in a virtual circle.

Using two different communications devices, players make an audio connection to the players on their left and right, but no other players.

Improvise in this trio.


One possible setup for this might be to use two phones and use one ear bud from each.

Using a mixer would also be possible, but heapdhones are still advised to prevent sounds from the distant players reaching each other.


Just using a real telephone is fine, but any audio software will work.


If everyone is using two mobile phones, call recording software running on every single one of them could potentially be mixed together to make a large piece, but it may be that this piece is only meaningful to participants.

This score is Creative Commons Share-a-like

Have you tried playing it? How did it go? Were you able to record it?

Telematic Performance and e-learning

I’ve put some resources up for my students and I’m going to copy them here in case they’re of wider interest. I’ve made instructional videos for using some of the tools.

Online Meetings / Online Jams

  • Jitsi Meet– Doesn’t spy on you or sell your data. Can be used via mobile device with a free app or accessed via a web browser on your computer. Users without either of these can call in using local numbers in several countries. Can record to Dropbox or stream to YouTube. Works best with chromium/chrome. Some people have good luck with Firefox. Safari has poor results.

Telematic Performance Software and Platforms

  • OBS Studio – Stream Audio and Video and/or record your desktop. (How to use on mac.)
  • Upstage – Cyber performance platform, mostly used by artists.
  • LNX Studio – Collaborative platform for making popular music across a network. Mac only. Last updated in 2016, so may not work with the newest macs.
  • Soundflower – Zero latency audio routing for mac. (Use it to get audio to and from jitsi meet and OBS.)
  • BlackHole – Even more zero latency audio routing for mac. (See above.)

Video Tutorials

Made by me. My students like videos. I’ll post text here later. All of these are for Mac.

Video chat apps: a review

The Good: Jitsi

Jitsi meet is by far the easiest video chat system to use. Go to, type in a meeting name and give the resulting URL to everyone you want to chat with. This url stays good whenever you want it. There are no fees or limits. It doesn’t spy on you. It works via a web browser or free apps for android or iOS.


This works ok in firefox with very small groups. If you have a lot of participants, you’ll need to use chromium or chrome.

The video source is only from the webcam. Doing audio routing from anything other than the microphone is tricky.

Work arounds

The main public server is put up by the developers at no cost. It seems to be in north america. The recent surge in traffic seems to have impacted the quality. The server software, however is free and open source and apparently very easy to deploy in ubuntu – if you’re willing to pay £50/month for a VM or have a fixed IP address. This is obviously a huge barrier to entry for people who want their own jitsi meet server, but a single small server can accommodate many hundreds of users. This could be a good community project.

The Bad: Zoom

Starting with the positive, zoom has a good user experience. It allows you to share your desktop as well as your webcam so if more flexible. If you download the app, you can also do audio mixing, so you get sound from your system easily. It can also be used to record your desktop to a small file format, which makes it useful for people who want to make videos to post online.


Zoom is a for-profit company aimed at a corporate audience. This has several implications. The most obvious is that they charge for the service if your meeting goes over 40 minutes. The less obvious implication is that the service is part of a corporate panopticon. Your text chat logs are sent to your “boss” in the chat, as are reports of how much time you spent looking in other windows. You can be virtually present, but you will be surveilled.

Even less obvious is the company’s historic privacy abuses, including installing a secret webserver on your computer to allow any app to get access to your webcam, in case the whole report of whether you were paying attention didn’t seem Black Mirror enough by itself. Proton mail has a good write-up of the privacy issues.

Work arounds

This is some closed source commercial software, so your best hope to improve it is communist revolution. Right now, you have no rights.

The Ugly: House Party

House party is a consumer focussed app that features up to 8 participants and some ability to play games. It’s got a social media aspect, so you can find if your friends are on and go crash their meetings / parties.


When I tried this, the games didn’t seem to work and the video quality was appallingly bad.

House Party is a for-profit service aimed at a home audience and this has several implications. They don’t charge the users, which means that we are the product being sold to somebody else. I didn’t notice any advertising within the chat, which suggests that the data is being sold on to third parties.

There is Facebook integrations, which strongly suggests that your data (including who you are talking to, from where and for how long) are being joined with the information already present in your facebook profile. This profile follows you around the web and tries to figure out everything you are doing and looking at.

In case you don’t sign in with facebook, it also asks for your email address, date of birth and phone number. Most users accept this for verification, but it’s a lot of information to give away and can definitely tie you to a specific identity. This could include a facebook shadow account that collects data even on people who deleted their accounts or never signed up in the first place. That Forbes found this to be ok only shows how much people are willing to accept surveillance capitalism as the norm. It should not be the norm.

One PhD student in privacy law notes that their TOS do not appear to comply with the GDPR.

This software doesn’t support Android users. You can use it via a chrome plugin.

Work Arounds

Still communist revolution. You’re not even the customer of this app. You’re the product. If this app were a pet store, you would not be the person looking to buy a snake. You would be a feeder rat they’ll come back to buy later.

Too obviously terrible to discuss in detail

Obviously anything directly run by Google or Facebook exists to harm your privacy.

What are you using?

Drop a comment and I’ll check it out.

I’m finding that video chat with groups larger than four is tedious, partly because of a lack of geometry. At an actual party, people break into smaller groups physically separated from each other. Also, video quality tends to be low, especially during peak internet usage times. Could Second Life with voice chat be the answer?

Scores for Quarantine 1: Jitsi Solos


Players connect to Jitsi Meet.

Everyone plays background textures.

When the textures have gone on long enough, tale a solo.

When the solo has gone on long enough, stop.

If anyone starts soloing while you are soloing, stop your solo immediately.


Players must have a phone, or a tablet or a laptop.

Headphones are recommended.


Chromium browser (or Chrome), if the players are using laptops.

Players on tablets or smart phones can use free Jitis Software.

Players can also just dial in to the phone number provided by the jitsi meet server.


Record to dropbox or stream to youtube via the links provided by jitsi meet.

This score is Creative Commons Share-a-like

Please let me know if you tried playing it. How did it go? Send me a link to the recording?

How to give a speech at a protest, demonstration or rally

The recent London Met police watchlist specifically was worried about the radicalising power of emotive speech. This is because emotive speech works. You can list facts and figures in your speech, and you should, but people act based on how they feel. Conveying a sense of urgency, outrage and hope, simultaneously is the heady mix to build a movement and actually create change, no matter the issue.

Being outside is inherently distracting and you need to keep energy high, so keep the speech short. 3-5 minutes is ideal. You also want to make sure to keep people engaged, so starting with some chanting or call and response is a great way to give people some initial energy. The chants you use at this point should work to build group identity. They can use the name of the organisation (“When I say ‘extinction’, you say ‘rebellion!’”) or be about the general cause that has brought everyone out.

Then you want to state the problem or issue that is the main topic of your speech. Start by setting a scene, go more into details about what the issue is, save the most outrageous parts for last. You want it to start in everyday, accessible language. Keep the emotional level rising throughout the speech. It’s fine to engage the audience between sections. (“Are we going to stand for this??”)

The second major part of your speech, shorter than the first, is making demands. Gradually raise the stakes. It’s fine to make some demands of the crowd, but you need to know the audience and quit while you’re ahead. If you ask a bunch of middle class white climate activists to go vegan, this might be the push that some of them need. If you tell people to quit their jobs and become full time activists, you’ve likely gone too far and undone some of your previous good work.

The largest demands needs to be against the target of the protest or of the state. Again, these need to gradually up the stakes. Start with something everyone aggress with and push so that it’s still entirely reasonable but would require major system change to implement.

For example, “Britain must outlaw the importation and sale of the products of slave labour” is a good starting point. This is an obviously good idea. But carry on with, “British companies must not profit off of slave labour anywhere in the world.” Also extremely reasonable, but much harder to implement. This is what you want. Carry on, “All proceeds any British company, subsidiary, or owner, must have any proceeds of forced labour confiscated. This money must be paid out in restitution to individuals and communities effected by this disgusting practice!” That’s a transitional demand. Because we want to outlaw slavery globally. Apple products made by slave labour shouldn’t be on sale in our shops, but nor should they be on sale anywhere. That this would be hard to implement is good – it shows that the entire system must be overhauled to respect human rights.

Some groups feel that making capitalism a direct and named target is pushing things too far and will lose audiences. I increasingly disagree with this, but use your judgement.

Then make sure to give hope. If you were talking about slavery, you could talk briefly about how Britain sent out it’s navies to free slaves in transport. (True!) Or you can be more generic (“We can change and we will change! We will fight and we will win!”).

End with chanting that is more specifically tied to what you spoke about. (“Climate justice / human rights. One struggle / one fight”)

Performance Practice

Your speech is a performance. Do things you would do to prepare for a performance. You may need to practice speaking into a PA or practice the whole speech. You’ve written something that sitrs emotions, so deliver it with those emotions – be passionate! Stand up straight. Look determined. Take a deep breath. You can do it.

How to talk into a PA

If you are using a bullhorn, hold the microphone close to your mouth. Speak slowly and clearly. If you are using a system with a more normal microphone, hold it part way down. Do not grab it by the business end and especially don’t cover any grill or openings with your hands. Point it at your mouth. As with a bullhorn, speak slowly and clearly. If you get feedback, move behind the speaker and make sure the mic is only pointing at you – not any speakers.

How to hold a microphone
Holding a microphone

Protests 9 & 10 and a picket line

Climate Strike

I’m not in the target demographics for the Friday climate strikes, but most of my regular Friday protest is, so when they weren’t at Cargill, I went to join them there.

Climate Strike
Protestors near Downing Street

The protestors had marched up the street a bit, but then came back. As with any youth protest, they were massively over-policed. However, it was the middle of the day and some of them had parents present, so the police were keeping their urges mostly in check.

Disproportionate police response

Fashion Week

XR showed up to Fashion week to demand greater sustainability.

Partially blocking the road
XR in the street

Earth Strike also set up a table there. It was a good thing for us to go to.

Earth Strike at Fashion Week
Earth Strike at Fashion Week

UCU Strike

In other news, as nothing was resolved after the last set of strike days, my union is once again striking. I’m mostly working at Kent this term, but it’s a long way to travel on days I’m not scheduled to be in, so I showed up at Goldsmiths on the first day of the strike.

UCU Picket at Depford Town Hall
Pickets at Depford Town Hall

It’s reading week, so nobody there was scheduled to teach at all. I think it’s a good turnout under the circumstances.

A picket line at Goldsmiths

Student support was in evidence and some of the props were very good.

In Loving Memory of Art Education 2020
“In loving memory of Art Education 20202”
This is an actual mosaic made by one of the picketers.

The strike carries on for several more days. I didn’t go out today, but will be out next week and will (probably) go to Canterbury for my effected teaching days.

Obviously, this is bad for students and I hope that the strike ends early with an agreement. It is an unusual opportunity to talk about our dreams for higher education, our research and to foster a collegiate atmosphere. I wish there was a way we could foster the spirit of the strike when not on strike and share it with all the students. We all should have more of a say in how universities are run and what they’re like.

Protests 6, 7 and 8

My 50 protests in 2020 project continues, but I’ve gotten a cold and feeling somewhat grim, so this round up may be weird.

Local Rebellion: Defend Councils Net Zero

Less than 1% of new homes built in Britain have an A energy rating. This means that they are badly insulated. Saving carbon with a heat pump is no good if the heat just leaks away in five seconds. Poorly insulated homes cause fuel poverty.

In 2018, only 1% of new homes in the UK were band A energy performance
Architects! Climate Action Network was involved in the protest.

Some councils, in an attempt to meet their carbon goals, have declared higher standards for new construction in their areas. However, the central government is trying to impose a national standard which undoes that, called “future homes”. This disempowers local councils and undoes their good work while also increasing pollution and misery.

Future gomes standard = climate catastrophe
Protestors engage in a tug of war where one side is “Local Government Net Zero 2025 Targets” and the other side is “Central Government Future Homes Standard”

Energy efficiency and homes of a decent standard of efficiency cannot be treated as luxury goods for the rich. This backwards-looking proposal suggests the government is not taking its carbon commitments seriously. Any chance to bestow favours on buy-to-let landlords would seem to outweigh the global need to cut carbon for the sake of everyone. Rich people will not benefit when their swanky Thames-front flats are flooded.

Stop Cargill

This is the weekly protest with Climate Save. This week was smaller than the first one, but I expect next week to be much larger and hopefully momentum will continue to build. You can come out next Friday and every Friday after around noon.

Climate Save
Climate Save in front of Cargill

Cargill’s actions really are shocking. Aside from working with Bolsinaro’s government to weaken standards for Amazon deforestation – their campaigning for him was a direct attack on LGBT people, they also are implicated in child slavery in Africa. Nestle sells the finished chocolate, but Cargill sells them the beans.

This week, they didn’t bother covering over their names. The issue of child slavery in chocolate has been widely documented. It’s outrageous and alarming that there can be an office building in central London that’s involved directly with slavery.

Night Pride

In response to some incidents around London, a group of local queers decided to have a series of Night Pride marches. This one started in Haggerston and went to Dalston. It was a few hundred people (maybe a thousand?) marching joyously while singing along to disco songs. There was, indeed, even a disco ball.

Night Pride
The Night Pride march

Once we got to the Dalston Superstore, some drag queens spoke and sung outside. The whole event was joyous and lovely. (Also a handsome young man seemed to be flirting with me! Although I think I was kind of feverish by then, so it’s possible he wasn’t)

Drag Street Performance
Drag performers at the end of the march

One of the groups in the march is a new antifa organisation called the Bender Defenders, who are determined to stop hate crime. They jackets are extremely nice.


I want to get well soon, so instead of typing out a synopsis of a few upcoming things, I’ll point you at the calendar and take a nap instead.

Protest 5/50: The worst company in the world

For my fifth protest, I joined the newly-formed Climate Save group to stand in front of the London headquarters of Cargill. This company does a lot of supply chain logistics for food, including animal feed. As such, they are very implicated in Amazon deforestation and have been working with Bolsinaro to weaken regulations in Brazil. They have a terrible track record with hurting workers, pollution and harming indigenous people. (We’ll leave aside the question of who is worst in the world, but they’re certainly prominently placed on this list.)

First Cargill Protest
I’m using Obscura Cam now to anonymise photos I upload and it mistook the building sign for a face!

We met up with a few XR protestors and chanted and there were a few short speeches. Climate Save is an offshoot of Animal Save and is an animal rights group. These groups sometimes make me feel uncomfortable, but the London branch of Climate Save seems very on it. They are a migrant-lead group of Spanish speakers from Europe and the Americas. This is an ongoing campaign, so I’ll be back this coming Friday with them again.

Climate Save at Cargill
Climate save at Cargill

Cargill, for their part, had a little panic. We showed up a little late and heard that the area had been crawling with police officers and Cargill had shut the building’s front entrance and covered over their name on the large directory listing on the front wall.

This repeating protest should continue to grow!

Other activities

Earth Strike

I went on Saturday to another leafleting event with Earth Strike, this one by Angel station. Our previous action got us two new members, so it wasn’t in vain, but I do feel like the uptake could be higher. I’d prefer to do a proper protest that also has outreach. There is a lot of institutional momentum, so we’ll see how this goes over. I want to show up at the next meeting with a concrete proposal. I’d also like to lead a mini-workshop clarifying goals, demands, aims and tactics. It’s very easy to confuse tactics with goals and it’s best to sort this out while the group is still new.

Earth Strike Table
Packing up after handing out a LOT of leaflets

Activist Cafe

Common House hosted a new event called the Activist Cafe, which will have roving venues. It was a chance for people to catch up with each other and promote future events. There was a speaker who is involved in the Pink Bloc in the Paris strikes. She was extremely cool. I may make a separate post about all the cool things she talked about.

Activist Cafe at Common House
There were maybe 50 people squeezed in the space?

Extinction Rebellion Tower Hamlets

I also went to an XRTH meeting. We broke into groups and I was helping organise the Tower Hamlets presence at the upcoming Put Out the Fire march, which will take place 22 February. We deicded to focus on how indigenous communities are effected by climate change and damaging resource extraction.

We also decided to have a feeder rally in Altab Ali park, by Aldgate East tube station. We hope many other groups come join this event. If you are active in human rights, climate justice or related areas, I hope you can please come along. We are looking for speakers, so do get in touch.

This will be:
Noon, 22 February
Altab Ali Park

It’s a short event, as we want to get to the main march location (TBA) for 1pm for a 2pm start. It’s a long day, but will be family friendly and a good first action for people just thinking about getting involved in the fight for climate justice.

Upcoming Events

I’ve got a public activist calendar online, which you can subscribe to! I don’t go to everything on the list, though. The next ones I’m likely to attend are:

Local Rebellion – Defend Councils’ Powers For Net Zero. The Tories say they’re green but are threatening to prevent local councils from going to zero carbon. Shame them into dropping this.
Noon, 6 February
Marsham St & Horseferry Rd Westminster, London SW1P 2AX

Climate Protest Against the WORST Company in the World. The ongoing action against Cargill.
Noon, 7 February
77 Queen Victoria Street, London, EC4V 4AY, United Kingdom

BP Must Fall! Get BP out of the British Museum and fight colonialism within the museum.
13:00 (1pm), 8 February
British Museum

Protest against Glencore! A british-owned multinational mining company that pollutes the planet and kills numerous child labourers.
13:00 (1pm), 29 February
50 Berkeley Street, Mayfair, London W1J 8HD


This week, I feel like my meeting/action ratio has been poor, which admittedly is part of why I want all outreach events to be proper protests!

It was extremely useful to meet up with the Green AntiCapitalist Front, however, and I’m extremely happy to be helping plan the upcoming XR-lead march.

It’s interesting how XR events have dizzyingly fast turnarounds which make it sometimes hard to do all the planning one would wish for, and Earth Strike has such a long leadup!