OUseful.Info, the blog…https://blog.ouseful.info
Trying to find useful things to do with emerging technologies in open education and data journalismSun, 18 Feb 2018 05:06:59 +0000enhourly1http://wordpress.com/https://s2.wp.com/i/buttonw-com.pngOUseful.Info, the blog…https://blog.ouseful.info
Everybody Should Code? Well, Educators Working in Online Learning in a “Digital First” Organisation Probably Should?https://blog.ouseful.info/2018/02/14/everybody-should-code-or-digital-educators-at-least/
https://blog.ouseful.info/2018/02/14/everybody-should-code-or-digital-educators-at-least/#respondWed, 14 Feb 2018 15:49:59 +0000http://blog.ouseful.info/?p=17560Pondering Sheila’s thoughts on Why I Don’t Code?, and mulling over some materials we’re prepping as revisions to the database course…

I see the update as an opportunity to try to develop the ed tech a bit, make it a bit more interactive, make it a bit “responsive” to students so they can try stuff out and get meaningful responses back that helps them check what they’ve been doing has worked. (I’ve called such approaches “self-marking” before, eg in the context of robotics, where it’s obvious if your robot has met the behavioural goal specified in some activity (eg go forwards and backwards the same distance five times, or traverse a square).

Some the best activities in this regard, to my mind at least, can be defined as challenges, with a “low floor, high ceiling” as I always remember Mike Reddy saying. Eg how perfect a square, or how quickly can your robot traverse it. And can it reverse it?

Most kids/students can get the robot to do something, but how well can they can it to do something in particular, and how efficiently? There are other metrics too – how elegant does the code look, or how spaghetti like?!

So prepping materials, I keep getting sidetracked by things we can do to try to support the teaching. One bit I’m doing is getting students to link database tables together, so it seems sensible to try to find, or come up with, a tool that lets students make changes to the database and then look at the result in some meaningful way to check their actions have led to the desired outcome.

There are bits and bobs of things I can reuse, but they require:

1) gluing stuff together to make the student use / workflow appropriate. That takes a bit of code (eg to [make some IPython magic]);(https://github.com/innovationOUtside/ipython_magic_eralchemy) );
2) tweaking things that don’t work quite how want them, either in terms of presentation / styling, or functionality – which means being able to read, as well as write, bits of code;
3) keeping track of work – and thinking – in progress, logging issues, sketching out possible fixes, trying to explore the design space, and use space, including looking for alternative – possibly better – ways of achieving the same thing; which means trying to get other people’s code to work, which in turn means coming up with and trying out small examples, often based on reading documentation, looking for examples on Stack Overflow, or picking through tests to find out how to call what function with what sorts of parameter values.

Code stuff; very practical programmingy code-y stuff. That’s partly how I see code being used – on a daily basis – by educators working in a institution like the OU that claims to pride itself on digital innovation.

It’s also stuff that tests my own knowledge of how things are supposed to work in principle – as well as practice. This plays out through trying to make sure that the tech remains relevant to the educational goal, and ideally helps reinforce it, as well as providing a means for helping the students act even more effectively as independent learners working at a distance…

And to my mind, it’s also part of our remit, if we’re supposed to be trying to make the most use of the whole digital thing… And if we can’t do this in a computing department, then where can – or should – we do it?

PS I should probably have said something about this being relevant to, or an example of, technology enhanced learning, but I think that phrase has been lost to folk who want to collect every bit of data they can from students? Ostensibly, this is for “learning analytics”, which is to say looking at ways of “optimising” students, rather than optimising our learning materials (by doing the basic stuff like looking at web stats as I’ve said repeatedly). I suspect there’s also an element of plan B – if we have a shed load of data, we can sell it to some one as part of every other fire sale.

]]>https://blog.ouseful.info/2018/02/14/everybody-should-code-or-digital-educators-at-least/feed/0Tony HirstTo Do – Textualisation With Tracery and Database Reporting 2.0https://blog.ouseful.info/2018/02/11/to-do-textualisation-with-tracery-and-database-reporting-2-0/
https://blog.ouseful.info/2018/02/11/to-do-textualisation-with-tracery-and-database-reporting-2-0/#respondSun, 11 Feb 2018 15:32:10 +0000http://blog.ouseful.info/?p=17545More of a just fragment of things to do, rather than a full post on anything I’ve done, because the blog thing is just increasingly hard to find the time or motivation for now; work sucks time and energy and makes everything just whatever…

