<?xml version="1.0" encoding="UTF-8"?> 
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    >
<channel>
    <title>Russ Garrett</title>
    <atom:link href="http://russ.garrett.co.uk/feed/" rel="self" type="application/rss+xml" />
    <link>http://russ.garrett.co.uk</link>
    <description></description>
    <lastBuildDate>Sat, 28 Mar 2026 11:23:12 +0000</lastBuildDate>
    <language>en</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    
        <item>
            <title>Online Safety Act Notes for Small Sites</title>
            <link>http://russ.garrett.co.uk/2024/12/17/online-safety-act-guide/</link>
            <pubDate>Tue, 17 Dec 2024 00:00:00 +0000</pubDate>
            
            <guid isPermaLink="true">http://russ.garrett.co.uk/2024/12/17/online-safety-act-guide</guid>
            
            <description>&lt;p&gt;The UK’s &lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/contents/enacted&quot;&gt;Online Safety Act&lt;/a&gt; (OSA) was passed into law in 2023 and is now being implemented, with the first parts of it going into effect in March 2025. The guidance provided is rather impenetrable, so I’ve decided to write my own summary here.&lt;/p&gt;

&lt;p&gt;If you run a small site, you might be interested in joining &lt;a href=&quot;https://buttondown.com/indie-and-community-web-compliance-&quot;&gt;Promising Trouble’s mailing list&lt;/a&gt; – they are trying to get some more solid guidance for small sites out of Ofcom. Neil Brown also has a website which is &lt;a href=&quot;https://onlinesafetyact.co.uk/&quot;&gt;collecting resources&lt;/a&gt; on Online Safety Act compliance.&lt;/p&gt;

&lt;h2 id=&quot;disclaimer&quot;&gt;Disclaimer&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;I’m not a lawyer and this document is not legal advice&lt;/strong&gt;, but I am quite familiar with UK law and I’ve spent many hours reading the guidance. I’m mostly writing this to condense my own thoughts, but I hope others find it useful, and suggestions are welcome.&lt;/p&gt;

&lt;p&gt;If you’re running a service covered by the OSA, you’re going to need to carefully review the law and the guidance yourself (hopefully this’ll help), or you’ll need to get a lawyer.&lt;/p&gt;

&lt;h2 id=&quot;about-this-document&quot;&gt;About this document&lt;/h2&gt;
&lt;p&gt;This document is targeted towards operators of small “user-to-user” services, with up to 700,000 UK users, and which are not “likely to be accessed by children” (as covered below). Regulated services are sometimes referred to as “Part 3” services.&lt;/p&gt;

&lt;p&gt;You might see references to “Category 1/2A/2B” services – these are the largest services which are subject to additional regulation. If you’re one of those, you’ll have the dubious honour of being contacted directly by Ofcom in summer 2025, but if you’re running a smaller service, you still have plenty of new rules to comply with.&lt;/p&gt;

&lt;p&gt;OSA compliance is a risk assessment based process, so if you’re trying to find solid answers to some questions, you may find there aren’t any. As long as you’re able to justify your answer, you’re unlikely to face an immediate fine if the regulator ever disagrees with it.&lt;/p&gt;

&lt;p&gt;I’ll try and keep this document up to date as the situation develops, but I can’t provide any guarantees.&lt;/p&gt;

&lt;h2 id=&quot;summary-of-the-online-safety-act&quot;&gt;Summary of the Online Safety Act&lt;/h2&gt;
&lt;p&gt;In a nutshell, the OSA requires services which handle user-generated content to:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Have baseline content moderation practices&lt;/li&gt;
  &lt;li&gt;Use those moderation practices to take down reported content that violates UK law&lt;/li&gt;
  &lt;li&gt;Stop kids from seeing porn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contrary to some rumours, as a small site the OSA &lt;strong&gt;does not require you to proactively monitor or scan people’s posts&lt;/strong&gt; – you only have to respond to reports when they are made.&lt;/p&gt;

&lt;p&gt;The guidance does recommend scanning uploaded images and posted URLs for CSAM (child porn), but this recommendation currently only applies to sites with more than 700,000 UK users, or sites which are primarily for file-sharing. This is covered in more detail below.&lt;/p&gt;

&lt;h2 id=&quot;guidance&quot;&gt;Guidance&lt;/h2&gt;
&lt;p&gt;The act itself provides a broad framework, but most of the useful detail is in the statutory guidance, which Ofcom has initially published in December 2024. That’s the “Regulatory documents &amp;amp; guidance” section on &lt;a href=&quot;https://www.ofcom.org.uk/online-safety/illegal-and-harmful-content/statement-protecting-people-from-illegal-harms-online/&quot;&gt;this page&lt;/a&gt; – not all the other documents above it, which are just their expansive response to the consultation.&lt;/p&gt;

&lt;p&gt;In January 2025, Ofcom released a &lt;a href=&quot;https://www.ofcom.org.uk/online-safety/protecting-children/statement-age-assurance-and-childrens-access/&quot;&gt;second batch of guidance&lt;/a&gt; relating to age verification.&lt;/p&gt;

&lt;h3 id=&quot;ofcoms-assessment-tool&quot;&gt;Ofcom’s Assessment Tool&lt;/h3&gt;

&lt;p&gt;Ofcom offers an &lt;a href=&quot;https://www.ofcom.org.uk/os-toolkit/assessment-tool/&quot;&gt;assessment tool&lt;/a&gt; which attempts to guide you through the compliance process. It still requires you fill in a separate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.docx&lt;/code&gt; template to record your risk assessment.&lt;/p&gt;

&lt;p&gt;While this tool is generally quite comprehensive, as of late January 2025 I think the “children’s access assessment” portion is badly over-simplified – it asks “Do child users access some or all of the service?” with no additional guidance. This might tempt you to answer “no” when Ofcom’s full guidance (summarised below) suggests that the majority of sites should answer “yes”.&lt;/p&gt;

&lt;h2 id=&quot;definitions&quot;&gt;Definitions&lt;/h2&gt;
&lt;p&gt;I’m trying to keep this relatively jargon-free but there are a few terms which get used constantly:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Priority offence&lt;/em&gt;: Terrorism, CSAM, grooming, assisting suicide, threats to kill, harassment, stalking, bunch of public order offences. (There’s a lot. See schedules 5-7 for the full list)&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Relevant offence&lt;/em&gt;: Either a &lt;em&gt;priority offence&lt;/em&gt;, one of the &lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/part/10/enacted&quot;&gt;communications offences defined in the OSA itself&lt;/a&gt; (encouraging self-harm, threatening communications, etc), or any other offence the government decides to add in future&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Illegal content&lt;/em&gt;: Any content which amounts to a &lt;em&gt;relevant offence&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Priority content&lt;/em&gt;: Any content which amounts to a &lt;em&gt;priority offence&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/59/enacted&quot;&gt;s59&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;scope&quot;&gt;Scope&lt;/h2&gt;
&lt;p&gt;The Online Safety Act applies to &lt;strong&gt;every&lt;/strong&gt; service which handles user-generated content and has “links to the UK”, with a few limited exceptions listed below.&lt;/p&gt;

&lt;p&gt;The scope is extraterritorial (like the GDPR) so even sites entirely operated outside the UK are in scope if they are considered to have “links to the UK”.&lt;/p&gt;

&lt;p&gt;A service has links to the UK if any of the following apply:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;the service has a “significant number” of UK users&lt;/li&gt;
  &lt;li&gt;UK users form one of the target markets for the service&lt;/li&gt;
  &lt;li&gt;the service is accessible to UK users and “there are reasonable grounds to believe that there is a material risk of significant harm to individuals in the UK” (this seems less likely to apply for smaller services but who knows)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/4/enacted&quot;&gt;s4(5)-4(6)&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;“Significant number” is not defined, either in the law or the guidance. Ofcom says:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Service providers should be able to explain their judgement, especially if they think they do not have a significant number of UK users.
