Ian Hopkinson

Author's posts

Book review: An African History of Africa by Zeinab Badawi

My next review is of An African History of Africa by Zeinab Badawi. On this topic I read Precolonial Black Africa by Cheikh Anta Diop a few years ago. Badawi’s book was a chance discovery at the library – published in 2024. I know Badawi as a newsreader in the UK, she was born in Khartoum in the Sudan but moved to Britain aged 2. She is one of the Africans of the title but more generally she interviewed many African scholars in writing this book.

An African History makes a tour of Africa in broadly chronological fashion, starting with the earliest humans but moving quickly to the area around the Nile in the time of the ancient Egyptians finishing with the liberation struggles of the second half of the 20th century. The 17 chapters are typically named for the areas they cover, some like “Slavery and Salvation” are thematic but typically tied to a region. There are too many chapters for me to comment on each one so I try to provide a thumbnail sketch of the whole here.

There are some recurring themes in the book, the first is reference to the UNESCO General History Africa project – a much longer version of this book in some senses.

In contrast to Britain it feels like groups of people in Africa were more mobile with groups moving around the continent and resettling, also land ownership seems not to have been a common practice.

Badawi writes a little about how the sources for African history are typically accounts written by outsiders such as Arabic scholars, or European traders/slavers. Many of these sources need to be read in light of justification for the actions of their authors either slavery or colonisation. That said the spread of Islam across West Africa and down the Eastern coast of Africa would mean that written language was available from a relatively early date. African sources are typically based on oral traditions which do not have high standing with Western historians. The First Astronomers by Duane Hamacher talked about the power of oral traditions in transmitting information over thousands of years.

South of the Sahara archaeology has been neglected, and in Zimbabwe (as Rhodesia) very actively supressed.

Once the preliminaries of the dawn of humanity are covered the action moves to ancient Egypt, the Kingdom of Kush, Aksum and Ethiopia – all in the North East of Africa covering the modern day states and Sudan. European historians have often written about Egypt as “not African”, as if somehow such an advanced civilisation could not possibly be African (specifically Black). Ancient Egypt persisted from around 3000BC until 330BC when it was invaded by Alexander the Great. The Kingdom of Kush in present day Sudan arose at approximately the same time, when the area was cooler and wetter, and did not fall until the 4th century AD.

Further west along the North African coast we find the Carthaginians fighting the Punic Wars against the Roman Empire a couple of hundred years BC. They were a much more sophisticated society at that time than the Britons that Rome would later invade. Africa gets its name from Ifrikiya, the Roman name for the region. In common with many places North African communities were not uniform in their opposition to Rome some sided with them against other local groups.

Arabs entered Egypt in 639AD, a year after the death of the Prophet Mohammad. They were “semi-welcomed” by the Egyptian populace, the Byzantine rulers had not been great and the native Coptic Church was dominated by the Orthodox Church. From there they spread across North Africa rapidly, crossing the Straits of Gibraltar to take Spain in 711AD.

Sub-Saharan West Africa gets a few outings, firstly with Mansa Musa, leader of the Mali Empire 1312 – c. 1337 and reputedly the richest man to every live, primarily derived from the gold mined in the region. The Mali Empire was followed by the Ghana empire – 600-1235AD and then by the Songhay Empire 1435-1592. Further East there was Benin. These empires do not follow the boundaries of the modern countries who take their names, those were the invention of 19th century colonialists. Also in this area were the Asante. These were large sophisticated societies with complex trading and impressive metalworking, not clusters of mud huts.

The traffic of Africans across the Atlantic in the “triangle trade” is well-known. Less well-known is the Indian Ocean slave trade which had been run by Arab traders from 7th to 19th century with approximately 14 million African slaves traded into Arabia. Interestingly an African view of the end of slavery was that it ultimately came about because the slaving nations started to see that African labour was more useful in Africa than across the Atlantic. This culminates in the “Scramble for Africa” in the late 19th century. Africans also viewed the transatlantic slavery (hard labour with a life expectancy of 7 or 8 years) as far worse than “local” slavery. The local impact of slavery was large, a significant fraction of the particularly young adult male population was trafficked and since slaves were often initially captured by neighbouring African groups levels of suspicion between communities rose – slavery casts a long shadow.

Southern Africa covering present day South Africa and Zimbabwe is covered last in the geographic tour. Originally a stopping point for the Dutch East India company ships heading out to the Far East, it was taken over by the British in 1806. It attracted many white settlers who took land for agriculture with wool a primary export in the first instance followed by diamonds in the late 19th century. Zimbabwe and South Africa were the last countries to gain independence – Zimbabwe’s independence in 1980 was one of my earliest political memories.