One thing I have noticed is more official Excel spreadsheets starting to include dynmic reporting in them. For example, the NHS Digital Hospital Accident and Emergency Activity, 2016-17 data has an output sheet that will dynamicall create a report from the other data sheets based on a used selection.

The report uses formulas to generate output text:

and tables and charts are also generated as part of the report:

A couple of times, Leigh Dodds has linked out to tracery.io in the data2txt / text generation context, but I’ve yet to play with it (tutorial). There’s a python port at aparrish/pytracery which is probably the one I’ll use.

There’s a notebook that looks like it could provide a handy crib to using pytracery with CSV data. I’m not sure how well it copes with turning numbers into words, but it might be interesting to try to weave in support from something like inflect.py if it doesn’t.

I had a play, when I should have been in the garden… :-( Fork here with modifiers from inflect.py and a demo of using it to generate sentences from rows in a pandas dataframe.

One of the things I’ve started trying to do is package up simple tools to grab structured data from webpublished CSVs and Excel docs in simple SQLite3 databases that can be published using datasette (ouseful-datasupply).

Also on the to do list in this regard is to look at some simple demos for creating datasette templates (perhaps even cribbed from report generating formulas in spreadsheets as a shortcut) that render individual rows (or joined rows) as text reports, such as paragraphs of text reporting on winter sitrep stats for a specified hospital. From one template, we’d auto generate reports for every hospital: database reporting, literally.

Why 2.0? Because writing database reports has been going on for ever, but getting folk to think about it as a basic journalistic reporting skill that represents a practical example of the sort of thing of everyday task that might become more widespread as a result of “everyone should learn to programme” initiatives.

It also reminds me of “banking to 45 degrees”, “the idea that the average line slope in a line chart should be 45º. This has been dubbed banking to 45º and has turned into one of the bits of common wisdom in visualization as determining the ideal aspect ratio [although it more specifically relates to] the comparison between the slopes of two lines, and the slope is the average between those two lines. So if the goal is to be able to compare the rates of change between lines, the 45º average slope makes sense as a rule” Robert Kosara blog post on Aspect Ratio and Banking to 45 Degrees.

The original statement comes from Cleveland, W.S., McGill, M.E. and McGill, R., (1988) The shape parameter of a two-variable graph, Journal of the American Statistical Association, 83(402), pp.289-300 [JSTOR], and I think I should probably read it again…

By the by, SRF are one the best news orgs I know for sharing their working – the recipes for the above story can be found on their Gihub repo at srfdata/2018-01-roger-federer – so I could probably have recreated the unrotated chart directly from that source, if I’d had the time to play.

]]>https://blog.ouseful.info/2018/02/04/decompressing-zipped-javascript/feed/0Tony HirstDoes Transfer Learning with Pretrained Models Lead to a Transferable Attack?https://blog.ouseful.info/2018/02/02/does-transfer-learning-with-pretrained-models-lead-to-a-transferable-attack/
https://blog.ouseful.info/2018/02/02/does-transfer-learning-with-pretrained-models-lead-to-a-transferable-attack/#respondFri, 02 Feb 2018 09:53:56 +0000http://blog.ouseful.info/?p=17522Reading a post just now on Logo detection using Apache MXNet, a handy tutorial on how to train an image classifier to detect brand logos using Apache MXNet, a deeplearning package for Python, I noted a reference to the MXNet Model Zoo.

The Model Zoo is an ongoing project to collect complete models [from the literature], with python scripts, pre-trained weights as well as instructions on how to build and fine tune these models. The logo detection tutorial shows how training your own network with a small number of training images is a bit rubbish, but you can make the most of transfer learning to take a prebuilt model that has been well trained and “top it up” with your own training samples. The guess the main idea is: the lower layers of the original model will be well trained to recognise primitive image features, and can be reused, and the final model tweaked to reweight these lower level features in the upper layers so the overall model works with your particular dataset.