(&lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/online-safety/information-for-industry/illegal-harms/overview-of-regulated-services.pdf?v=387540&quot;&gt;Overview of Regulated Services 1.11-1.13&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;exemptions&quot;&gt;Exemptions&lt;/h3&gt;
&lt;p&gt;There’s a short list of narrow exemptions, which are not covered by the OSA at all:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Internal business services, only accessible to employees (or volunteers/contractors)&lt;/li&gt;
  &lt;li&gt;Email services (it appears this includes mailing lists)&lt;/li&gt;
  &lt;li&gt;SMS/MMS/one-to-one voice services&lt;/li&gt;
  &lt;li&gt;“Limited functionality services”
    &lt;ul&gt;
      &lt;li&gt;This is when users can only post comments on the provider’s published content, not on user-generated content&lt;/li&gt;
      &lt;li&gt;This includes, e.g., product reviews&lt;/li&gt;
      &lt;li&gt;It probably includes blog comments but it may not include them if users can reply to each other – this is unclear (&lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/online-safety/information-for-industry/illegal-harms/overview-of-regulated-services.pdf?v=387540&quot;&gt;Overview of Regulated Services 1.17&lt;/a&gt;)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Services which enable combinations of Email/SMS/limited functionality services&lt;/li&gt;
  &lt;li&gt;Services provided by public bodies&lt;/li&gt;
  &lt;li&gt;Services provided by persons providing education or childcare&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/schedule/1/part/1&quot;&gt;Schedule 1 part 1&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;hosted-services&quot;&gt;Hosted services&lt;/h3&gt;
&lt;p&gt;The OSA puts obligations on the service provider, so if you host a community on a platform such as Discord or WhatsApp, the OSA doesn’t directly affect you (although it’s likely you’ll soon see the indirect effects).&lt;/p&gt;

&lt;p&gt;While larger platforms are subject to more regulation under the OSA than smaller sites, I think it’s clear that it provides a centralising force, particularly given the complexity of the regulations and the lack of straightforward guidance for smaller sites.&lt;/p&gt;

&lt;h2 id=&quot;duties&quot;&gt;Duties&lt;/h2&gt;
&lt;p&gt;As a small user-to-user service, the OSA requires you to:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Assess the risk of &lt;em&gt;illegal content&lt;/em&gt; &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/9/enacted&quot;&gt;s9&lt;/a&gt;)&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Take proportionate measures to mitigate the illegal content risks you identified &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/10/enacted&quot;&gt;s10(2)(c)&lt;/a&gt;)&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Take proportionate measures to prevent people encountering &lt;em&gt;priority content&lt;/em&gt; &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/10/enacted&quot;&gt;s10(2)(a)&lt;/a&gt;)&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Take proportionate measures to mitigate the risk of people committing &lt;em&gt;priority offences&lt;/em&gt; &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/10/enacted&quot;&gt;s10(2)(b)&lt;/a&gt;)&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Allow users to easily report illegal content, and content which is harmful to children, and take it down &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/20/enacted&quot;&gt;s20&lt;/a&gt;)&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Allow users to complain about reports, takedowns, etc &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/21/enacted&quot;&gt;s21&lt;/a&gt;)&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;“Have particular regard to the importance of protecting users’ right to freedom of expression” &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/22/enacted&quot;&gt;s22(2)&lt;/a&gt;)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t have to worry too much about these duties directly – the risk assessment process guides you through what you need to do to comply with them.&lt;/p&gt;

&lt;p&gt;If your service is “likely to be accessed by children”, there are additional requirements, including to perform a separate “children’s risk assessment”. If your service is likely to be accessed by children and permits pornographic content, you’re required to carry out “highly effective” age verification &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/12&quot;&gt;s12&lt;/a&gt;)&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;childrens-access-assessment&quot;&gt;Children’s access assessment&lt;/h2&gt;
&lt;p&gt;You must perform and record a “children’s &lt;em&gt;access&lt;/em&gt; assessment” to confirm whether your service is likely to be accessed by children.&lt;/p&gt;

&lt;p&gt;Your service (or part of it) is “likely to be accessed by children” if the following applies:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;You don’t use age verification or age estimation to prevent children from accessing it, and,&lt;/li&gt;
  &lt;li&gt;There is a “significant number” of children who are users (based on the ratio of total UK users to UK child users), or it’s “likely to attract” a significant number of child users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/35/enacted&quot;&gt;s35&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Of course “significant number” isn’t defined here either. Ofcom has a &lt;a href=&quot;https://www.ofcom.org.uk/online-safety/illegal-and-harmful-content/quick-guide-to-childrens-access-assessments/&quot;&gt;guidance page&lt;/a&gt; on these assessments. Notably it says:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Even a relatively small number of children could be significant in terms of the risk of harm. We suggest you should err on the side of caution in making your assessment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the &lt;a href=&quot;https://www.ofcom.org.uk/online-safety/protecting-children/age-checks-to-protect-children-online/&quot;&gt;announcement of their age assurance guidance&lt;/a&gt;, Ofcom says:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Unless they are already using highly effective age assurance and can evidence this, we anticipate that most of these [user-to-user and search] services will need to conclude that they are likely to be accessed by children within the meaning of the Act.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/consultations/category-1-10-weeks/statement-age-assurance-and-childrens-access/childrens-access-assessments-guidance.pdf?v=388843&quot;&gt;children’s access assessment guidance&lt;/a&gt; is fairly readable (although not necessarily clear) and I won’t reproduce it all here.&lt;/p&gt;

&lt;p&gt;If you conclude that your service is &lt;em&gt;not&lt;/em&gt; likely to be accessed by children, you must perform a new children’s access assessment annually to confirm this is still the case.&lt;/p&gt;

&lt;h3 id=&quot;freedom-of-expression&quot;&gt;Freedom of expression&lt;/h3&gt;
&lt;p&gt;It’s worth commenting briefly on the “freedom of expression” duty. Ofcom is clear that it’s intended to prevent the OSA itself from unduly interfering with users’ freedom of expression.&lt;/p&gt;