The book ends with the “Scramble for Africa” where European states divided up the continent in the 1884 Berlin Conference, control of Africa “passed” from African to European hands almost entirely between 1870 and 1890. Conrad’s Heart of Darkness captures this period – he says it represents “the vilest scramble for loot that ever disfigured the history of human conscience and geographical exploration”.

At the time there was some armed resistance, generally overcome quite promptly by superior weaponry such as the Maxim gun. Independence happened after the Second World War, Badawi gives the impression that this process was generally peaceful – I’m not sure that is true. Large scale participation in the world wars by African soldiers drove a desire for independence, as it drove a desire for equality for Black British people at home. The US did not favour its European allies imperialist tendencies, and the colonies became too expensive to maintain after the destruction of the Second World War. The great powers were happy to interfere in the independence process though, the French destroyed much infrastructure as they left Guinea and the Americans with the Belgians backed a coup that deposed the independence leader Patrice Lumumba amongst many other examples.

Badawi ends with a positive note, talking about African as a continent whose population has an average age of 19, taking up new technologies rapidly. It is still blighted by poor government in places but things are improving.

I’m glad I picked this book up, I found it well-written and readable. It provides a great overview of African history with a different perspective to most of what I have read before.

Book review: Understanding Pathological Demand Avoidance Syndrome in Children by Phil Christie, Margaret Duncan, Ruth Fidler and Zara Healey

Today I open up a new strand of reviews with Understanding Pathological Demand Avoidance Syndrome in Children by Phil Christie, Margaret Duncan, Ruth Fidler and Zara Healey. This is for reasons I alluded to in my review of 2024.

Pathological Demand Avoidance (PDA) is a condition first identified in children being evaluated for autism by Elizabeth Newson in the late 1970s.

The core of the PDA diagnosis is the idea that demands of a child causes them anxiety which results in a range of responses around refusing those demands, and developing strategies to avoid demand. This is a problem because often the child will refuse “demands” that would lead to things they wanted to do for example “Please put your shoes on so that we can go to the zoo” – “No!”. It also makes education and everyday life challenging.

The term did not enter the literature until around 2000, and its use has grown substantially since 2012 (see Google Ngram). This book was written around 2012. The current professional opinion on PDA appears to be that is a recordable trait for neurodivergence assessments but it is not a standalone diagnosis.

Understanding PDA is divided into 6 chapters:

  1. What is PDA?
  2. Positive Everyday Strategies – this is about managing PDA in the classroom;
  3. Living with PDA – this is about managing PDA at home;
  4. Providing the Best education for a child with PDA;
  5. Developing emotional well-being and self-awareness in children with PDA;
  6. Summing up and questions for the future;

The chapter “What is PDA?” is about diagnosis, it lists a set of diagnostic criteria and provides some examples of what these criteria look life in action. The criteria proposed for PDA are:

  1. Passive early history in the first year;
  2. Resists and avoids the ordinary demands of life;
  3. Surface sociability – sociability is used as a tool to avoid demands;
  4. Liability of mood;
  5. Comfortable in role playing and pretending;
  6. Language delay;
  7. Obsessive behaviour;
  8. Neurological involvement;

It places PDA alongside autism spectrum conditions broadly divided into “able autism” and “autism with additional learning disabilities”. Reading this I realised my son had some elements of the diagnosis but not many, I also noted that typically the children considered in this book were of primary school age – 5-10 years old. It was also a salutary reminder that our son’s behaviour is fairly mild, one parent reported being threatened by their 8 year old son with a knife! This was not the only example of violent behaviour in children.

Many parents reading this will be asking themselves whether their child fits this diagnosis, and many will be looking at the criteria and realising that they have at least some elements themselves. This presents issues in management of the condition but also provides valuable insights.

As someone with a background in physical sciences my predisposition is to see a diagnosis such as PDA as a concrete undisputable thing. However, it is better to see such diagnoses as a conversation opening to help discuss strategies for living with a child with PDA. The following chapters cover strategies for dealing with a child with PDA at home and in school. The strategies they come up with are as follows:

  1. Reducing demands;
  2. Disguising demands;
  3. Distraction;
  4. Offering choices;
  5. Ignoring undesirable behaviour;
  6. Flexibility and adaptability – learning to be willing to change plans;
  7. Depersonalising demands – a routine depersonalises demands;
  8. Staying calm and neutral – shouting can raise the “excitement” for a child, and so is something that might be sought;
  9. Dealing with bedtime difficulties – fortunately we don’t have these – they’re clearly a common problem;