So given the ability to generate adversarial examples that trick a model into seeing something that’s not there, how susceptible will models built using transfer learning on top of pretrained models be to well honed attacks developed on that pretrained model? To what extent will the attacks work out of the can (and/or to what extent) or how easily will they be transferred?

]]>https://blog.ouseful.info/2018/02/02/does-transfer-learning-with-pretrained-models-lead-to-a-transferable-attack/feed/0Tony HirstCognitive Science, 2.0? Google Psychlabhttps://blog.ouseful.info/2018/01/30/cognitive-science-2-0/
https://blog.ouseful.info/2018/01/30/cognitive-science-2-0/#commentsTue, 30 Jan 2018 09:58:01 +0000http://blog.ouseful.info/?p=17489Whilst I was rooting around looking for things to do the year or two after graduating, I came across the emerging, inter-disciplinary field of cognitive science, which used ideas from cognitive psychology, philosophy, AI, linguistics and neuroscience to try to understand “mind and consciousness stuff”. I read Dennett and Searle, and even toyed with going to do a Masters at Indiana, where David Chalmers had been doing all manner of interesting things as a PhD student.

I was reminded of this yesterday whilst reading a post on the Google DeepMind blog – Open-sourcing Psychlab – which opened in a style that began to wind me up immediately:

Consider the simple task of going shopping for your groceries. If you fail to pick-up an item that is on your list, what does it tell us about the functioning of your brain? …

What appears to be a single task actually depends on multiple cognitive abilities. We face a similar problem in AI research …

To address this problem in humans, psychologists have spent the last 150 years designing rigorously controlled experiments aimed at isolating one specific cognitive faculty at a time. For example, they might analyse the supermarket scenario using two separate tests – a “visual search” test that requires the subject to locate a specific shape in a pattern could be used to probe attention, while they might ask a person to recall items from a studied list to test their memory. …

“To address this problem humans”… “rigorously controlled”, pah! So here we go: are Google folk gonna disrupt cognitive psychology by turning away from the science and just throwing a bunch of numbers they’ve managed to collect from wherever, howsoever, into a couple of mathematical functions that tries to clump them together without any idea about what any clusters or grouping mean, or what they’re really clustering around…?

We believe it is possible to use similar experimental methods to better understand the behaviours of artificial agents. That is why we developed Psychlab [ code ], a platform built on top of DeepMind Lab, which allows us to directly apply methods from fields like cognitive psychology to study behaviours of artificial agents in a controlled environment. …

Psychlab recreates the set-up typically used in human psychology experiments inside the virtual DeepMind Lab environment. This usually consists of a participant sitting in front of a computer monitor using a mouse to respond to the onscreen task. Similarly, our environment allows a virtual subject to perform tasks on a virtual computer monitor, using the direction of its gaze to respond. This allows humans and artificial agents to both take the same tests, minimising experimental differences. It also makes it easier to connect with the existing literature in cognitive psychology and draw insights from it.

So, to speed up the way Google figures out how to manipulate folks’ human attention through a screen, they’re gonna start building cognitive agents that use screens as an interface (at first), develop the models so they resemble human users (I would say: “white, male, 20s-30s, on the spectrum”, but it would be more insidious perhaps to pick demographics relating to “minority” groups that power brokers (and marketers) would more readily like to “influence” or “persuade”. But that would be a category mistake, because I don’t think cognitive psychology works like that.), then start to game the hell out of them to see how you can best manipulate their behaviour.

Along with the open-source release of Psychlab we have built a series of classic experimental tasks to run on the virtual computer monitor, and it has a flexible and easy-to-learn API, enabling others to build their own tasks.

Visual search – tests ability to search an array of items for a target. [I once tried to pitch an idea to a family friend who ran a vending machine leasing service that I could have a go at optimising the arrangement of products in his machines to maximise sales. How life might have been different if we’d actually tried that out…]

Isn’t that nice of Google. Tools to help cog psych undergrads replicate classic cognitive psychology experiments with their computer models.

Each of these tasks have been validated to show that our human results mirror standard results in the cognitive psychology literature.

Good. So Google has an environment that allows you to replicate experiments from the literature.

Just remember that Google’s business is predicated on developing ad tech, and ad revenue in turn is predicated on find ways of persuading people to either persist in, or modify, their behaviour.

And once you’ve built the model, then you can start to manipulate the model.

When we did the same test on a state-of-the-art artificial agent, we found that, while it could perform the task, it did not show the human pattern of reaction time results. .. this data has suggested a difference between parallel and serial attention. Agents appear only to have parallel mechanisms. Identifying this difference between humans and our current artificial agents shows a path toward improving future agent designs.

“Agents appear only to have parallel mechanisms”. Erm? The models that Google built appear only to have parallel mechanisms?