&lt;p&gt;Sites are still free to put whatever additional restrictions they like in their TOS, and Ofcom has no power to restrict that, though it’s worth taking the opportunity to make sure that your TOS supports the moderation actions you’re taking.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Ofcom does not have a power under the Act to compel providers to carry content they do not wish to carry. In practice, this means that services may continue to operate with regard to Terms and Conditions which prohibit more content than is covered in this Guidance, though they will not be compliant if their Terms and Conditions capture less. However, we encourage providers to consider carefully the impacts of their choices on users’ opportunities to express themselves. &lt;em&gt;(&lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/online-safety/information-for-industry/illegal-harms/illegal-content-judgements-guidance-icjg.pdf?v=387556&quot;&gt;Illegal Content Judgements Guidance 1.4&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;fees&quot;&gt;Fees&lt;/h2&gt;
&lt;p&gt;The Online Safety Act gives Ofcom the ability to levy fees on sites which fall within the OSA’s scope. The fee structure has not been confirmed yet, and it appears they won’t start charging fees until 2026.&lt;/p&gt;

&lt;p&gt;There is a consultation being run about fees, and Ofcom is proposing that only companies with a worldwide revenue above £250m (and revenue from UK users above £10m) will be required to pay fees. So at least this isn’t a concern for small sites.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(&lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/consultations/category-1-10-weeks/consultation-online-safety---fees-and-penalties/main-documents/consultation-online-safety---fees-and-penalties.pdf?v=383849&quot;&gt;Online Safety - fees and penalties consultation&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;enforcement&quot;&gt;Enforcement&lt;/h2&gt;
&lt;p&gt;If you’re found not to be complying with the OSA, Ofcom will generally aim to engage with you and ask you to fix it first.&lt;/p&gt;

&lt;p&gt;If you’re still in breach, they will open a formal investigation. The outcome of this may be a “provisional notice of contravention”, which will detail the steps you must take, or fine you up to a maximum of 10% of worldwide revenue or £18m, whichever is greater.&lt;/p&gt;

&lt;p&gt;While investigating a site, Ofcom can issue you with an “information notice” to request further information. It’s a criminal offence &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/109/enacted&quot;&gt;s109&lt;/a&gt;)&lt;/em&gt; if you fail to comply with this.&lt;/p&gt;

&lt;p&gt;Ofcom can make related companies jointly liable for a fine. They can also make “controlling individuals” (owners of a company) personally liable, if they exercise dominant influence or control over the service. &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/schedule/15/enacted&quot;&gt;schedule 15&lt;/a&gt;, &lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/online-safety/information-for-industry/illegal-harms/online-safety-enforcement-guidance.pdf?v=387566&quot;&gt;Enforcement Guidance section 7&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If a service doesn’t comply with a confirmation decision, and Ofcom believes the risk of harm is sufficiently high, they can deploy “business disruption measures”, by ordering ISPs, service providers, or app stores to block the service.&lt;/p&gt;

&lt;p&gt;If you fail to comply with a requirement in the confirmation decision, and the requirement relates to children’s online safety, you can be prosecuted &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/138/enacted&quot;&gt;s138&lt;/a&gt;)&lt;/em&gt;. Corporate officers can be made personally liable for these offences &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/202/enacted&quot;&gt;s202&lt;/a&gt;)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(&lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/online-safety/information-for-industry/illegal-harms/online-safety-enforcement-guidance.pdf?v=387566&quot;&gt;Enforcement Guidance&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;illegal-content-risk-assessment&quot;&gt;Illegal content risk assessment&lt;/h2&gt;
&lt;p&gt;This is really the core part of the OSA. All services must carry out a “suitable and sufficient” illegal content risk assessment. This must be done:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Before 16 March 2025&lt;/strong&gt; for existing services&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Before&lt;/strong&gt; making any significant change to your service (see &lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/online-safety/information-for-industry/illegal-harms/risk-assessment-guidance-and-risk-profiles.pdf?v=387549&quot;&gt;risk assessment guidance s4&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Within 3 months of launching a new service (or a service coming into the scope of the OSA)&lt;/li&gt;
  &lt;li&gt;Whenever Ofcom changes their guidance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need to keep records of each assessment.
&lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/9/enacted&quot;&gt;s9(1-4)&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/online-safety/information-for-industry/illegal-harms/risk-assessment-guidance-and-risk-profiles.pdf?v=387549&quot;&gt;risk assessment guidance&lt;/a&gt;, at a mere 84 pages, is actually one of the better and more concise documents, and you probably do need to read that one all the way through.&lt;/p&gt;

&lt;p&gt;I’ll summarise a few points:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;There are 17 categories of &lt;em&gt;priority content&lt;/em&gt; which you must individually risk-assess. You also have to assess the risk of other &lt;em&gt;illegal content&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;Each category needs to be assigned a risk level of “low”, “medium”,  or “high”&lt;/li&gt;
  &lt;li&gt;The risk assessment needs to take into account &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/9/enacted&quot;&gt;s9(5)&lt;/a&gt;)&lt;/em&gt;:
    &lt;ul&gt;
      &lt;li&gt;the user base&lt;/li&gt;
      &lt;li&gt;the risk of encountering illegal content, taking into account any recommendation algorithms or sharing features&lt;/li&gt;
      &lt;li&gt;the risk of users committing or facilitating a &lt;em&gt;priority offence&lt;/em&gt;, and possibly harming other users in the process&lt;/li&gt;
      &lt;li&gt;the nature and severity of the harm which could be caused&lt;/li&gt;
      &lt;li&gt;how the service’s design might affect the risks&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;You’ll need to refer to the “Risk Profiles” in section 1 of the guidance and list the aspects which apply to your service&lt;/li&gt;
  &lt;li&gt;This is then combined with “evidence” (data about your service) to produce the final risk score. This is the fuzzy bit, although section 3 has some rules about this&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;measures&quot;&gt;Measures&lt;/h2&gt;
&lt;p&gt;So now you’ve got a risk assessment, you can finally find out what you have to do. Smaller services (which again, are the only services we consider here), are split into three categories based on the results of your risk assessment. This will then determine the list of &lt;em&gt;measures&lt;/em&gt; you need to take.&lt;/p&gt;

&lt;p&gt;Technically these are only &lt;em&gt;recommended&lt;/em&gt; measures, and you’re not required to implement them, but if you implement these measures, you are considered to be complying with the duties. You can use your own &lt;em&gt;alternative measures&lt;/em&gt; as long as you ensure they protect users’ freedom of speech and privacy, as well as complying with the duties. &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/49/enacted&quot;&gt;s49&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The measures are numbered (in the form “ICU A1”), and as a user-to-user service you only have to care about those starting ICU. Those measures are summarised in the “&lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/online-safety/information-for-industry/illegal-harms/summary-of-our-decisions.pdf?v=387523&quot;&gt;Summary of our decisions&lt;/a&gt;” document and described in detail in the &lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/online-safety/information-for-industry/illegal-harms/illegal-content-codes-of-practice-for-user-to-user-services.pdf&quot;&gt;Code of Practice for user-to-user services&lt;/a&gt;. I’ve only summarised them here, in a more readable format.&lt;/p&gt;

&lt;p&gt;Measures are split up by risk category. Every risk category includes the previous ones:&lt;/p&gt;

&lt;h3 id=&quot;low-risk-services&quot;&gt;Low-risk services&lt;/h3&gt;
&lt;p&gt;This is the minimum standard for all services regulated by the OSA. You’re a low-risk service &lt;em&gt;only&lt;/em&gt; if you have assessed your risk as low for &lt;em&gt;all 17 kinds&lt;/em&gt; of illegal harms.&lt;/p&gt;

&lt;p&gt;I suspect this category might cover the smallest forums, as well as other sites which have some user-generated content.&lt;/p&gt;

&lt;table&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Measure&lt;/th&gt;
            &lt;th&gt;Summary&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU A2&lt;/td&gt;
            &lt;td&gt;Name an individual (accountable to the most senior governance body) to handle content safety, reporting and complaints.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU C1&lt;/td&gt;
            &lt;td&gt;Have a process to review content which the &lt;em&gt;provider&lt;/em&gt; (not the user, that comes later) thinks may be illegal.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU C2&lt;/td&gt;
            &lt;td&gt;Have systems designed to swiftly take down illegal content, unless it is currently not technically feasible to achieve this outcome. (&quot;Swiftly&quot; is not defined. The law doesn&apos;t mandate timeframes for smaller sites.)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU D1&lt;/td&gt;
            &lt;td&gt;Have a system for users to make a complaint.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU D2&lt;/td&gt;
            &lt;td&gt;Users should be able to complain about a specific piece of content, or just complain in general. They must be able to provide supporting information with the complaint.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU D7&lt;/td&gt;
            &lt;td&gt;A user complaint about illegal content should be treated as per ICU C1.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU D9&lt;/td&gt;
            &lt;td&gt;If a complaint is an appeal, it should be determined promptly. (No guidance provided on the difference between &quot;swiftly&quot; and &quot;promptly&quot;.)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU D10&lt;/td&gt;
            &lt;td&gt;If an appeal is approved, the content or user subject to that appeal should be reinstated. If there&apos;s a pattern of content being taken down in error, guidance should be adjusted or automated systems should be changed.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU D11&lt;/td&gt;
            &lt;td&gt;If the complaint is about &quot;proactive technology&quot; (scanning/fingerprinting) not behaving correctly, the complainant should be told what the provider is doing to rectify it, and their right to take legal action (?)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU D12&lt;/td&gt;
            &lt;td&gt;If the complaint is about compliance with the OSA, it should be passed to a nominated individual, and should be handled within an appropriate timeframe.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU D13&lt;/td&gt;
            &lt;td&gt;A complaint should only be disregarded if it is manifestly unfounded, in accordance with the TOS. These events should be reviewed to ensure the policy is appropriate.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU G1&lt;/td&gt;
            &lt;td&gt;The provider&apos;s TOS must include a number of specified provisions regarding illegal content, proactive technology, and complaints.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU G3&lt;/td&gt;
            &lt;td&gt;The terms from ICU G1 must be clearly signposted, accessible, and easily readable for the age range of the site.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU H1&lt;/td&gt;
            &lt;td&gt;The provider must remove public content and accounts from proscribed terrorist organisations.&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;single-risk-services&quot;&gt;Single-risk services&lt;/h3&gt;
&lt;p&gt;Single-risk services are services where only one harm is assessed as being “medium” or “high” risk.&lt;/p&gt;

&lt;p&gt;In addition to the measures in the low-risk services category, single-risk services are recommended to:&lt;/p&gt;

&lt;table&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Measure&lt;/th&gt;
            &lt;th&gt;Applies if&lt;/th&gt;
            &lt;th&gt;Summary&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU C9&lt;/td&gt;
            &lt;td&gt;High risk of image-based CSAM &amp;amp; is a file-storage/file-sharing service (see below)&lt;/td&gt;
            &lt;td&gt;Use perceptual hashing to scan uploaded images for CSAM.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU D4&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;Acknowledge receipt of each complaint and provide an indicative timeframe for deciding the complaint&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU D6&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;Enable the complainant to opt out of receiving any non-ephemeral (?) communications about a complaint.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU F1&lt;/td&gt;
            &lt;td rowspan=&quot;2&quot;&gt;High risk of grooming &amp;amp; existing means to determine the age/age range of the user&lt;/td&gt;
            &lt;td&gt;Hide child user accounts from recommended follows, disallow direct messaging to child accounts the user does not follow.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU F2&lt;/td&gt;
            &lt;td&gt;Prompt child user accounts with contextual info about safety features and risks.&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;(Note that there are several measures omitted from this table which only apply to services “likely to be accessed by children”.)&lt;/p&gt;

&lt;h4 id=&quot;a-note-on-csam-scanning&quot;&gt;A note on CSAM scanning&lt;/h4&gt;
&lt;p&gt;If you have fewer than 700,000 UK users, you’re only recommended to scan image uploads for CSAM if &lt;strong&gt;both&lt;/strong&gt; of the following conditions apply:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;You have assessed a high risk of CSAM uploads (there is specific guidance on how to assess this risk in Table 13.1 of the &lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/online-safety/information-for-industry/illegal-harms/risk-assessment-guidance-and-risk-profiles.pdf?v=388099&quot;&gt;risk assessment guidance&lt;/a&gt;), and,&lt;/li&gt;
  &lt;li&gt;You are a “a file-storage and file-sharing service” (“services whose primary functionalities involve enabling users to store digital content and share access to that content through links”)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are suggestions that the threshold for CSAM scanning will be lowered in future. This kind of scanning is free to use, has a low impact on user privacy (for non-e2e-encrypted services, at least), and is relatively straightforward to implement with services like &lt;a href=&quot;https://www.microsoft.com/en-us/photodna?oneroute=true&quot;&gt;Microsoft PhotoDNA&lt;/a&gt; or &lt;a href=&quot;https://blog.cloudflare.com/the-csam-scanning-tool&quot;&gt;Cloudflare&lt;/a&gt;. I think any site which accepts more than a trivial amount of image uploads should consider using something like this, even if it isn’t required by the OSA.&lt;/p&gt;

&lt;h3 id=&quot;multi-risk-services&quot;&gt;Multi-risk services&lt;/h3&gt;
&lt;p&gt;Multi-risk services are all other services, where more than one risk is “medium” or “high”.&lt;/p&gt;

&lt;table&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Measure&lt;/th&gt;
            &lt;th&gt;Applies if&lt;/th&gt;
            &lt;th&gt;Summary&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU A3&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;Have written statements of responsibilities regarding illegal harms for senior managers.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU A5&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;Track evidence of new kinds of illegal content, using data from complaints/&amp;ZeroWidthSpace;moderation/&amp;ZeroWidthSpace;law enforcement referrals/etc.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU A6&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;Have a code of conduct for employees around illegal harms.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU A7&lt;/td&gt;
            &lt;td&gt;Does not apply to volunteers&lt;/td&gt;
            &lt;td&gt;Employees working in design and management of the service must be trained in compliance to safety duties.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU C3&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;Written internal content policies.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU C4&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;Content moderation performance targets covering speed and accuracy.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU C5&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;Written policy for prioritising content for review.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU C6&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;Content moderation should be adequately resourced.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU C7&lt;/td&gt;
            &lt;td&gt;Does not apply to volunteers&lt;/td&gt;
            &lt;td&gt;Content moderators should receive adequate training and materials.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU C8&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;Content moderation volunteers should have access to adequate materials.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU D8&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;Appeal processing should be monitored for speed and accuracy and adequately resourced.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ICU E1&lt;/td&gt;
            &lt;td&gt;Recommender systems are tested publicly &amp;amp; high risk of two or more harms from a specific list&lt;/td&gt;
            &lt;td&gt;Safety metrics should be produced and analysed when conducting on-platform testing of recommender systems.&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;decentralised-services&quot;&gt;Decentralised services&lt;/h2&gt;

&lt;p&gt;In their consultation response, Ofcom makes clear that they don’t &lt;em&gt;intend&lt;/em&gt; for the Online Safety Act to make decentralised services unlawful:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;We recognise that a wide variety of service types will fall in scope of the Act, including services with a decentralised and community-moderated organisational model. However, we have intentionally designed each measure with flexibility in mind as we recognise the importance for providers to have some flexibility in how they will implement these measures. We encourage providers to consider the safety outcome expected and to implement the measures in a way that is appropriate and effective for their own service and organisational structure.
(&lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/online-safety/information-for-industry/illegal-harms/volume-1-governance-and-risks-management.pdf?v=387545&quot;&gt;Volume 1: Governance and Risk Management 5.19&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Given that the duties only require services to take “proportionate measures”, the implication must be that decentralised services will be given more leeway.&lt;/p&gt;

&lt;h3 id=&quot;mastodon--the-fediverse&quot;&gt;Mastodon &amp;amp; the Fediverse&lt;/h3&gt;

&lt;p&gt;Fediverse services like Mastodon should be able to re-use a standardised risk assessment, which should simplify things. However, they will likely end up in the “multi-risk” category, and some of the recommended measures don’t apply neatly to this situation, which means you may not get the guarantee of compliance which those measures provide.&lt;/p&gt;

&lt;p&gt;If your fediverse service is considered “likely to be accessed by children” (and it’s hard to see how open-signup instances wouldn’t), then it’s fairly clear you’ll be required to deploy age verification technology due to the presence of pornographic content on the fediverse &lt;em&gt;(&lt;a href=&quot;https://www.legislation.gov.uk/ukpga/2023/50/section/12&quot;&gt;s12&lt;/a&gt;, &lt;a href=&quot;https://www.ofcom.org.uk/siteassets/resources/documents/consultations/category-1-10-weeks/statement-age-assurance-and-childrens-access/childrens-access-assessments-guidance.pdf?v=388843&quot;&gt;children’s access assessment guidance&lt;/a&gt;)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;IFTAS is &lt;a href=&quot;https://connect.iftas.org/library/legal-regulatory/online-safety-act/&quot;&gt;working on guidance&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The most interesting question here is: if your Mastodon server doesn’t have “links to the UK”, but it federates with servers which do, are you subject to the OSA?&lt;/p&gt;
</description>
        </item>
    
        <item>
            <title>Glastonbury Festival 2015 Premises License</title>
            <link>http://russ.garrett.co.uk/2016/06/13/glastonbury-festival-license/</link>
            <pubDate>Mon, 13 Jun 2016 00:00:00 +0000</pubDate>
            
            <guid isPermaLink="true">http://russ.garrett.co.uk/2016/06/13/glastonbury-festival-license</guid>
            
            <description>&lt;p&gt;In March 2014, I submitted a &lt;a href=&quot;https://www.whatdotheyknow.com/request/glastonbury_festivals_premises_l&quot;&gt;Freedom of Information Act request&lt;/a&gt; to Mendip District Council for the Premises License
and supporting documentation for Glastonbury Festival.&lt;/p&gt;

&lt;p&gt;Today, two and a quarter years later, I received an inch-thick sheaf of paperwork in the post.&lt;/p&gt;

&lt;h1 id=&quot;the-documents&quot;&gt;The Documents&lt;/h1&gt;

&lt;p&gt;These documents were released by Mendip District Council under the Freedom of
Information Act 2000, with reference number FOI/2015/341.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Editor’s note:&lt;/strong&gt; I had to scan in some 350 pages to put these online. A few pages appear
to have been truncated - this is an artefact of the page trimming from my scanning software,
and no content has been lost. The size of the PDFs could probably be improved but bandwidth
is cheap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copyright note:&lt;/strong&gt; Although these documents retain the copyright of their original author,
anyone may request a copy from MDC, incurring them additional expense and hassle at a time
where they’re clearly very stretched for resources.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/cover-letter.pdf&quot;&gt;Cover Letter&lt;/a&gt; (800kB, 1 page)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/premises-license.pdf&quot;&gt;Premises License and Operating Schedule&lt;/a&gt; (34MB, 24 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/alcohol-management-plan.pdf&quot;&gt;Alcohol Management Plan&lt;/a&gt; (10MB, 7 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/campsite-management-plan.pdf&quot;&gt;Campsite Management Plan&lt;/a&gt; (17MB, 13 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/command-control-communications-and-coordination-plan.pdf&quot;&gt;Command, Control, Communications, and Coordination Plan&lt;/a&gt; (21MB, 16 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/crime-prevention-and-reduction-plan.pdf&quot;&gt;Crime Prevention and Reduction Plan&lt;/a&gt; (30MB, 28 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/crowd-dynamics-plan.pdf&quot;&gt;Crowd Dynamics Plan&lt;/a&gt; (9MB, 8 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/fire-safety-plan.pdf&quot;&gt;Fire Safety Plan&lt;/a&gt; (17MB, 16 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/public-safety-management-plan.pdf&quot;&gt;Public Safety Managment Plan&lt;/a&gt; (64MB, 48 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/sanitary-facilities-plan.pdf&quot;&gt;Sanitary Facilities Plan&lt;/a&gt; (15MB, 14 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/security-and-stewarding-operational-plan.pdf&quot;&gt;Security and Stewarding Operational Plan&lt;/a&gt; (41MB, 41 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/ticket-and-entry-policy.pdf&quot;&gt;Ticket and Entry Policy&lt;/a&gt; (6MB, 6 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/trader-information-management-plan.pdf&quot;&gt;Trader Information Management Plan&lt;/a&gt; (97MB, 84 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/traffic-management-plan.pdf&quot;&gt;Traffic Management Plan&lt;/a&gt; (28MB, 22 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/venues-plan.pdf&quot;&gt;Venues Plan&lt;/a&gt; (16MB, 12 pages)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://s3.amazonaws.com/russgarrett/gfl-license-2015/villages-proposal.pdf&quot;&gt;Villages Proposal&lt;/a&gt; (13MB, 10 pages)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my request, I gave permission for MDC to omit (at their discretion) any documents
which would be especially sensitive and difficult to redact. As far as I can tell from
the required documents in the Operating Schedule, the documents they didn’t provide are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Major Incident Plan&lt;/li&gt;
  &lt;li&gt;Medical and Welfare Plan&lt;/li&gt;
  &lt;li&gt;Noise Management Plan&lt;/li&gt;
  &lt;li&gt;Site Plan&lt;/li&gt;
  &lt;li&gt;Water Supply Plan&lt;/li&gt;
  &lt;li&gt;Schedule of Key Dates&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;why&quot;&gt;Why?&lt;/h1&gt;
&lt;p&gt;As well as being a fan of Glastonbury and an attendee for over 10 years, I’m also a
&lt;a href=&quot;https://www.emfcamp.org&quot;&gt;festival organiser&lt;/a&gt; myself (on a rather smaller scale), and
interested in the big infrastructure needed to put these massive events together.&lt;/p&gt;

&lt;p&gt;You don’t need to FOI request EMF’s event management plan; you can
&lt;a href=&quot;https://github.com/emfcamp/event-management-plan&quot;&gt;find it on GitHub&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
    
        <item>
            <title>PostgreSQL Monitoring Cheatsheet</title>
            <link>http://russ.garrett.co.uk/2015/10/02/postgres-monitoring-cheatsheet/</link>
            <pubDate>Fri, 02 Oct 2015 00:00:00 +0000</pubDate>
            
            <guid isPermaLink="true">http://russ.garrett.co.uk/2015/10/02/postgres-monitoring-cheatsheet</guid>
            
            <description>&lt;p&gt;This is an attempt to build a fairly comprehensive list of metrics you
should be monitoring on a PostgreSQL 9.4 database server. If you’ve
found any particular metrics useful which aren’t listed here,
please &lt;a href=&quot;/contact.html&quot;&gt;let me know&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Many thanks to the &lt;a href=&quot;https://gds.blog.gov.uk/2015/09/08/building-a-platform-to-host-digital-services/&quot;&gt;Government
PaaS&lt;/a&gt; team at
&lt;a href=&quot;https://gds.blog.gov.uk/about/&quot;&gt;GDS&lt;/a&gt;, who I’ve been working with, for
giving me the chance to put this list together.&lt;/p&gt;

&lt;h2 id=&quot;system-metrics&quot;&gt;System Metrics&lt;/h2&gt;

&lt;p&gt;You should be recording a comprehensive set of system performance metrics for any
database server, but these are the ones you really want to keep an eye on:&lt;/p&gt;

&lt;h3 id=&quot;free-disk-space&quot;&gt;Free disk space&lt;/h3&gt;
&lt;p&gt;This seems obvious, but you want to keep 10% available disk space on the
Postgres data partition, since disk space can fluctuate during vacuuming,
especially with high write loads. Running out of disk space will (at
best) be detrimental to your availability. Alert on it.&lt;/p&gt;

&lt;h3 id=&quot;cpu-usage&quot;&gt;CPU Usage&lt;/h3&gt;
&lt;p&gt;Again, pretty self-explanatory; max out the CPU and you’re going to get
slowdowns. High user CPU usage can indicate badly optimised queries, but
if your queries are reasonably well-optimised, being CPU-bound is a pretty
good situation for Postgres to be in.&lt;/p&gt;

&lt;p&gt;High system CPU usage can be an indication of too much query parallelism (also
check out the number of context switches).&lt;/p&gt;

&lt;h3 id=&quot;io-usage&quot;&gt;I/O usage&lt;/h3&gt;
&lt;p&gt;CPU percentage of IOwait should be your first port of call if you’re seeing
Postgres slowness – it indicates the amount of time the machine is waiting for
the disk.&lt;/p&gt;

&lt;p&gt;It’s worth keeping metrics for the various individual I/O stats (iops, merged I/O
transactions, queue size, service time, average wait time, etc.) which
will help you drill down on any I/O problems. If you’ve got separate
partitions for WAL and data, break those down.&lt;/p&gt;

&lt;h2 id=&quot;postgres-metrics&quot;&gt;Postgres Metrics&lt;/h2&gt;
&lt;h3 id=&quot;total-number-of-connections&quot;&gt;Total number of connections&lt;/h3&gt;
&lt;p&gt;This will tell you how close you are to hitting your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;max_connections&lt;/code&gt;
limit, and show up any clients which are leaking database connections.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pg_stat_activity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3 id=&quot;number-of-connections-by-state&quot;&gt;Number of connections by state&lt;/h3&gt;
&lt;p&gt;This query breaks down connections by state:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pg_stat_activity&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The possible states of interest are:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;`active`&lt;/dt&gt;&lt;dd&gt;Connections currently executing queries. A large
number tends to indicate DB slowness.&lt;/dd&gt;
&lt;dt&gt;`idle`&lt;/dt&gt;&lt;dd&gt;Idle connections, not in a transaction.&lt;/dd&gt;
&lt;dt&gt;`idle in transaction`&lt;/dt&gt;&lt;dd&gt;Connections with an open transaction,
not executing a query. Lots of these can indicate long-running
transactions.&lt;/dd&gt;
&lt;dt&gt;`idle in transaction (aborted)`&lt;/dt&gt;&lt;dd&gt;Connection is in a
transaction, but an error has occurred and the transaction hasn&apos;t been
rolled back.&lt;/dd&gt;
&lt;/dl&gt;

&lt;h3 id=&quot;connections-waiting-for-a-lock&quot;&gt;Connections waiting for a lock&lt;/h3&gt;
&lt;p&gt;The number of connections blocked waiting for a lock can be an indicator of a
slow transaction with an exclusive lock.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;distinct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pg_locks&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;granted&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3 id=&quot;maximum-transaction-age&quot;&gt;Maximum transaction age&lt;/h3&gt;
&lt;p&gt;Long-running transactions are bad because they prevent Postgres from
vacuuming old data. This causes database bloat and, in extreme
circumstances, shutdown due to
&lt;a href=&quot;http://www.postgresql.org/docs/9.4/static/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND&quot;&gt;transaction ID (xid)
wraparound&lt;/a&gt;.
Transactions should be kept as short as possible, ideally less than a minute.&lt;/p&gt;

&lt;p&gt;Alert if this number gets greater than an hour or so.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xact_start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pg_stat_activity&lt;/span&gt;
                               &lt;span class=&quot;k&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;idle in transaction&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;active&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3 id=&quot;checkpoint-interval&quot;&gt;Checkpoint interval&lt;/h3&gt;
&lt;p&gt;Checkpointing too frequently is a bad thing for performance. Postgres will warn you in
its logs about frequent checkpoints, or you can monitor the frequency in
the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pg_stat_bgwriter&lt;/code&gt; table (more info in &lt;a href=&quot;http://blog.2ndquadrant.com/measuring_postgresql_checkpoin/&quot;&gt;this
article&lt;/a&gt; by
2ndquadrant).&lt;/p&gt;

&lt;h3 id=&quot;query-execution-time&quot;&gt;Query execution time&lt;/h3&gt;
&lt;p&gt;Ideally measure this at your application level, not at the Postgres level. Alternatively,
log queries periodically by setting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;log_min_duration_statement = 0&lt;/code&gt;
and analyze them, or investigate the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pg_stat_statements&lt;/code&gt; module
(tools linked below).&lt;/p&gt;

&lt;p&gt;Beware that a global average query execution time means very little
– you should be breaking execution time down by query, and
distribution often matters more than the average. Measure percentiles,
especially when your web page loads depend on these queries.&lt;/p&gt;

&lt;h2 id=&quot;log-archiving&quot;&gt;Log Archiving&lt;/h2&gt;

&lt;p&gt;If you’re archiving logs, for example with
&lt;a href=&quot;https://github.com/wal-e/wal-e&quot;&gt;WAL-E&lt;/a&gt;, you should at least:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Check that your WAL files are being archived (there should be a new
one at least every &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;checkpoint_timeout&lt;/code&gt; seconds).&lt;/li&gt;
  &lt;li&gt;Check your last base backup ran and succeeded.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;streaming-replication&quot;&gt;Streaming Replication&lt;/h2&gt;
&lt;h3 id=&quot;standby-server-status&quot;&gt;Standby server status&lt;/h3&gt;
&lt;p&gt;Check this to tell you whether your standby is connected and
replicating (run this query on the primary):&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pg_stat_replication&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client_hostname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&amp;lt;hostname&amp;gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3 id=&quot;standby-server-lag-in-bytes&quot;&gt;Standby server lag in bytes&lt;/h3&gt;
&lt;p&gt;This tells you how many bytes behind the primary the standby is (again,
run on the primary):&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pg_xlog_location_diff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sent_location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;replay_location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;byte_lag&lt;/span&gt;
       &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pg_stat_replication&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client_hostname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&amp;lt;hostname&amp;gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;There are queries which tell you the standby lag in seconds, but these
tend to break on low-traffic databases when there are no writes being
replicated.&lt;/p&gt;

&lt;h2 id=&quot;more-performance-troubleshooting-tools&quot;&gt;More Performance Troubleshooting Tools&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;I have a &lt;a href=&quot;https://github.com/russss/postgres_dba_views&quot;&gt;collection of Postgres
  views&lt;/a&gt; which I’ve found
  useful when investigating performance issues.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.postgresql.org/docs/current/static/pgstatstatements.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pg_stat_statements&lt;/code&gt;&lt;/a&gt;
  is a module which collects detailed, normalised query statistics and exposes
  them as a database view for analysis.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://pg-query-analyser.readthedocs.org/&quot;&gt;pg-query-analyzer&lt;/a&gt; and
  &lt;a href=&quot;https://github.com/dalibo/pgbadger&quot;&gt;pgbadger&lt;/a&gt; are two query log
  analysis tools. They’re good for doing one-off analysis, but you
  don’t want to be logging all queries continuously on a busy server.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://pganalyze.com/&quot;&gt;pganalyze&lt;/a&gt; is a hosted performance monitoring
  service which makes use of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pg_stat_statements&lt;/code&gt;.
  Their stats collector process is &lt;a href=&quot;https://github.com/pganalyze/pganalyze-collector&quot;&gt;open
  source&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://pgbouncer.github.io/&quot;&gt;PgBouncer&lt;/a&gt; is a Postgres connection
  pool which can be helpful with some Postgres workloads. It provides
  some additional metrics which might be useful.&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
    
        <item>
            <title>/dev/fort 8: Scotland</title>
            <link>http://russ.garrett.co.uk/2014/01/08/dev-fort-8-scotland/</link>
            <pubDate>Wed, 08 Jan 2014 00:00:00 +0000</pubDate>
            
            <guid isPermaLink="true">http://russ.garrett.co.uk/2014/01/08/dev-fort-8-scotland</guid>
            
            <description>&lt;p&gt;In October I had the privilege to attend another lovely
&lt;a href=&quot;http://devfort.com&quot;&gt;/dev/fort&lt;/a&gt;. The concept of /dev/fort is to
bring a group of web types together in a beautiful, remote location,
spend a week building something, and (ideally) result in something
usable at the end.&lt;/p&gt;

&lt;p&gt;Generally a /dev/fort cohort is around ten people, but in this case
logistics meant there were eighteen of us heading to the
&lt;a href=&quot;https://en.wikipedia.org/wiki/Eigg&quot;&gt;Isle of Eigg&lt;/a&gt; in the Inner Hebrides.&lt;/p&gt;

&lt;p&gt;On the Saturday night, we started the long journey by piling onto the
sleeper train to Glasgow. I never sleep well on sleeper trains.&lt;/p&gt;

&lt;p&gt;&amp;lt;img src=/blog_images/2014/01/08/dev-fort-8-scotland//1.jpg class=”img-responsive”&amp;gt;&lt;/p&gt;

&lt;p&gt;At 6am the next morning, we arrived in Glasgow and blearily found our
next train: the five-hour West Highland Line service to Mallaig.&lt;/p&gt;

&lt;p&gt;The West Highland Line has been called one of the most scenic
rail journeys in the world, and it doesn’t disappoint. It weaves its
way out of Glasgow, around the lochs on the west coast of Scotland,
before climbing its way up to the desolate
and beautiful Rannoch Moor and stopping at Corrour: both the
highest and most remote station in Great Britain. After winding its way down,
it stops at Fort William in the shadow of Ben Nevis.&lt;/p&gt;

&lt;p&gt;&amp;lt;img src=/blog_images/2014/01/08/dev-fort-8-scotland//2.jpg class=”img-responsive”&amp;gt;&lt;/p&gt;

&lt;p&gt;Past Fort William, the line passes below &lt;a href=&quot;http://en.wikipedia.org/wiki/Neptune%27s_Staircase&quot;&gt;Neptune’s Staircase&lt;/a&gt;, the longest flight of canal locks in Britain (eight of them),
before twisting past Loch Eil and through a terrifyingly picturesque part of Scotland
before it arrives at its terminus, the remote fishing village of Mallaig.&lt;/p&gt;

&lt;p&gt;&amp;lt;img src=/blog_images/2014/01/08/dev-fort-8-scotland//3.jpg class=”img-responsive”&amp;gt;&lt;/p&gt;

&lt;p&gt;At Mallaig, close to 24 hours into our journey (at this point I began to realise it would
have been quicker and easier to fly to San Francisco), we stopped for a well-earned beer before
boarding the CalMac ferry which serves the Small Isles.&lt;/p&gt;

&lt;p&gt;&amp;lt;img src=/blog_images/2014/01/08/dev-fort-8-scotland//4.jpg class=”img-responsive”&amp;gt;&lt;/p&gt;

&lt;p&gt;Eigg is a unique place: after a protracted struggle in the 80s and 90s involving a succession of
increasingly eccentric landlords, the island is now entirely owned by the community of around 80
permanent residents.&lt;/p&gt;

&lt;p&gt;Eigg also has a &lt;a href=&quot;http://www.isleofeigg.net/eigg_electric.html&quot;&gt;community-owned power
company&lt;/a&gt; (primarily hydroelectric)
and a &lt;a href=&quot;http://www.tegola.org.uk/&quot;&gt;wireless ISP&lt;/a&gt;
(shared with the neighbouring islands) – BT has disavowed
Eigg as uneconomical to provide broadband to, but the WiFi
available on the island is faster than ADSL in some places in London.&lt;/p&gt;

&lt;p&gt;&amp;lt;img src=/blog_images/2014/01/08/dev-fort-8-scotland//5.jpg class=”img-responsive”&amp;gt;&lt;/p&gt;

&lt;p&gt;Eigg is a distinctive piece of geology, with a
massive volcanic ridge known as An Sgùrr. The climb to the top takes
several hours, and after an abortive attempt to
climb it in the rain and mist, we finally succeeded several days later.
The view was worth the wait.&lt;/p&gt;

&lt;p&gt;&amp;lt;img src=/blog_images/2014/01/08/dev-fort-8-scotland//6.jpg class=”img-responsive”&amp;gt;&lt;/p&gt;

&lt;p&gt;The highlight of the trip for me (besides, of course, the excellent
company and copious whisky) was when we were lucky enough to stumble
outside late one evening to be greeted by a stunning aurora.&lt;/p&gt;

&lt;p&gt;&amp;lt;img src=/blog_images/2014/01/08/dev-fort-8-scotland//7.jpg class=”img-responsive”&amp;gt;&lt;/p&gt;

&lt;p&gt;Somehow, we still managed to tear ourselves away from the amazing landscape
for long enough to build some things.&lt;/p&gt;

&lt;p&gt;My team made &lt;a href=&quot;http://www.earthlens.org&quot;&gt;Earth Lens&lt;/a&gt;, a site for exploring astronaut photography
of Earth. Other projects to come out of /dev/fort 8 included &lt;a href=&quot;http://www.readinggym.org/&quot;&gt;Reading
Gym&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We had to get up early for the long journey back to London, but we were
greeted with a spectacular sunrise over the Scottish mainland, followed
by a beautiful day.&lt;/p&gt;

&lt;p&gt;&amp;lt;img src=/blog_images/2014/01/08/dev-fort-8-scotland//8.jpg class=”img-responsive”&amp;gt;&lt;/p&gt;

&lt;p&gt;You’d be forgiven for thinking this isn’t the Hebrides in mid-October.&lt;/p&gt;

&lt;p&gt;&amp;lt;img src=/blog_images/2014/01/08/dev-fort-8-scotland//9.jpg class=”img-responsive”&amp;gt;&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;a href=&quot;http://tartarus.org/james/&quot;&gt;James&lt;/a&gt; and &lt;a href=&quot;http://marknormanfrancis.com/&quot;&gt;Norm&lt;/a&gt;
for the opportunity to come along, and
&lt;a href=&quot;https://twitter.com/eiggbox&quot;&gt;Lucy&lt;/a&gt; who made us very welcome on the
Eigg.&lt;/p&gt;

&lt;p&gt;You can see a lot more of my photos from Eigg &lt;a href=&quot;https://www.flickr.com/photos/russss/albums/72157636262451524&quot;&gt;on Flickr&lt;/a&gt;. (All my photos for this trip were taken using the exceptional Fuji
X100s)&lt;/p&gt;
</description>
        </item>
    
        <item>
            <title>Driving Monitoring Displays in Linux</title>
            <link>http://russ.garrett.co.uk/2013/04/15/driving-monitoring-displays-in-linux/</link>
            <pubDate>Mon, 15 Apr 2013 00:00:00 +0000</pubDate>
            
            <guid isPermaLink="true">http://russ.garrett.co.uk/2013/04/15/driving-monitoring-displays-in-linux</guid>
            
            <description>&lt;p&gt;After a rather long hiatus, here’s a bit of a technical brain dump
while I have all the details in my mind.&lt;/p&gt;

&lt;p&gt;I like graphs, and I like having them displayed on dedicated screens.
My preferred way of doing this is to use Chrome on Linux to display
the monitoring web page (generated by the likes of
&lt;a href=&quot;https://github.com/lozzd/Naglite2&quot;&gt;naglite2&lt;/a&gt;/&lt;a href=&quot;https://github.com/lozzd/nagdash&quot;&gt;nagdash&lt;/a&gt; or
&lt;a href=&quot;https://github.com/lozzd/cactiview&quot;&gt;cactiview&lt;/a&gt;/&lt;a href=&quot;https://github.com/russss/graphview&quot;&gt;graphview&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;Whenever I set one of these machines up, I always spend an inordinate
amount of time looking up obscure incantations on the internet. So
here’s the comprehensive guide to setting one of these machines up.
(Where these things are distribution-specific, they’re
Debian/Ubuntuisms.)&lt;/p&gt;

&lt;h3 id=&quot;starting-x-up&quot;&gt;Starting X up&lt;/h3&gt;

&lt;p&gt;You don’t want to fiddle with these machines using VNC/RDP, so
forget about window managers. Remove the desktop manager
(&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt-get remove [mdm|gdm|xdm|...]&lt;/code&gt;), and give your non-root
user the rights to start an X server in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/X11/Xwrapper.config&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now we can get X11 to run Chrome in the root window directly, by
editing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.Xinitrc&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/sh&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;google-chrome &lt;span class=&quot;nt&quot;&gt;--no-default-browser-check&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--kiosk&lt;/span&gt; http://server/monitoring&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;We’re using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--no-default-browser-check&lt;/code&gt; to suppress the initial welcome dialog,
and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--kiosk&lt;/code&gt; full-screens Chrome by default. Nonetheless, depending on your
Chrome version, you might still need to feed it a pre-existing profile
(in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.config/google-chrome&lt;/code&gt;) to stop it from popping things up which 
you need to click on.&lt;/p&gt;

&lt;p&gt;To start X11, I use a short looping wrapper script, passing the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-nocursor&lt;/code&gt; X option to stop the annoying cursor:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; 1 &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
        &lt;/span&gt;xinit /home/screens/.Xinitrc &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-nocursor&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;sleep &lt;/span&gt;10
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;I run this backgrounded from a crontab &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@reboot&lt;/code&gt; task. If you need to reload
Chrome for any reason, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pkill chrome&lt;/code&gt; will force an X restart (and without
a window manager that’s a pleasingly swift operation).&lt;/p&gt;

&lt;h3 id=&quot;dealing-with-screen-blanking&quot;&gt;Dealing With Screen Blanking&lt;/h3&gt;

&lt;p&gt;You’ll probably find that the screen blanks after 15 minutes, which is
pretty annoying. Disabling this completely when you have no window
manager is fiddly, but the best way is to alter your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xorg.conf&lt;/code&gt; like so:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; Section &quot;ServerFlags&quot;
     Option         &quot;blank time&quot; &quot;0&quot;
     Option         &quot;standby time&quot; &quot;0&quot;
     Option         &quot;suspend time&quot; &quot;0&quot;
     Option         &quot;off time&quot; &quot;0&quot;
 EndSection
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That inhibits screen power saving completely, but we like the environment so
we should probably switch it off when everyone’s gone home. You can do this
using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xset&lt;/code&gt; command, through cron or similar:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; DISPLAY=:0 xset dpms force [off|on]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;multiple-displays&quot;&gt;Multiple Displays&lt;/h3&gt;

&lt;p&gt;Perhaps you want to attach multiple displays to one machine. As you’d
expect, X makes this appropriately difficult. The default state for Xorg these
days is to create a single desktop spanning both displays, but when you want
to maximize a window on each screen, and without the assistance of a window
manager which supports some kind of scripting, this isn’t ideal.&lt;/p&gt;

&lt;p&gt;What we want is a separate X screen on each physical display, which is
(of course) called “Zaphod Mode”. In the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xorg.conf&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  Section &quot;Device&quot;
    Option     &quot;ZaphodHeads&quot; &quot;DVI-0&quot;
    Identifier  &quot;Card0&quot;
    Driver      &quot;radeon&quot;
    BusID       &quot;PCI:1:0:0&quot;
    Screen      0
  EndSection
  Section &quot;Device&quot;
    Option     &quot;ZaphodHeads&quot; &quot;VGA-0&quot;
    Identifier  &quot;Card1&quot;
    Driver      &quot;radeon&quot;
    BusID       &quot;PCI:1:0:0&quot;
    Screen      1
  EndSection
  Section &quot;Screen&quot;
    Identifier &quot;Screen0&quot;
    Device     &quot;Card0&quot;
  EndSection
  Section &quot;Screen&quot;
    Identifier &quot;Screen1&quot;
    Device     &quot;Card1&quot;
  EndSection
  Section &quot;ServerLayout&quot;
    Identifier &quot;default&quot;
    Screen     &quot;Screen0&quot; 0 0
    Screen     &quot;Screen1&quot; LeftOf &quot;Screen0&quot;
  EndSection
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once this ugly deed is done, instead of one X display called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:0&lt;/code&gt; you’ll have two,
called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:0.0&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:0.1&lt;/code&gt;. To take advantage of both, you’ll need to use two separate
Chrome profiles (or it’ll try and be clever, and open a new window on the same
display as the existing session). Copy &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.config/google-chrome&lt;/code&gt; to
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.config/google-chrome-2&lt;/code&gt; and alter your .Xinitrc as follows:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/sh&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;DISPLAY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;:0.0 &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;google-chrome &lt;span class=&quot;nt&quot;&gt;--no-default-browser-check&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--kiosk&lt;/span&gt; http://server/screen1 &amp;amp;
&lt;span class=&quot;nv&quot;&gt;DISPLAY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;:0.1 &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;google-chrome &lt;span class=&quot;nt&quot;&gt;--no-default-browser-check&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--kiosk&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--user-data-dir&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/home/screens/.config/google-chrome-2 http://server/screen2&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;This should be a chef cookbook. I’m planning on putting one together for our next
monitoring project (which involves the six Raspberry Pis currently on my
desk…).&lt;/p&gt;
</description>
        </item>
    
        <item>
            <title>Health and Safety</title>
            <link>http://russ.garrett.co.uk/2012/01/21/elf-and-safety/</link>
            <pubDate>Sat, 21 Jan 2012 00:00:00 +0000</pubDate>
            
            <guid isPermaLink="true">http://russ.garrett.co.uk/2012/01/21/elf-and-safety</guid>
            
            <description>&lt;p&gt;Every time I get depressed about things being shut down because of “Health and Safety” and the compensation culture, I like to take time to
read the judgment in
&lt;a href=&quot;http://www.judiciary.gov.uk/Resources/JCO/Documents/Judgments/grimes-v-hawkins-frimley-park-hospital.pdf&quot;&gt;Grimes vs Hawkins et al (2011)&lt;/a&gt; (pdf).&lt;/p&gt;

&lt;p&gt;It’s a court case filed by an extremely unfortunate 18-year-old (Grimes) who ended up at a friend’s house late at night,
misjudged a dive into the pool, shattered her spine, and ended up tetraplegic. Subsequently she sued the friend’s
dad (Hawkins) and, rightfully, lost.&lt;/p&gt;

&lt;p&gt;I’d encourage you to read it in full, because it’s probably one of the most reasonable, clearly-stated, sensible pieces
of justice ever administered.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The pool was not unsafe for diving. I have no doubt that some mature adults faced with a group of young adults in high  spirits, some of whom had had too much to drink, would send them all home rather than allow any of them into a swimming pool. But that is not to say that the duty owed to the claimant under the
&lt;a href=&quot;http://www.legislation.gov.uk/ukpga/Eliz2/5-6/31/contents&quot;&gt;Occupier’s Liability Act 1957&lt;/a&gt; required the defendant to put the pool out of bounds that night. The defendant was not required to adopt a paternalistic approach to his visitors, all of whom were adults, all of whom were making choices about their behaviour, exercising their free will.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
        </item>
    
        <item>
            <title>Green Threads and Pipes in Python</title>
            <link>http://russ.garrett.co.uk/2011/12/16/green-threads-and-pipes-in-python/</link>
            <pubDate>Fri, 16 Dec 2011 00:00:00 +0000</pubDate>
            
            <guid isPermaLink="true">http://russ.garrett.co.uk/2011/12/16/green-threads-and-pipes-in-python</guid>
            
            <description>&lt;p&gt;I’ve been hacking on &lt;a href=&quot;https://github.com/heroku/WAL-E&quot;&gt;WAL-E&lt;/a&gt;, a nice little Postgres backup system from Heroku which uses gevent for concurrency.
Much of my changes are related to UNIX pipelines, and I’ve run into a subtle issue which not only affects gevent
but also Eventlet (which is our coroutine library of choice at Smarkets).&lt;/p&gt;

&lt;p&gt;Here’s a trivial example — an Eventletized version of
&lt;a href=&quot;http://docs.python.org/library/subprocess.html#replacing-shell-pipeline&quot;&gt;an example&lt;/a&gt; in the Python manual:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;eventlet.green.subprocess&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Popen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PIPE&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;fp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;./input.file&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Should be reasonably large
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;./output.file&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Popen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stdin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PIPE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;p2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Popen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;cat&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stdin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;p2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;You’ll get the following error:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cat: -: Resource temporarily unavailable
sort: write failed: standard output: Broken pipe
sort: write error
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The problem is that you’re not expected to actually pipe data between separate processes.
Eventlet assumes that you’ll be using the &lt;code&gt;p1.stdout&lt;/code&gt; file descriptor from within your Python process, and it
helpfully &lt;a href=&quot;https://bitbucket.org/which_linden/eventlet/src/a60be8a9cdb5/eventlet/greenio.py#cl-128&quot;&gt;marks it as non-blocking&lt;/a&gt;
for you so methods like &lt;a href=&quot;http://docs.python.org/library/subprocess.html#subprocess.Popen.communicate&quot;&gt;communicate&lt;/a&gt; won’t block.
When you hand that file descriptor to &lt;code&gt;cat&lt;/code&gt;, the flags are preserved, and &lt;code&gt;cat&lt;/code&gt; isn’t happy when it tries to
read from what it thinks is a blocking socket and gets &lt;code&gt;-EAGAIN&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Gevent doesn’t have a patched version of the &lt;code&gt;subprocess&lt;/code&gt; library, but the pattern of patching stdin and stdout of Popen is
repeated in a lot of gevent-using code, including &lt;a href=&quot;https://github.com/heroku/WAL-E/blob/master/wal_e/piper.py#L22&quot;&gt;within WAL-E itself&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’m not sure if there’s an easy fix for this; the code can’t know whether you’ll be using the pipe yourself or
passing it onto another process. In any case I’d rather be explicit about changing the options.&lt;/p&gt;
</description>
        </item>
    
        <item>
            <title>Facebook's Scrobbler</title>
            <link>http://russ.garrett.co.uk/2011/09/22/new-facebook-features/</link>
            <pubDate>Thu, 22 Sep 2011 00:00:00 +0000</pubDate>
            
            <guid isPermaLink="true">http://russ.garrett.co.uk/2011/09/22/new-facebook-features</guid>
            
            <description>&lt;p&gt;We knew Facebook was going to announce a big music-related feature today, and the rumour was that
it was going to basically be scrobbling. So a small army of Last.fmers and ex-Last.fmers convened
our legendary keynote backchannel on IRC to watch it.&lt;/p&gt;

&lt;p&gt;It almost crept up on me. This was a developer event, so Zuckerberg (as inexpert as he is at giving
these talks) assembled their scrobbling feature in front of us. It’s a combination of their
“frictionless” way of enabling apps to post updates, and the new “verb” system which adds a bit of
semantic structure to them.&lt;/p&gt;

&lt;p&gt;At Last.fm we always said that we’d love to see other types of action scrobble, but finding actions
which fit the scrobbling concept was hard. The key part of scrobbling is the automation, it can’t be
a manual thing.&lt;/p&gt;

&lt;p&gt;Facebook have solved this - they’re now a generic platform for scrobbling anything. Add that to the
fact that there are an increasingly large number of things which &lt;em&gt;can&lt;/em&gt; automatically scrobble —
books from my Kindle, films through Netflix — and I think Facebook may have solved it.&lt;/p&gt;

&lt;p&gt;Of course Facebook can’t scrobble from desktop media players yet, but that feature will come. Last.fm
could provide it, but then it would increasinlgly be just a commodity.&lt;/p&gt;

&lt;p&gt;The music features Facebook has built are fairly lacklustre. But I don’t think that matters - they have
practically a billion-user head start on Last.fm, and the convenience will soon outweigh the experience
Last.fm has gained for talking to music-lovers.&lt;/p&gt;

&lt;p&gt;It’s going to be an interesting few months.&lt;/p&gt;

</description>
        </item>
    
        <item>
            <title>Visiting the Red Sands Sea Fort</title>
            <link>http://russ.garrett.co.uk/2011/08/21/red-sands-sea-fort/</link>
            <pubDate>Sun, 21 Aug 2011 00:00:00 +0000</pubDate>
            
            <guid isPermaLink="true">http://russ.garrett.co.uk/2011/08/21/red-sands-sea-fort</guid>
            
            <description>&lt;p&gt;Yesterday morning, close to a year’s worth of planning and aborted attempts finally came to fruition.
Twelve of us involved with London Hackspace took a train from Victoria to Whitstable, then boarded
a boat for the 45-minute journey to the Red Sands sea fort.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/russss/sets/72157627355971457&quot;&gt;
&amp;lt;img src=/blog_images/2011/08/21/red-sands-sea-fort//1.jpg class=”img-responsive”&amp;gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the weather not looking too promising, we managed to hop onto the fort before the wind picked up
and it started raining. Half an hour later, though, the August weather finally cut us a break.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/russss/sets/72157627355971457&quot;&gt;
&amp;lt;img src=/blog_images/2011/08/21/red-sands-sea-fort//2.jpg class=”img-responsive”&amp;gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Red Sands is one of two remaining &lt;a href=&quot;http://en.wikipedia.org/wiki/Maunsell_Forts&quot;&gt;Maunsell sea forts&lt;/a&gt; built
by the army in the Thames estuary, and during World War II it housed six anti-aircraft guns.
(The other is Shivering Sands, but that’s likely to be demolished at some point because it poses more of
a hazard to shipping.) After being abandoned in the 1950s they’ve been standing empty, give or take a
few pirate radio stations, slowly rusting and falling into the North Sea.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.project-redsand.com/&quot;&gt;Project Redsand&lt;/a&gt; is trying to change that by gradually restoring the
forts to their former glory, but they’ve got their work cut out. They’re under-funded and it’s slow progress.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/russss/sets/72157627355971457&quot;&gt;
&amp;lt;img src=/blog_images/2011/08/21/red-sands-sea-fort//3.jpg class=”img-responsive”&amp;gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inside, the forts are surreal and almost post-apocalyptic; crumbling into rust inside as well as out.
All you can hear is the sea and the clanging of the bell in the nearby buoy which marks the edge of the shipping channel.&lt;/p&gt;

&lt;p&gt;Only one of the seven towers which make up Red Sands is currently accessible by boat, although they’re working on
running a bridge over to the central control tower. Despite the rust, this fort is livable-in — people
stay here during the yearly temporary radio broadcasts.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/russss/sets/72157627355971457&quot;&gt;
&amp;lt;img src=/blog_images/2011/08/21/red-sands-sea-fort//4.jpg class=”img-responsive”&amp;gt;
&amp;lt;img src=/blog_images/2011/08/21/red-sands-sea-fort//5.jpg class=”img-responsive”&amp;gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More photos in my &lt;a href=&quot;http://www.flickr.com/photos/russss/sets/72157627355971457/&quot;&gt;Flickr stream&lt;/a&gt;.
Massive thanks to &lt;a href=&quot;http://www.tomscott.com/&quot;&gt;Tom Scott&lt;/a&gt; for organising and to
&lt;a href=&quot;http://www.project-redsand.com/&quot;&gt;Project Redsand&lt;/a&gt; for letting us on the fort.&lt;/p&gt;
</description>
        </item>
    
        <item>
            <title>Sentimentality</title>
            <link>http://russ.garrett.co.uk/2011/07/21/sentimentality/</link>
            <pubDate>Thu, 21 Jul 2011 00:00:00 +0000</pubDate>
            
            <guid isPermaLink="true">http://russ.garrett.co.uk/2011/07/21/sentimentality</guid>
            
            <description>&lt;p&gt;The last space shuttle has &lt;a href=&quot;http://www.bbc.co.uk/news/science-environment-14220423&quot;&gt;landed&lt;/a&gt;.
It’s sad, but not because America has lost its only way of putting humans into orbit; not
because there’s no replacement ready (there wasn’t one when Apollo ended either).&lt;/p&gt;

&lt;p&gt;It’s sad because each shuttle wasn’t just a disposable machine like all its predecessors; it was a &lt;em&gt;ship&lt;/em&gt;,
and like earthbound ships each orbiter had a life — and a personality — which was contributed to
by the thousands of people who flew them, worked with them, and followed their flights.&lt;/p&gt;

&lt;p&gt;So yes, I’m sad to see the shuttle go. It was a gigantic, expensive, dangerous, fantastically complex
white elephant — a product of a government design process gone
&lt;a href=&quot;http://www.fotuva.org/feynman/challenger-appendix.html&quot;&gt;pathologically wrong&lt;/a&gt;. But each shuttle had a life,
and that’s what differentiated them from just another capsule.&lt;/p&gt;

&lt;p&gt;Perhaps one day we’ll be ready to try building a reusable craft which works, which actually makes economic sense,
but until that day I think we’ll remember the shuttle more fondly than we did Apollo.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/nasahqphoto/5960203575/&quot;&gt;&lt;img title=&quot;Atlantis lands for the final time&quot; src=&quot;http://farm7.static.flickr.com/6126/5960203575_1bcf6f07aa.jpg&quot; alt=&quot;Atlantis lands for the final time&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

</description>
        </item>
    
</channel>
</rss>