This seems like an important section to read – it recognises that parents are not perfect and need to develop their own coping strategies. Parents also find themselves wondering where they went wrong to end in this position (they didn’t go wrong), and also feeling guilty for losing their tempers (which is common and natural). It also highlights that the impact of handling a child with PDA on other children including both siblings and class mates. Another lesson is that just because something on one day doesn’t mean it will work on another, the context and the child’s mood is important.

I found the chapter on handling PDA in school environments interesting, not for its relevance directly to me, but because government are keen on the idea of “inclusion” – teaching children on the autistic spectrum in mainstream schools. Reading the accommodations suggested for PDA pupils this seems unworkable, fundamentally because accommodations make a child stand out in a school and for children on the autistic spectrum that is something they definitely don’t want. Secondly, it is difficult to see how such approaches can be accommodated in class sizes of 30 or so typically found in mainstream schools. The authors comment that in the end success comes to the personal relationship between the child and the adult rather than any particular system.

I don’t think I would recommend this book, it is quite academic in style in a field that is not my own. It has to be seen a bit as a campaigning book for the PDA diagnosis written in 2012, so somewhat out of date. I found the National Autistic Society page on demand avoidance a useful alternative to this book. It provides a short summary of some of the key points in Understanding PDA with better context for the diagnosis’s wider, current relevance.

Rosetta Stone – Rust

In an earlier blog post I explained the motivation for a series of “Rosetta Stone” posts which described the ecosystem for different programming languages. This post covers Rust, the associated GitHub repository with some minimal code is here. This blog post aims to provide some discussion around technology choices whilst the GitHub repository provides details of what commands to execute and a minimal example project.

I became interested in Rust because a number of new tools such as uv and ruff for the Python ecosystem are written in Rust. It’s fair to say there has been a buzz around the language in programming circles for some years.

About Rust

Rust started out as a personal project by Graydon Hoare, an employee of Mozilla, in 2006. It was adopted by Mozilla in 2009 and in 2012 the first public release was made. It was originally designed with a focus on memory management and memory safety. It stands with C and assembly as the only languages supported in the development of the Linux kernel. I read the The Rust Programming Language book recently, the distinguishing feature of Rust is the borrow checker and ownership model which is what gives it strong memory safety credentials.

Rust is named for the rust fungi, not the corrosion of iron but it seems few people realise this!

Rust currently ranks 13th on the TIOBE index but has been regularly voted the most admired language on the Stackoverflow rankings.

How is the language defined?

The home for the Rust language is here. Rust evolves through an RFC (request for comments) process, which can be found in the Rust RFC Book. Currently there is no formal specification for the language but there is an exercise to write one.

New versions of the language are released every 6 week (see here). Breaking changes can be introduced in editions (once every 3 years with the next edition, 2024, due in February 2025) but upgrading between editions is optional and there are tools to support version migrations. For more about the edition process see here.

There is a roadmap for the 2024 edition (see here) and presumably once that is released the next roadmap will be developed.

Rust Compilers

The Rust compiler is rustc, there are some alternatives but they are experiments rather than production systems. Typically rustc is invoked with the cargo package manager, see below. My first impression was that the compiler provided really good error messages.

Details of installation can be found here in the accompanying GitHub repository. Installing the whole Rust toolchain is ridiculously simple.

Package management

cargo is the Rust package manager, it is also typically used to compile code to produce a “crate” which may be a binary or library.

Rather neatly invoking cargo to produce a new package also creates a new Git repository with the appropriate layout:

cargo new hello_world --bin

This generates a cargo.toml file which defines the project and dependencies, and on compile a cargo.lock file is produced which specifies exactly the versions of all the dependences. This parallels the NPM system for JavaScript/TypeScript. There is also a --lib flag which generates a layout for a library package. In practice this is just a starting point, your code may include both binaries and libraries for which you will need to edit the cargo.toml file. However, this cargo new process reflects how I would start a project in Python.

The standard library is here, there are no built-in CSV or JSON libraries – regular readers will recall I use this as a measure of a language’s completeness since my favoured language, Python, has them! Others may have different opinions.

Third party Rust crates can be found on the crate registry.

Virtual environments

Rust does not require virtual environments since cargo fetches the appropriate packages on compile, it uses a local cache of packages but this is a true cache – if the version of a package is not in the cache then it is fetched.

Project layout for package publication

cargo new generates a minimal project layout. More generally the conventional project layout is shown below (see here) when code is compiled a target directory is created for the compiled code.

It is rather nice having a mandated project layout!

Testing

A testing framework is built-in and a skeleton test is included when a --lib project is created by cargo The tests look like this:

This is essentially a unit test and the intention in Rust is that the unit tests sit next to the functions which they test, in Python unit tests tend to be separated into tests directory. In a Rust project the tests directory holds integration tests. There is a third type of test, doctests which are embedded in the comments intended for documentation.

All three types of test can be run with cargo test.

The built-in test functionality does not include features such as mocks or parameterized tests but there are third party crates to provide this functionality.

Static analysis and formatting tools

Clippy is the built-in linter, used in addition to rustfmt, the formatter. The are invoked using cargo with cargo fmt and cargo clippy. As a compiled language the compiler provides static analysis too. I would not expect alternatives to clippy or rustfmt to gain much traction since these appear to be the “official” tools.

Documentation Generation

rustdoc is the standard documentation generator tool (see here), working from comments in code and invoked using cargo doc. It feels to me that there is scope for alternatives to rustdoc although perhaps I am mixing up the documentation generation engine with the standards for code comments for documentation which have arisen in Python.

Wrapping up

I was struck by how everything is pretty much built-in for Rust; compiling, packaging, testing, formatting, and linting. All of these tools can be driven from the package management tool, cargo. It is almost like the design team was trying to make the job of writing this post as easy as possible! In writing Rust code in associated with this post I found the built-in test framework missing features (like mocks and parameterization which I’m used to in Python), similarly the documentation system is quite simple so perhaps in time alternatives will start to predominate.

My “home” language of Python has acquired these features over a long period of time, utilizing third party libraries and tools that eventually became de facto standards.

It would be nice to make a comparison with Go which occupies a similar space in programming as a relatively recent arrival with what I believe is a similarly full tool suite.

I welcome comments, probably best on Mastodon where you can find me here.

Review of the year: 2024

The three of us in Rhosneigr

I am now recovering from my long COVID, I can get out and about more now without getting exhausted – I even went on holiday to Rhosneigr for a week in the summer! I have fewer days feeling absolutely awful. This was in part a result of the local long COVID clinic, the instructor for the long COVID exercise classes I attended mentioned that some long COVID sufferers had issues with “mast cell activation syndrome” (MCAS) which can be addressed by dietary changes – essentially a low histamine diet. This has worked for me although I can’t drink alcohol or eat mature cheeses which has been a bit of a blow.

I have been working with the Humanitarian Data Exchange for UNOCHA for the past year which I have really enjoyed, that contract comes to an end shortly so I will be looking for freelance work. I’m also thinking more seriously about retiring. As a result of having paid work I felt able to spend freely, I bought myself a new guitar (an Epiphone Les Paul Standard gold top) and an electric bike (a Rayleigh Motus) – the electric bike has been brilliant and helped me get out and about. I think this is part of the reason I can think about retiring, other middle aged men would buy a Gibson Les Paul and a motorbike for x10 the cost of my purchases!

New guitar – Epiphone Les Paul gold top

This year I reviewed 13 books. I started the year with Her Space, Her Time by Shohini Ghose which was about a history of women in physics, generally astrophysics and cosmology in the late 19th and 20th centuries. I followed this with A Philosophy of Software Design by John Ousterhout which provided an alternative view to how best to design software. Also in this theme was Beautiful Code edited by Andy Oram & Greg Wilson, an edited volume of essays on pieces of code that their authors were particularly pleased with. In the computing theme I also read The Rust Programming Language by Steve Klabnik and Carol Nichols – I’m currently learning Rust. I actually read this book online which is a novelty for me.

My favourite book of the year was An Immense World by Ed Yong this is about animal senses, I picked it up slightly reluctantly thinking that there wasn’t much to say about the five senses and that everything was pretty well known by now. I was wrong on both accounts! I enjoy Yong’s writing, this combined with the subject matter made it my favourite.

I had a bit of an Alice Roberts binge. I read Ancestors, about burials in prehistoric Britain, a few years ago. This year I read Buried and Crypt which are partner volumes to Ancestors which cover burials in the first millennium and the first half of the second millennium respectively. Buried has a secondary theme of migration and Crypt of disease and injury. I also read Anatomical Oddities by Alice Roberts – I must admit this one didn’t really appeal to me. It is a collection of anatomical illustrations with some commentary, Roberts is a very fine illustrator but the text for the book was incoherent.

In the past I have mainly read on the history of science with most material relating to the 15th century and onwards. Roberts’ books got me interested in the earlier history of Britain. I started with Britain BC by Francis Pryor which covers Britain prior to the Roman invasion. Echolands by Duncan MacKay covers Boudica’s revolt against the Roman’s in 60-61AD, it’s a sort of history/travelogue combination which I found very engaging. Roman Britain – A New History by Guy de la Bédoyère is a beautiful, encyclopaedic coffee table book which covers the whole of the Roman occupation of Britain. I am now interested in the late Iron Age coinage in Britain.