This also makes me think even more we need to rebrand AI. Just like “toxic” neural network research required a rebranding as “deep learning” when a new algorithmic trick and bigger computers meant bigger networks with more impressive results than previously, I think we should move to AI as meaning “alt-intelligence” or “alternative intelligence” in the sense of “alternative facts”.

“[A] path toward improving future agent designs.” That doesn’t make sense? Do they mean models that more closely represent human behaviour in terms of the captured metrics?

What would be interesting would be if the DeepMind folk found they hit a brick wall with deep-learning models and that they couldn’t find a way to replicate to human behaviour. Because that might help encourage the development of “alternative intelligence” critiques.

Psychlab was designed as a tool for bridging between cognitive psychology, neuroscience, and AI. By open-sourcing it, we hope the wider research community will make use of it in their own research and help us shape it going forward.

Hmmm…. Google isn’t interested in understanding how people work from a point of view of pure inquiry. It wants to know how you work so it can control, or at least influence, your behaviour. (See also Charlie Stross, Dude, you broke the future!.)

]]>https://blog.ouseful.info/2018/01/30/cognitive-science-2-0/feed/5Tony Hirst“The Follower Factory” – Way Back When vs Nowhttps://blog.ouseful.info/2018/01/28/the-follower-factory-way-back-when-vs-now/
https://blog.ouseful.info/2018/01/28/the-follower-factory-way-back-when-vs-now/#respondSun, 28 Jan 2018 15:14:30 +0000http://blog.ouseful.info/?p=17480A news story heavily doing the rounds at the moment in the part of the Twitterverse I see is a post from the New York Times called The Follower Factory which describes how certain high profile figures feel the need to inflate their social media follower counts by purchasing followers.

Such behaviour isn’t new, but the story is good one – a useful one – to re-tell every so often. And the execution is a nice bit of scrollytelling.

Whilst it is trivial for Twitter to generate such reports – they own the data – it is harder for independent researchers. When I charted the follower accession curves for UK MPs, I had access to a whitelisted Twitter API count that meant I could download large amounts of data quite quickly. The (generic) rate limiting constraints on my current Twitter account mean that grabbing the data to generate such charts in a reasonable amount of time nowadays would be all but impossible.

There are several ways round this: one is to purchase the data using a service such as Export Tweet; one is to abuse the system and create my own army of (“fake”) Twitter accounts in order to make use of their API limits to mine the Twitter API using a distributed set of accounts under my control; a third is to “borrow” the rate limits of other, legitimate users.

For example, many sites now offer “Twitter analysis” services if you sign in with your Twitter account and grant the service provider permission to use your account to access various API calls through your account. I imagine that one of the ways such services cover the costs of their free offerings is to make use of API calls generated from user accounts to harvest data to build a big database that more valuable services can be provided off the back of.

In this case, whilst the service is free, the aim is not specifically to collect data about the user so they can be sold to advertisers as part of a specific audience or market segment, but instead to make use of the user’s access to API services so that the service provider can co-opt the user’s account to harvest data from Twitter in a distributed way. That is, the service provider gains the necessary benefits from each user to cover the costs of servicing the needs of that user by gaining access to Twitter data more generally, using the the user’s account as a proxy. The mass of data can then be mined and analysed to create market segments, or exploited otherwise.

This approach to exploiting users by means of exploiting their access to a particular resource is also being demonstrated elsewhere. For example, a Wired post from October last year on “cryptojacking” – Your Browser Could Be Mining Cryptocurrency For A Stranger describes how users’ computers can be exploited via their browsers in the form of Javascript code embedded in web pages or adverts that “steals” (i.e. appropriates, or co-opts) CPU cycles (and the electricity used to power them) to do work on behalf of the exploiter – such as mining bitcoin. A more recent story elsewhere – The Coming Battle for Your Web Browser [via @euroinfosec] – describes how the same sort of exploitation can be used to co-opt your browser to take part in distributed denial of service attacks (the provision of which is another thing that can be bought and sold, and that can hence be used to generate revenue for the provider of that service). Defensive countermeasures are available.

We’ve been attending the occasional motorsport event – touring cars at Snetterton, the WRC rally in Wales – a few times a year for getting on for a decade. The pace is a bit less hectic than other family treks to the muddy fields of music festivals, but just as entertaining.

Pretty much the only pre-requisite for attending the taster was to do the rally marshals online training, which is required for rally marshal accreditation. This includes several short modules on safety, good practice, and a first-on-scene briefing. Assessment is through multiple choice activities.

I also had to print off the ticket that was sent to me to get me free entry – and car access – into the circuit.

And so, a week or so ago, I parked in the marshal’s parking area and turned up for sign on a little after 6.30am at a soon-to-be-wet Brands Hatch, where I grabbed a breakfast and was met by Chief Marshal for the day, Luis Gutierrez Diaz.

After a bit of orientation, and tour of the service park, I started the day at the initial time control, where cars sign on to the stage at a required time in one minute windows. The cars were starting at 30s intervals, which meant two cars arriving each minute.

One thing I learned immediately was how the rally is managed using paperwork…

Arriving at the initial time control at the due time, co-drivers handed their time card to one marshal who recorded the time give by an official clock, and then released the car at the appropriate time.

Another marshal recorded the accession number of the car through the control point, along with the car number and the time. This record was used to give a count of the cars passing the initial time control into the stage.

I had a go at filling in this form in under a makeshift shelter of the open back of an estate car, using the back shelf for writing support.

(I’m regretting not having kept a photo diary!)

Next stop was the start. GoMotorsport‘s John Conboy gave me a lift up to the start area, where the multi-generational group of family (mum, dad, son, daughter) and friends that were the Zoo Crew Motorsport Team were handling matters.

Passing through another marshaled staging point prior to the start, the Zoo Crew (with team hats!) provided each car with an actual start time (one marshal taking the time and signing the co-driver’s card, along with the number of the preceding car onto the stage, another recording this on a master sheet), then passed then on to the start (one marshal to stop the car, one marshal to record the car number using the timer and set the electronically recorded start time – which also controlled the countdown clock).

Between stages, the layout of the course was changed, which meant once all the cars were through the stage, it was time to help move some cones…

After walking back to grandstand (a short walk – Brands Hatch is quite compact) I met up with John again, grabbed a coffee, and went off to the finish, where a group of five marshals were staffing the finish line: one to read out the time recorded by the timer for each car, one to record the time, car number, and preceding car number, and three to grab the cards from the finishing cars. (Another two marshals were opposite the actual finish line, in line of site with the timing beam, to manually record the times as cars passed to stage finish as a back up.)

By this time, it was raining… but we managed to stay dry. The stage finish marshals were another regular gang, their van stocked with supplies and a gazebo covering the control area to keep us all relatively dry.

At the end of my stint there, the rally reversed the way the cars went round the track, so I grabbed a lift back to the start, which was about the become the finish, as the start/end marshal teams changed ends.

Meeting up with John Conboy again, he took me to mid-stage, and Team Berris, another crew of family and friends, this time spanning three generations, and a expansive gazebo kitted out with everything the gang could need for the day!

As with the other teams, marshals were appointed to a position for the day, unlike my see it all taster experience. Compared to the time control points, where the marshals played a role in managing the on-stage administration of the rally, this was more about being there just in case, although at some of the other stations I suspect the marshals had a busier time of it in the form of changing the track layout between stages.

The circuit setting of this rally meant the marshals in the stage had a role similar to circuit racing track marshals. (The rally was actually a round in the MSN Circuit Rally Championship, which looks to be a cunning way to make competitive use of motor racing circuits in the track racing offseason.) From visiting the Wyedean stages as a spectator, as well as from conversation throughout the day, I imagine the experience on a forest stages is rather different, covering off footpaths and access roads, for example, and managing the safety of spectators as much as competitors. (That said, spectator management by marshals was also evident at Brands Hatch, in the form of a marshal preventing public access to the VIP infield area by way of the underpass.) The ability to see pretty much every aspect of the on-the-day activities surrounding the rally, which might be a bit harder to achieve at an event not based around circuit facilities, was really useful.

One useful tip I was given about the on-stage marshaling, which also backed up some of the online training, was to “wait 10 seconds” in the event of an accident or incident. This gives you time to take stock of the situation, and make a decision about whether a car needs assistance at all. The underlying principle is that if a driver and co-driver can safely get out of their vehicle, they should be left to it.

Another tip: bring a whistle. When attending an incident, marshals look out for everyone’s safety, including their own. At the sound of a whistle, something’s coming…