To finish with a couple of books which didn’t follow any theme. I read Daphne Draws Data by Cole Nussbaumer Knaflic which is a book about data visualization for children – I reviewed this at the request of the author. I rather enjoyed it and hope to be able to borrow some of the illustrations for my own presentations. Sound tracks by Graeme Lawson is a history of musical instruments via archaeological artefacts. What struck me here is how little of musical instruments survives (usually only metal parts), and also how long sophisticated flutes and pipes have been in existence.

I took part in the Chester mid-summer parade, as a pirate – as I have done for the last few years – I was able to sit down a lot of the time which was a big help.

The author, in front of the new pirate ship for Chester’s mid-Summer parade

Our son is now at online school (Minerva’s Virtual Academy), he is settling in well but getting to this point was not voluntary and was traumatic.

We’re looking forward to a new year of improving health, semi-retirement and lower stress education!

Book review: The Rust Programming Language by Steve Klabnik and Carol Nichols

My next review is a small departure, it is for The Rust Programming Language by Steve Klabnik and Carol Nichols but rather than buy the physical book I read this interactive version, which has quizzes and embedded, runnable code.

The Rust programming language is the target for my next Rosetta Stone blog post which identifies all the tooling for a language. For Rust these tools (the compiler, formatter, linter, package management and automated documentation) are pretty much all “built-in” so my job will be easy. The challenge in this case has been learning the language since I try to write a little code for the Rosetta Stone posts to demonstrate what I’ve learned.

Rust is a relatively new language, very highly regarded amongst developers and one of only two approved for developing Linux. Its focus is on “safety” and speed. It has been used to make new, highly performant tools for the Python ecosystem, like ruff and uv, which is how I came to know of it.

For a Python programmer Rust does not look alien in the way that Haskell and Lisp do; admittedly it uses curly braces for scoping, is strongly-typed and supports pointers and references which are not features of Python but are common in other languages.

To me it feels like C but with some object-oriented features; the authors talk explicitly about it having features of functional languages including use of the Option value which contains something or nothing, the compiler enforces the handling of nothing. I think I might start using this more explicitly in Python which allows type-hinting to indicate an Option-like value. The other explicitly referenced functional feature is the use of closures, in Python closures are functions defined within functions or anonymous / lambda functions whilst in Rust they seem to be closer to functions passed as arguments to other functions.

Rust makes what seems an odd distinction between functions and macros in its standard library. Macros are identified with an exclamation mark, for example println! As I understand this is because a macro is implemented using code generation at runtime which allows the developer to supply, for example, a variable number of arguments to println! which would not be possible for a function println. Python doesn’t make this distinction and is very permissive in the arguments that a function can take, allowing both position and keyword arguments of variable number.

I was struck by the way that different languages use the same word for different things. For example in Rust a struct is both a data container but can also carry methods in the way that “classes” in other languages do. In Python an enum is a closed list of values but in Rust those values can have user-defined associated values so that an enum for IP address protocols can contain V4 and V6 (as it would in Python) but in addition it can hold an actual IP address associated with each entry in the enumeration.

My understanding is that Rust is considered an object-oriented language by some but not all. In practical terms the only object-oriented feature missing is inheritance although this can be approximated by the use of generics and traits.

Since I have scarcely used pointers and references in 40 years of programming I found these concepts a bit challenging but I have made progress in my understanding through reading this book. Excited by this new found understanding I was then confused by Rust’s ownership model! Ownership and borrowing are the big, unique conceptual features of Rust. The aim of ownership is to rigorously ensure that code is safe – no writing past the end of arrays, or dereferencing null points. It also means that the performance hit of a garbage collector is not required, this task is pretty much entirely handled at compile time by the borrow checker. The strong ownership model makes concurrent programming easier too.

In trying to understand ownership and borrowing I found some useful tools, the best entry point was the BORIS tool by Christian Schott which lists other visualization tools including the Aquascope tool used in this book. I found the first such tool in RustViz which is used in teaching, it needs the user to put annotations into the code rather than working out the annotations itself. I also read this article by Chris Morgan.

As language books go, this one is pretty readable, and I found the built-in quizzes handy, if only to illustrate my ignorance particularly of the ownership and borrowing model. I think for my next technical book I might read Category Theory for Programmers by Bartosz Milewski. I have felt when applying type-hints to Python, and learning Rust and Haskell that I was missing out by not understanding at least the basics of category theory.

I enjoyed this book and the format worked pretty well for me, although I need to find a way of reading online content like this in more comfort. I’m keen to give Rust a go now!