So that was it, my rally marshal taster day, 7 till 7, and a great day it was too. The camaraderie was evident – multigenerational family groups – and welcoming to a newcomer such as myself. Many of the marshals seem to current, or previous, competitors and have a wealth of stories to share and tales to tell. If there are teens in your life, under eighteens are allowed, with consent… The range of different activities and opportunities involved in marshaling an event like this was also an eye-opener for me.

So what didn’t I see?

Some of the on-stage marshals I didn’t chat to were the radio marshals, who often double up as flag marshals. These are the only people with a guaranteed link back to the rally control and the clerk of the course, in case of incident. The radio channels are all public though, so taking a scanner along would mean you could listen in on the traffic.

I also didn’t get to see the handling of the paperwork either as it was issued to competitors or once cards were received from them, or collected from time controls. (One of Luis’ jobs was to drive round the stages collecting paperwork from the time controls every couple of stages.) I got the feeling that the electronic timing data records were a backup, and the rally was actually administered through paperwork. (Another note to self: pencil can work better than pen in the damp…)

As mentioned before, I also forgot to grab some photos…

So what next? I put in an application for my MSA marshal registration, although that wasn’t a necessary requirement for the taster day and you don’t actually need to register to volunteer, though that means you have to be paired up with someone.

I also started looking around the BRMC website at the progression path for marshals:

Although you don’t have to commit to anything, the more experience you have the more opportunities there are…

And the number of opportunities for rally marshals is likely to increase. For many years, “the holding of races or trials of speed between motor vehicles on public ways in England” has been impossible, but the Deregulation Act 2015 changed that with a series of amendments to the Road Traffic Act 1988.

As a direct result of those amendments, the Chelmsford Motor Club are organising a closed roads event – the Corbeau Seats Rally: Tendring & Clacton – on public roads in April this year. (I did try to look for their application to the Essex County Council Highways Authority, but couldn’t find it anywhere?)

To sum up, the taster event was a great idea. If my first experience had been stood in the middle of a forest for a whole day somewhere, I wouldn’t have learned as much about the wide variety of activities that need to be covered, although from experience of standing in forests as a spectator, I’m sure it still would have been fun:-)

As someone who has only spectated at, and never competed in, any sort of motorsport event (other than a couple of goes at karting) it was fascinating to get a flavour of the event as a whole. Since then, I’ve had a poke around for other informal reviews of “procedure” which nicely complement the day: Co-driving Guide; and here: Rally Time Control Etiquette]. Which reminds me, I’d like like to grab a set of the various forms and cards used to see properly how things cross-check, data geek that I am:-)

Interested?

Many thanks to Luis Gutierrez Diaz, John Conboy, the Zoo Crew, Team Berris, and all the other marshals who put up with my naive questions. I’ll hopefully get to see them all again, somewhere, sometime…

]]>https://blog.ouseful.info/2018/01/27/rally-marshal-taster-event/feed/0Tony Hirst37965167842_d26a7b7561_oReproducible Notebooks Help You Track Down Errors…https://blog.ouseful.info/2018/01/19/reproducible-notebooks-help-you-track-down-errors/
https://blog.ouseful.info/2018/01/19/reproducible-notebooks-help-you-track-down-errors/#respondFri, 19 Jan 2018 09:44:13 +0000http://blog.ouseful.info/?p=17442A couple of days ago on the Spreadsheet Journalism blog, I came across a post on UK Immigration Raids:.

The post described a spreadsheet process for reshaping a a couple of wide format sheets in a spreadsheet into a single long format dataset to make the data easier to work with.

One of my New Year resolutions was to try to look out for opportunities to rework and compare spreadsheet vs. notebook data treatments, so here’s a Python pandas reworking of the example linked to above in a Jupyter notebook: UK Immigration Raids.ipynb.

]]>https://blog.ouseful.info/2018/01/19/reproducible-notebooks-help-you-track-down-errors/feed/0Tony HirstFragment – Carillion-ishhttps://blog.ouseful.info/2018/01/18/fragment-carillion-ish/
https://blog.ouseful.info/2018/01/18/fragment-carillion-ish/#respondThu, 18 Jan 2018 21:25:38 +0000http://blog.ouseful.info/?p=17435A quick sketch of some companies that are linked by common directors based on a list of directors seeded from Carillion PLC.

The data was obtained from the Companies House API using the Python chwrapper package and some old code of my own that’ll I’ll share once I get a chance to strip the extraneous cruft out of the notebook it’s in.