<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<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>github &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/github/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Fri, 06 Feb 2026 21:02:50 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>github &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[Reputation Scores for GitHub Accounts]]></title>
		<link>https://shkspr.mobi/blog/2026/02/reputation-scores-for-github-accounts/</link>
					<comments>https://shkspr.mobi/blog/2026/02/reputation-scores-for-github-accounts/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 07 Feb 2026 12:34:52 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[slop]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=67683</guid>

					<description><![CDATA[The folks at GitHub know that Open Source maintainers are drowning in a sea of low-effort contributions. Even before Microsoft forced the unwanted Copilot assistant on millions of repos, it was always a gamble whether a new contributor would be helpful or just some witless jerk. Now it feels a million times worse.  There are some discussions about what tools repository owners should have to help…]]></description>
										<content:encoded><![CDATA[<p>The folks at GitHub know that Open Source maintainers are drowning in a sea of low-effort contributions. Even before Microsoft forced the unwanted Copilot assistant on millions of repos, it was always a gamble whether a new contributor would be helpful or just some witless jerk. Now it feels a million times worse.</p>

<p>There are <a href="https://github.com/orgs/community/discussions/185387">some discussions about what tools repository owners should have to help them</a>. Disabling AI on repos is popular - but ignored by Microsoft. Being able to <em>delete</em> PRs is helpful - but still makes work for maintainers. Adding more AI to review new PRs and issues is undoubtedly popular with those who like seeing number-go-up - but of dubious use for everyone else.</p>

<p>I'd like to discuss something else - reputation scores.</p>

<p>During Hacktoberfest, developers are encouraged to contribute to repositories in order to win a t-shirt. Naturally, this leads to some <em>very</em> low-effort contributions. If a contribution is crap, maintainers can apply a "Spam" label to it.</p>

<blockquote><p><a href="https://hacktoberfest.com/participation/">Any user with two or more spammy PR/MRs will be disqualified.</a></p></blockquote>

<p>This works surprisingly well as a disincentive! Since that option was added, I had far fewer low-effort contributions. When I did apply the spam label, I got a few people asking how they could improve their contribution so the label could be removed.</p>

<p>However, there is no easy way to see how many times a user has been labelled as a spammer. Looking at a user account, it isn't immediately obvious how trustworthy a user is. I can't see how many PRs they've sent, how many have been merged or closed as useless, nor how many bug reports were helpful or closed as irrelevant.</p>

<p>There are <em>some</em> badges, but I don't think they go far enough.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/GitHub-Badges.webp" alt="A collection of little badges showing a GitHub user's achievements. " width="512" height="360" class="aligncenter size-full wp-image-67688">

<p>I think it <em>could</em> be useful if maintainers were able to set "contributor controls" on their repositories. An entirely optional way to tone down the amount of unhelpful contributions.</p>

<p>Here are some example restrictions (and some reasons why they may not help):</p>

<ul>
<li>Age of account. Only accounts older than X days, weeks, or years can contribute.

<ul>
<li>This disenfranchises new users who may have specifically signed up to report a bug or fix an issue.</li>
</ul></li>
<li>Restrict PRs to people who have been assigned to an issue.

<ul>
<li>May be a disincentive to those wishing to contribute simple fixes.</li>
</ul></li>
<li>Social labelling. Have other maintainers marked this user as a spammer?

<ul>
<li>Could be abused or used for bullying.</li>
</ul></li>
<li>Synthetic Reputation Score. Restrict contributions to people with a "score" above a certain level.

<ul>
<li>How easy will it be to boost your score? What if you get accidentally penalised?</li>
</ul></li>
<li>Escrow. Want to open a PR / Issue, put a quid in the jar. You'll forfeit it if you're out of line.

<ul>
<li>Not great for people with limited funds, or who face an unfavourable exchange rate.  Rich arseholes won't care.</li>
</ul></li>
</ul>

<p>Obviously, all of these are gameable to some extent. It also incentivises the theft or sale of "high reputation" accounts. Malicious admins could threaten to sanction a legitimate account.</p>

<p>But apps like Telegram show me when someone has changed their name or photo (a good sign of a scammer). AirBnB &amp; Uber <em>attempt</em> to provide a rating for users. My telephone warns me if an unknown caller has been marked as spam.</p>

<p>I don't know which controls, if any, GitHub will settle on. There is a risk that systems like this could prohibit certain people from contributing - but the alternative is maintainers drowning in a sea of slop.</p>

<p>I think all code-forges should adopt <em>optional</em> controls like this.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=67683&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2026/02/reputation-scores-for-github-accounts/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Get all the reactions to your GitHub content using GraphQL]]></title>
		<link>https://shkspr.mobi/blog/2026/02/get-all-the-reactions-to-your-github-content-using-graphql/</link>
					<comments>https://shkspr.mobi/blog/2026/02/get-all-the-reactions-to-your-github-content-using-graphql/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 05 Feb 2026 12:34:21 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[GraphQL]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=67577</guid>

					<description><![CDATA[I am both vain and prurient. A combination which makes me fun at parties and a delight to know.  Sometimes when I raise an issue on GitHub, or write a comment, other users leave me Emoji reactions. Perhaps a 👍 or 🎉 if they like my contribution, but occasionally a 👎 or 😕 if they&#039;re foolish enough to think I&#039;m wrong.  The problem is, GitHub doesn&#039;t tell me that someone has 🚀&#039;d my wisdom. If GitHub w…]]></description>
										<content:encoded><![CDATA[<p>I am both vain <em>and</em> prurient. A combination which makes me fun at parties and a delight to know.</p>

<p>Sometimes when I raise an issue on GitHub, or write a comment, other users leave me Emoji reactions. Perhaps a 👍 or 🎉 if they like my contribution, but occasionally a 👎 or 😕 if they're foolish enough to think I'm wrong.</p>

<p>The problem is, GitHub doesn't tell me that someone has 🚀'd my wisdom. If GitHub was as good as Facebook, it would present a little 🔔 to let me know exactly how many ❤️s I have received. Instead I have to manually check every issue I've raised to see if the hive-mind judges me worthy.</p>

<p>You might be thinking that there's an API for finding the reaction count to a specific piece of content - and you'd be right! The only problem is that <a href="https://docs.github.com/en/rest/reactions/reactions?apiVersion=2022-11-28">it requires you to send it a <em>specific</em> content ID</a>. So pretty bloody useless unless you want to construct a mega-query of everything you've ever written.</p>

<p>Enter the terrifying world of <a href="https://docs.github.com/en/graphql">GraphQL</a> - where men fear to tread and AIs are driven mad. It is possible to squeeze the API until the pips squeak. Here's a GraphQL query, run using the <code>gh</code> CLI, which grabs any issue with over zero reactions, displays how many reactions it received, and who gave what sort of reaction.</p>

<pre><code class="language-bash">gh api graphql -f query='
query {
  search(query: "author:@me reactions:&gt;0", type: ISSUE, first: 10) {
    nodes {
      ... on Issue {
        url
        reactions(last: 50) {
          totalCount
          nodes {
            content
            user {
              login
            }
          }
        }
      }
    }
  }
}'
</code></pre>

<p>As you might be able to decipher, that looks for the 10 most recent issues. If you are prolific, you may want to increase that number - although it will increase the time it takes for the query to run. If you have the temerity to dare to retrieve more than 100, you'll be slapped with the dreaded <code>EXCESSIVE_PAGINATION</code> error.</p>

<p>Similarly, it only gets the most recent 50 reactions. The count will be be the total number of reactions, no matter how low you set the number.</p>

<p>In return, you'll get a hideous mass of JavaScript which looks like it has been vomited up by a disgruntled Cacodemon:</p>

<pre><code class="language-json">{
  "data": {
    "search": {
      "nodes": [
       {
          "url": "https://github.com/validator/validator/issues/1814",
          "reactions": {
            "totalCount": 9,
            "nodes": [
              {
                "content": "THUMBS_UP",
                "user": {
                  "login": "markohoza"
                }
              },
              {
                "content": "EYES",
                "user": {
                  "login": "adamwolf"
                }
              },
</code></pre>

<p>There is no way to get anything older. If someone liked a comment you made in 2019, you will <em>never</em> know!</p>

<p>If you hate your eyes enough to read through <a href="https://docs.github.com/en/graphql/reference/enums#searchtype">the search type documentation</a>, you'll notice there is no way to search Pull Requests. This is, of course, a rotten lie. If you read <a href="https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests#search-only-issues-or-pull-requests">different documentation</a> you'll see that PRs are classed as a type of issue. Why? Because your sanity is not worth the cost of updating things.</p>

<p>Anyway, it makes our life slightly easier. We can search both Issues and PRs in one easy to chew lump of GraphQL:</p>

<pre><code class="language-bash">gh api graphql -f query='
query {
  search(query: "author:@me reactions:&gt;0", type: ISSUE, first: 100) {
    nodes {
      ... on Issue {
        url
        reactions(last: 100) {
          totalCount
          nodes {
            content
            user {
              login
            }
          }
        }
      }
      ... on PullRequest {
        url
        reactions(last: 100) {
          totalCount
          nodes {
            content
            user {
              login
            }
          }
        }
      }
    }
  }
}'
</code></pre>

<p>Again, beware gazing into the JSON lest the JSON gazes into <em>you!</em></p>

<pre><code class="language-json">{
  "data": {
    "search": {
      "nodes": [
        {
          "url": "https://github.com/WICG/webmonetization/pull/634",
          "reactions": {
            "totalCount": 2,
            "nodes": [
              {
                "content": "CONFUSED",
                "user": {
                  "login": "tomayac"
                }
              },
              {
                "content": "HEART",
                "user": {
                  "login": "tomayac"
                }
              }
            ]
          }
        },
</code></pre>

<p>OK, so it should be pretty damned simple to get the number of reactions to any comments, right? RIGHT?!?!</p>

<p>No. Because consistency is a dirty word and GraphQL was designed in the bowels of hell as a way to keep API developers from ever obtaining a state of grace.</p>

<p>There's no way I could find to use <code>reactions:&gt;0</code> with a comment search query. This will get you lots of useless unreacted results. I guess you can filter them with <code>jq</code> or just scratch your monitor with razor blades so you don't have to see their empty laughing maws.</p>

<pre><code class="language-bash">gh api graphql -f query='
query {
  viewer {
    issueComments(last: 10) {
      nodes {
        url
        reactions(last: 10) {
          totalCount
          nodes {
            content
            user {
              login
            }
          }
        }
      }
    }
  }
}'
</code></pre>

<p>And, again, JSON nested like wheels within wheels and fires within fires:</p>

<pre><code class="language-json">{
  "data": {
    "viewer": {
      "issueComments": {
        "nodes": [
          {
            "url": "https://github.com/home-assistant/supervisor/issues/6474#issuecomment-3740347148",
            "reactions": {
              "totalCount": 0,
              "nodes": []
            }
          },
          {
            "url": "https://github.com/edent/3D-UK-Money/issues/1#issuecomment-3757022146",
            "reactions": {
              "totalCount": 1,
              "nodes": [
                {
                  "content": "THUMBS_UP",
                  "user": {
                    "login": "MickeyF2010"
                  }
                }
              ]
            }
          },
</code></pre>

<h2 id="what-have-we-learned-today"><a href="https://shkspr.mobi/blog/2026/02/get-all-the-reactions-to-your-github-content-using-graphql/#what-have-we-learned-today">What Have We Learned Today?</a></h2>

<p>The Necronomicon was probably written in GraphQL. Any form of Daemon summoning <em>must</em> use nested queries and frightening syntax.</p>

<p>Trying to track reactions to your content <em>will</em> drive you mad. There's a reason this knowledge is forbidden.</p>

<h2 id="disclaimer"><a href="https://shkspr.mobi/blog/2026/02/get-all-the-reactions-to-your-github-content-using-graphql/#disclaimer">Disclaimer</a></h2>

<p>This post was not sponsored by GitHub. Although I did drink rather too many of their free beers at FOSDEM. Consider this post payback for that self-induced hangover.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=67577&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2026/02/get-all-the-reactions-to-your-github-content-using-graphql/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Responsible Disclosure: Joiners, Movers, and Leavers in NHS BSA]]></title>
		<link>https://shkspr.mobi/blog/2025/12/responsible-disclosure-joiners-movers-and-leavers-in-nhs-bsa/</link>
					<comments>https://shkspr.mobi/blog/2025/12/responsible-disclosure-joiners-movers-and-leavers-in-nhs-bsa/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 02 Dec 2025 12:34:08 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[nhs]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=64236</guid>

					<description><![CDATA[Many many years ago, I did some work for the NHS. As part of that, I was given access to certain GitHub organisations so that I could contribute to various projects. Once I left that job my access was revoked.  Mostly.  A few weeks ago, I received this email from GitHub.    On the surface, this is a sensible email. They want all their members to only have strong 2FA and I still had SMS configured …]]></description>
										<content:encoded><![CDATA[<p>Many many years ago, I did some work for the NHS. As part of that, I was given access to certain GitHub organisations so that I could contribute to various projects. Once <a href="https://shkspr.mobi/blog/2020/07/all-good-things/">I left that job</a> my access was revoked.</p>

<p>Mostly.</p>

<p>A few weeks ago, I received this email from GitHub.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/NHS-BSA-Github.webp" alt="Your organization, NHS Business Services Authority that you are a member of, now requires all users to only have secure two-factor authentication (2FA) methods. You currently have SMS/Text message configured as a 2FA method, which is not considered secure. To access NHS Business Services Authority resources, remove SMS/Text message as a 2FA method. " width="512" height="464" class="aligncenter size-full wp-image-64237">

<p>On the surface, this is a sensible email. They want all their members to only have strong 2FA and I still had SMS configured as a fallback method. Except, of course, I should <em>not</em> be a member. I should have been kicked out when I handed back my laptop and lanyard. There was still a bit of pandemic pandemonium about - but surely in the last few years someone should have audited the organisation's membership?</p>

<p>The <abbr title="Joiners, Movers, Leavers">JML</abbr> process is critical to cybersecurity. There's no point having fancy controls if you don't revoke the permissions of people who are no longer entitled to access.  On a fully integrated system this is (usually) easy - untick a box on Active Directory or whatever and  <em>*poof*</em> the user is banned.</p>

<p>But with <em>external</em> systems the problem is harder. You now need to keep track of external usernames, synchronise them with internal names, periodically check them for updates, integrate with an API, and - in some cases - take manual action.  It's clear that this particular bit of the NHS had slipped up. Looking through the private list of collaborators, there were <em>many</em> old accounts.</p>

<p>I was able to see all private collaborators:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/view_private_members.webp" alt="Screenshot showing a redacted list of members." width="1920" height="1080" class="aligncenter size-full wp-image-64239">

<p>I could see all private repositories:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/Private-Repos.webp" alt="Screenshot showing a redacted list of private repositories." width="1920" height="1080" class="aligncenter size-full wp-image-64240">

<p>I even had access to create new repositories - including special ones:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/Create-New-Repo.webp" alt="Screenshot showing the ability to create new special repositories." width="1920" height="1080" class="aligncenter size-full wp-image-64241">

<p>To be abundantly clear, there was no medical data on GitHub. There was no patient data available for me to view. Absolutely nothing medically sensitive was stored there. This isn't a GDPR or medical privacy issue.  If I had made any changes to the code stored on there, it would never have made it to production. There were no API keys or sensitive data or passwords for me to exfiltrate. The <a href="https://www.nhsbsa.nhs.uk/">NHS BSA</a> is a business unit - not a medical unit.</p>

<p>Nevertheless, it is important that <em>all</em> parts of a large organisation are able to quickly and competently remove users once they have left.</p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2025/12/responsible-disclosure-joiners-movers-and-leavers-in-nhs-bsa/#timeline">Timeline</a></h2>

<ul>
<li>2025-10-17

<ul>
<li>Received GitHub email.</li>
<li>Visited <a href="https://www.nhs.uk/.well-known/security.txt">https://www.nhs.uk/.well-known/security.txt</a> to get details of how to raise security issues.</li>
<li>Raised the issue on <a href="https://hackerone.com/edent?type=user">HackerOne</a></li>
</ul></li>
<li>2025-10-21

<ul>
<li>After triage, the issue was assigned directly to the BSA.</li>
</ul></li>
<li>2025-10-31

<ul>
<li>I was removed from the organisation.</li>
<li><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/removed.webp" alt="You’ve been removed from the &quot;NHS Business Services Authority&quot; organization. " width="1024" height="490" class="aligncenter size-full wp-image-64238"></li>
<li>Requested permission to publish this post. No objection received.</li>
</ul></li>
<li>2025-12-02

<ul>
<li>Published</li>
</ul></li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=64236&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/12/responsible-disclosure-joiners-movers-and-leavers-in-nhs-bsa/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Was my website mentioned in a GitHub issue?]]></title>
		<link>https://shkspr.mobi/blog/2025/10/was-my-website-mentioned-in-a-github-issue/</link>
					<comments>https://shkspr.mobi/blog/2025/10/was-my-website-mentioned-in-a-github-issue/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 17 Oct 2025 11:34:51 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[github]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=63352</guid>

					<description><![CDATA[This is a quick GitHub action to get alerted every time your website is mentioned in a GitHub issue.  Doing it manually  You can search GitHub for a URl, and sort the results with the newest first, like this:  https://github.com/search?q=%22shkspr.mobi%22&#38;type=issues&#38;s=created&#38;o=desc  Using the API  GitHub has a fairly straightforward API - although it uses slightly different parameters. …]]></description>
										<content:encoded><![CDATA[<p>This is a quick GitHub action to get alerted every time your website is mentioned in a GitHub issue.</p>

<h2 id="doing-it-manually"><a href="https://shkspr.mobi/blog/2025/10/was-my-website-mentioned-in-a-github-issue/#doing-it-manually">Doing it manually</a></h2>

<p>You can search GitHub for a URl, and sort the results with the newest first, like this:</p>

<p><a href="https://github.com/search?q=%22shkspr.mobi%22&amp;type=issues&amp;s=created&amp;o=desc">https://github.com/search?q=%22shkspr.mobi%22&amp;type=issues&amp;s=created&amp;o=desc</a></p>

<h2 id="using-the-api"><a href="https://shkspr.mobi/blog/2025/10/was-my-website-mentioned-in-a-github-issue/#using-the-api">Using the API</a></h2>

<p>GitHub has a <a href="https://api.github.com/">fairly straightforward API</a> - although it uses slightly different parameters.</p>

<p><a href="https://api.github.com/search/issues?q=shkspr.mobi&amp;sort=created&amp;order=desc">https://api.github.com/search/issues?q=shkspr.mobi&amp;sort=created&amp;order=desc</a></p>

<p>That will return a bunch of <code>items</code>. Here's the 29th. I've truncated it down to only what is necessary for our purposes:</p>

<pre><code class="language-json">{
    "html_url": "https://github.com/swicg/activitypub-webfinger/issues/29",
    "id": 3286159033,
    "number": 29,
    "title": "Tracking support for non-ascii characters",
    "user": {
        "login": "evanp",
    },
    "created_at": "2025-08-02T17:52:46Z",
    "updated_at": "2025-08-02T18:50:27Z",
    "body": "One of the benefits of using Webfinger is that it's […]"
}
</code></pre>

<h2 id="action"><a href="https://shkspr.mobi/blog/2025/10/was-my-website-mentioned-in-a-github-issue/#action">Action</a></h2>

<p>I'm not very good at creating actions. But this should:</p>

<ol>
<li>Search GitHub for mentions of your URl.</li>
<li>Store the results.</li>
<li>If there is a new entry - open a new issue describing it.</li>
</ol>

<p>You will need to set your repository to private in order to not spam other repos. You will also need to go to your repo settings and give the action write permissions. You'll also need a Personal Access Token with sufficient permissions to write to your repo. I bloody hate actions. YAML? Eugh!</p>

<pre><code class="language-yaml">name: API Issue Watcher

on:
  schedule:
    - cron: '*/59 * * * *'

permissions:
  issues: write
  contents: write

jobs:
  watch-and-create:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Restore latest seen ID
        id: cache-latest
        uses: actions/cache@v4
        with:
          path: .github/latest_seen.txt
          key: latest-seen-1
          restore-keys: |
            latest-seen-

      - name: Fetch latest item from API
        id: fetch
        run: |
          curl -s 'https://api.github.com/search/issues?q=EXAMPLE.COM&amp;s=created&amp;order=desc' &gt; result.json
          jq -r '.items[0].id' result.json &gt; latest_id.txt
          jq -r '.items[0].title' result.json &gt; latest_title.txt
          jq -r '.items[0].html_url' result.json &gt; latest_url.txt
          jq -r '.items[0].body // ""' result.json &gt; latest_body.txt

      - name: Compare with previous run
        id: check
        run: |
          NEW_ID=$(cat latest_id.txt)
          OLD_ID=$(cat .github/latest_seen.txt 2&gt;/dev/null || echo "")
          echo "NEW_ID=$NEW_ID" &gt;&gt; $GITHUB_OUTPUT
          echo "OLD_ID=$OLD_ID" &gt;&gt; $GITHUB_OUTPUT
          if [ "$NEW_ID" != "$OLD_ID" ]; then
            echo "NEW_ITEM=true" &gt;&gt; $GITHUB_OUTPUT
          else
            echo "NEW_ITEM=false" &gt;&gt; $GITHUB_OUTPUT
          fi

      - name: Open new issue if new item found
        if: steps.check.outputs.NEW_ITEM == 'true'
        uses: actions/github-script@v7
        with:
          github-token: ${{ secrets.MY_PAT }}
          script: |
            const fs = require('fs');
            const title = fs.readFileSync('latest_title.txt', 'utf8').trim();
            const url = fs.readFileSync('latest_url.txt', 'utf8').trim();
            const body = fs.readFileSync('latest_body.txt', 'utf8').trim();
            await github.rest.issues.create({
              owner: context.repo.owner,
              repo: context.repo.repo,
              title: `[API] ${title}`,
              body: `Found new item: [${title}](${url})\n\n${body}`
            });

      - name: Update latest seen ID
        if: steps.check.outputs.NEW_ITEM == 'true'
        run: |
          mkdir -p .github
          cp latest_id.txt .github/latest_seen.txt

      - name: Save cache
        uses: actions/cache@v4
        with:
          path: .github/latest_seen.txt
          key: latest-seen-1
          restore-keys: |
            latest-seen-
</code></pre>

<p>This is probably all kinds of wrong. If you know how to improve it, please let me know!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=63352&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/10/was-my-website-mentioned-in-a-github-issue/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[GitHub's Copilot lies about its own documentation. So why would I trust it with my code?]]></title>
		<link>https://shkspr.mobi/blog/2024/10/githubs-copilot-lies-about-its-own-documentation-so-why-would-i-trust-it-with-my-code/</link>
					<comments>https://shkspr.mobi/blog/2024/10/githubs-copilot-lies-about-its-own-documentation-so-why-would-i-trust-it-with-my-code/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 02 Oct 2024 11:34:22 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[LLM]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=53391</guid>

					<description><![CDATA[In the early part of the 20th Century, there was a fad for &#34;Radium&#34;. The magical, radioactive substance that glowed in the dark. The market had decided that Radium was The Next Big Thing and tried to shove it into every product. There were radioactive toys, radioactive medicines, radioactive chocolate bars, and a hundred other products.  The results weren&#039;t pretty.  In the early part of the 21st…]]></description>
										<content:encoded><![CDATA[<p>In the early part of the 20th Century, there was a fad for "Radium". The magical, radioactive substance that glowed in the dark. The market had decided that Radium was The Next Big Thing and tried to shove it into every product. There were <a href="https://www.theatlantic.com/health/archive/2012/10/we-used-to-put-radium-in-coffee/263408/">radioactive toys</a>, <a href="https://theconversation.com/when-energy-drinks-actually-contained-radioactive-energy-67976">radioactive medicines</a>, <a href="https://www.tastingtable.com/1087746/the-radioactive-element-that-was-historically-added-to-chocolate/">radioactive chocolate bars</a>, and a hundred other products.</p>

<p><a href="https://en.wikipedia.org/wiki/Radium_Girls">The results weren't pretty</a>.</p>

<p>In the early part of the 21st Century, there was a fad for "AI".  The magical, Artificial Intelligence which provided all the answers. The market had decided that AI was The Next Big Thing and tried to shove it into every product.  You can probably see where this is going, right?</p>

<p>I don't particularly <em>mind</em> companies experimenting with AI. It's good to explore a problem and see if it fits a user's needs. But the current crop are just <em>so</em> shit it makes me wonder whether anyone tested them.</p>

<p>GitHub has forced its new Copilot button on to every page.  The first thing I asked it was <a href="https://bsky.app/profile/raynegrimm.bsky.social/post/3kqyd5ovxd22y">whether it could be turned off</a>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/10/copilot-fs8.png" alt="Me asking Copilot how I switch it off. Copilot responds with a link." width="512" class="aligncenter size-full wp-image-53392">

<p>It pointed me to this page: <a href="https://docs.github.com/en/copilot/getting-started-with-github-copilot/disabling-github-copilot">https://docs.github.com/en/copilot/getting-started-with-github-copilot/disabling-github-copilot</a></p>

<p>Except - and I hate to be a pedant - that link 404s. There's nothing there. It doesn't exist. <a href="https://knowyourmeme.com/memes/jonathan-frakes-beyond-belief-supercuts">It is made up</a>.</p>

<p>This AI, which I am supposed to trust with my code, <strong>doesn't even understand itself</strong>.</p>

<p>This isn't an <a href="https://joshwhiton.substack.com/p/the-ai-mirror-test">AI Mirror Test</a>. This isn't me trying to find out if the large-language model is conscious, aware, or has a soul.  I'm not asking <a href="https://community.openai.com/t/incorrect-count-of-r-characters-in-the-word-strawberry/829618">complex reasoning</a>, or asking it to make an æsthetic judgement.</p>

<p>This is a <em>basic</em> functionality test.</p>

<p>Is the computer able to <em>accurately</em> provide information about itself?</p>

<p>That's it. That's all I want.  My first interaction with Copilot it lied to me about itself. Why would I trust it again?</p>

<p>You can <a href="https://github.com/orgs/community/discussions/139872#discussioncomment-10813673">leave feedback for GitHub about this problem</a>. I'm sure a human will answer you.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=53391&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/10/githubs-copilot-lies-about-its-own-documentation-so-why-would-i-trust-it-with-my-code/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Corporate Blogging is Hard; Open a GitHub Issue Instead]]></title>
		<link>https://shkspr.mobi/blog/2024/07/corporate-blogging-is-hard-open-a-github-issue-instead/</link>
					<comments>https://shkspr.mobi/blog/2024/07/corporate-blogging-is-hard-open-a-github-issue-instead/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 26 Jul 2024 11:34:02 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[marketing]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=29202</guid>

					<description><![CDATA[(Inspired by this conversation between Jukesie and Himal)  Lots of companies encourage their staff to blog. It&#039;s free PR! It makes them look like they&#039;re on the cutting edge of technology! It helps with recruitment!  It can also be a corporate nightmare. What if the developer says something stupid? What if it accidentally reveals something top secret? What if the CEO doesn&#039;t like it?  And so,…]]></description>
										<content:encoded><![CDATA[<p>(Inspired by <a href="https://bsky.app/profile/himal.bsky.social/post/3kxwv4wfgnr2r">this conversation between Jukesie and Himal</a>)</p>

<p>Lots of companies encourage their staff to blog. It's free PR! It makes them look like they're on the cutting edge of technology! It helps with recruitment!</p>

<p>It can also be a corporate nightmare. What if the developer says something stupid? What if it accidentally reveals something top secret? What if the CEO doesn't like it?</p>

<p>And so, gradually, any free-wheelin' developer blog gradually succumbs to the tender mercies of the comms team. It starts with help editing and clarifying the writing. Then it turns into massaging the tone-of-voice. Before too long you have to wait for a slot on the corporate comms grid. And then you need seven levels of sign-off just to post something anodyne like "5 reasons we switched to Rust".</p>

<p><em>*sigh*</em></p>

<p>So, maybe once or twice, I cheated.</p>

<p>Rather than writing a blog post called "An interesting issue configuring GLaDOS with YAML" I opened an issue on our public GitHub repo.</p>

<p>Oh, sure, it wasn't as "bloggy". And I still made sure not to discuss anything secret or sensitive. For some of the more contentious issues, I ran it by a few trusted colleagues first. But, for all intents and purposes, it was a blog post. Nerds got to reply in the comments, people shared it on HN, people quoted it on social media.</p>

<p>I've since left that sort of restrictive environment. I still see my old team occasionally publishing a useful blog post. But I keep my eyes on their GitHub issues to see the <em>real</em> story!</p>

<p>What's the moral here?</p>

<p>Should you bypass your employer's strict social media policy? No, absolutely not. 
Should you ensure that your GitHub issues are well-formatted, interesting to read, and useful to others? Yes.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=29202&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/07/corporate-blogging-is-hard-open-a-github-issue-instead/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[The Pull Request Hack is Fucking Magic]]></title>
		<link>https://shkspr.mobi/blog/2023/07/the-pull-request-hack-is-fucking-magic/</link>
					<comments>https://shkspr.mobi/blog/2023/07/the-pull-request-hack-is-fucking-magic/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 15 Jul 2023 11:34:52 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[SuperTinyIcons]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=46242</guid>

					<description><![CDATA[I don&#039;t have time to keep up with all the daft Open Source projects I release. I wish my skill and my energy was as wide as my ambition.  Several years ago, I came across Felix Geisendörfer&#039;s Pull Request Hack. The premise is simple - if people are making decent Pull Requests to your project then you should give them commit access.  It sounds mad, I know. But it has worked really well in my case. …]]></description>
										<content:encoded><![CDATA[<p>I don't have time to keep up with all the daft Open Source projects I release. I wish my skill and my energy was as wide as my ambition.</p>

<p>Several years ago, I came across <a href="https://felixge.de/2013/03/11/the-pull-request-hack/">Felix Geisendörfer's Pull Request Hack</a>. The premise is simple - if people are making decent Pull Requests to your project then you should give them commit access.</p>

<p>It sounds <em>mad</em>, I know. But it has worked really well in my case.  I launched <a href="https://shkspr.mobi/blog/2017/11/super-tiny-website-logos-in-svg/">Super Tiny Icons six years ago</a>. It was surprisingly popular and lots of people seemed to enjoy using them - and a few even contributed.</p>

<p>So I gave them Commit access. That means they are able to push directly to my codebase. They can also approve other people's Pull Requests.</p>

<p>Like I say, totally mad and irresponsible.</p>

<p>But people are, by and large, lovely.</p>

<p>Over the years, I've added about 20 random people as collaborators. Some have been more active than others. A few have refused to take on the responsibility. But several are still there - saving me dozens of hours, and helping even more people contribute.</p>

<p>What's the worst that could happen?</p>

<p>OK. Lots of things. The Pull Request Hack probably isn't suitable if you're running big projects. And it is almost certainly a stupid idea if you write code which is actively used by multiple downstream projects. And if your stuff has even the slightest chance of compromising security then you're better off sticking to trusted members.</p>

<p>But if you're just farting around with some scrappy code and you want a quick way to build an ad-hoc team? I don't want to go full "<a href="https://en.wikipedia.org/wiki/The_Cathedral_and_the_Bazaar">Cathedral and Bazaar</a>", but it is pretty fucking magic.</p>

<p>And it gives me a modicum of hope that some of my work might continue after I'm gone. Sorry, that's a bit morbid.</p>

<p>So a huge thank you to <a href="https://github.com/edent/SuperTinyIcons/">everyone who has contributed</a>.
<a href="https://github.com/edent/SuperTinyIcons/"><img src="https://shkspr.mobi/blog/wp-content/uploads/2023/07/Contributors.jpg" alt="A big list of contributors." width="1055" height="463" class="aligncenter size-full wp-image-46250"></a></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=46242&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/07/the-pull-request-hack-is-fucking-magic/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Check if your code is cited in academic works]]></title>
		<link>https://shkspr.mobi/blog/2022/01/check-if-your-code-is-cited-in-academic-works/</link>
					<comments>https://shkspr.mobi/blog/2022/01/check-if-your-code-is-cited-in-academic-works/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 18 Jan 2022 12:34:13 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[academia]]></category>
		<category><![CDATA[citation]]></category>
		<category><![CDATA[github]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=41624</guid>

					<description><![CDATA[I am a vain man. For a few years, I&#039;ve been tracking academic papers which cite my blog posts.  Recently, someone let me know that they&#039;d found one of GitHub repos in a paper they&#039;d read. It hadn&#039;t even occurred to me to search for those!    So, shove your GitHub URl into Google Scholar - https://scholar.google.com/scholar?q=github.com/edent - and you&#039;ll see if any repos have made it into…]]></description>
										<content:encoded><![CDATA[<p>I am a vain man. For a few years, I've been tracking <a href="https://shkspr.mobi/blog/citations/">academic papers which cite my blog posts</a>.</p>

<p>Recently, someone let me know that they'd found one of GitHub repos in a paper they'd read. It hadn't even occurred to me to search for those!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/01/citations.png" alt="List of citations, including one of mine." width="542" height="158" class="aligncenter size-full wp-image-41625">

<p>So, shove your GitHub URl into Google Scholar - <a href="https://scholar.google.com/scholar?q=github.com/edent"></a><a href="https://scholar.google.com/scholar?q=github.com/edent">https://scholar.google.com/scholar?q=github.com/edent</a> - and you'll see if any repos have made it into academia.</p>

<p>Have you spotted any of your code in interesting places? Let me know in the comments ☺</p>

<hr>

<blockquote class="social-embed" id="social-embed-1480492871954411521" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/ldodds" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkIDAABXRUJQVlA4IDYDAADQDQCdASowADAAPqk+mUmmIyIhNV1YAMAVCWYAxQvfRyBZVEfbX9e8B/IL7EjRXB7KZw0TBXCkllkxml+R/fPiu05iUN7/QMrUFbJg56iN6cl1rFr118znm+HNOUFfQZJAjKqG5iyJvDG85MhOU5PDvP1fNyIAQAD+6x5v0LOXLWPgKE7sdnizwcpjEg+2Dd5lSRVsxhc05nn0tc5cFc6l1LIOlCtfOv7NnTGAl3gLMGHnyHLApv+AjHoMDf6zSuvj7RnmBj4HBgytKqcwgfGIsi+YIiQ3/+dhoKQvPHXSGbv/V3m3F7zPsVRg9IMb8ilsJd+ylLyMifQnxGOIj4H2QBoiLcgOyBTSjEZ2f83kthSWZboxQiD1ComW/6MQp2s4RUaL4+HQ8iToP1sLKG2kEQPe/gUd8GOXPwC4NWufCZNkv8wk261duBP0g1VTa1yiFJ8eKZaNVhBA5WtkV7Mhez5RGQo8dAYMtmrLJI80J859ByPuhz9gA682hiv/s2dif+Zq2OPkxCYokuIHAxXzWaJK42x2il+TljKP+3YfCAAydhpWRdCg7t59LDQTD4pQGnt64O63GsPWOnVHXkc/ig8n4NHyPyW4xq6QO285EMviLCM2alJaiO7nYZRFoS3SwGQ5qBUOv9Scc90/xl+uFk+Dk0sltc0+RmF6lKE6Pj5PkEvk0gMgB8eDoecGrdcuug/qU+bvImm+z0l90JiQxr1JAYsu97OT7wb0VTdr4oQ8CF3vJGK4U4BTSWynoNQO2UyhgdnACJQnT5G505VLKIakcPiIrBYDO5qiExNNgexNNIn1Qdh5JpD/FzZlrfS2y4edHdnfQAJdWMH2eFVD4bYrZkBNvSdevJQDUyvMYMXVtQuCINAyKHB+xngRDO3tAz8iemlTOq4W2bmhcW4AyTcQhmlcFDGoPc3FiJHdGlxfZ7I1uom+SPTO385rqmil0BuCgvmcM1gTqMe6t2IPQviJRZeUsHVlp3pVL3Y3vB6suaLu0dbysP5oHTC4tDhPMgaLYwZPwIgPwxQt3lGWdr0Dk2k+y59PvJbTHqDpf2PcYEOhPW/ERjjLRJ+6qy2AHeSYAAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Leigh Dodds</p>@ldodds</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Discovered that someone built a tool for making SPARQL more usable by building on my sparql-doc tool:<br><br>Paper: <a href="http://ceur-ws.org/Vol-2721/paper594.pdf">ceur-ws.org/Vol-2721/paper…</a><blockquote class="social-embed" id="social-embed-1480206980178403337" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Well worth searching your GitHub URL with Google Scholar.<br>E.g. <a href="https://scholar.google.com/scholar?q=github.com/edent">scholar.google.com/scholar?q=gith…</a><br>Great way to find out if your code has made it into any academic publications. <a href="https://twitter.com/edent/status/1480206980178403337/photo/1">pic.x.com/fpysrjhws6</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/FIrANy7XsAQRiQl.png" class="social-embed-media-link"><img class="social-embed-media" alt="List of citations. One of them points to my GitHub page." src="data:image/webp;base64,UklGRjxQAABXRUJQVlA4IDBQAAAQ2ACdASoeAp4APrFGnEmnI6KhMtY8qOAWCWgAzyd2WeG1n7+X92b+oc8+uVap9y5Zdvv0Ff/n0//T96AOeL/7f7o+5j/LdJ//pf//+5/yIfz3/S////dfAR/JP7v///bE9Vz/O+l36AH/59QD/3dYv02/r/5L+//4z+if3P+zftn/d/Sn8W+U/vX9r/xH+2/v/sz/zfhs9A/ef9n6Dfxr7K/kv7Z/kf+f/hPZ3/P+BvwB/pv7n+U/yC/kv8v/yH9g/wv7N+ov9ae5M0z/Pf87/GewF6xfO/9x/gv8z+0/thep/5T+6/439afgf8n/rv+k/uf7vf3b7AP5F/P/9B/fP3u/wv/////1x/m/+p4n32v/NftR8Af8w/r//H/vn+W/aj6Uv5H/yf5H/b/uF7Qfzz/H/+T/Jf6/5Bv5f/X/+3/hP9H75n///5PwO/c////8n4Xv29//6trXL7+VF7xNXUjZohc0FKoTvkXu20G+zWmFJOvmLYeI+PlcOUcH+WaomxJRCknxkgez/3BGfCYOboaR8Wqw5MyZBvlvrYPBGbtJk7CQcHLDF+RtyBrSmASgvwRm7SYvPIqSCUiE/UzOSQWe/6D3tofSzUAip6Bucffe9k8OmN72rZwtxK1D2+ltjV/8DwP/00vB9Su3tjhnP7e+zxvhT6ApoO+OxZKOrdaGqLgcXf4bWxERJCCX7sxm1Smy2zdFnNPe4jyuTaQ9/DYjugFKTGT2duwLVC3IaI39EAw2F0W7lbWxQlbRoOkV788iNQryvXSWMZYoNR/EpriqqcmRglGaqdetCvRkWCNkPG8Jyud90PhkbCe7thD2cMiJjp/oTwR+nDYyAgt707WCSeniRtBO7+gMdAWTSL5z7hIgN/2TEHnwtQNnC1zL+Tu/71liRHJJOMmXg7atYhySuDJa17RLpdnNHWl9ko+ny3sm59HC5jH3jIbflIL4V8GjWqSQAU3PU+6pDt++eWndyfeESV2DZLCOQkx4lWxyRCHb8OBSrFRAHidsJKICMTWqOpVHaFwKA0iuhppIpYOBbP5haaaE55k7hF4GM25BOHUNTQdWgRQWqKtf2GFMekchQN4ux4wkBMS6IeFhObzHWBBfv1UBRE8QuwFWbB9RzSmVoIIs3eS2gqLax9yJXFzHmuJalzi68V3VEeppLCO2YKVltJ1sReZHgWeZy43dmjyTCOy9roNvGLIk5gqv1OHmx1o+IOZcKLIlzEi9esj03ApDpmX97UZRh4Xxiklwj7Kvxzx3joaA15ZWMt8WwGNt4d3wK81Su6gI85mDxX94ZG3G/A29yA0FoimfgQgn6LZ7qM2/UXrMO1VnN1Mad7Nqru+6mw7ZeFf+EAOWLdzGsC8QrJ937xAEgV890ulmo5D3gBu83xauXb/+jsq2orN/hUifs7ph+rZwN5kqIaabSCSGO14yAnkReTTY+OljwpR0Fj5pLIxVruR6V2FA0PkbLUHfesPuaLvZi1zbJftmtyyqjewhrCgJhSOiXCdNHOjzpsGxBk3Ac9nnpuVJ79rEQyGM0dTmxH2aIzaYGYOjqILPb+/+APa0Z8b/GpJkD2gaQvBCJRkqMHz/i8crgl+H0r+ojyYXo0uTLPef7Ww3gTJvhTRvzF78WTNsdiL0yobr/OWq8M0d1a2mlQZF55XjlagQg7FTdUWBKTEZoGFujEptHNTjQQZv8LIal4Dpphe685g/XZ/RVhP7Q88Vw9EdWIr936Pnv7Ty7t+Xkdgk8Ls/HmyVTuAOJ6zr7fI3MPK8DlKaNCZFn6u1L0Xw2IjJUYy6VvbiMwcl9HUBX5qSHs/JGOZ3sz3NfaUR/NmqwqjqQS53LzmyD/lEksYvJw/P7g19t1p5DcGuYtmaIHOcN1lz+LDi12LLgR11VdJIyDNN2fDShybH6W98uddoTjuQD2bCXP5J4rV+B389j8gfU/TeASwvlNLH8io6H0584KUKTxCT4SDYmezG69cAB/QvIfTQNfBb2rT7FpyXkWFY+xpn34fpQy0s0ScHotrp/ey6WX2mG93sv7anwaEf6cEQlCZfQkP0zacM26Ml7NmlO/anix26Zj/HvFdkYnj/0r6mMx7VuQ8AoEJ+0N91khsWcEk+FmT1XMVaEOSAyCBjRk3aB+7kKyIOA7B1EmFX9AYAkXPKvhYhzowU402Ma57KH+e4POKUjQr0HpV7euckusP6fME6jybn24Njpixlvc0HwX63+lT9hE3+SBTIPL/4Bz9i17Yn4ZcJEMDdu+RHXmeNvvasmv4X1qhR6UmrcWqqW+UAv5izI7lAy3HiMYRNok2kB8AA/p0iTbeBqjB3dpOxUPdVGj2O+BOZQPvuraJqikBuLwpZolL0h0vsjXB1ZDw/HFKWJJntX3Top24FGuC7qi7B4Fj9/Daj8Q0fdm9PHjUdBCYPgSCOL0RFnSECA0VghmdziRL37izSJj9hKC9rUHXfElkg4qKCoqnRtKlFBwafXGt8aJ3xeEHeHyllazTcQoAJytrVWY5tavQNzXM8GNSkMcopl355IDTowDcTfYyet1WmEAoz/HEs+yKY6HsH3gvUMS1Xq6lQw822/bNPVDKuLnjElmkYqLnGJO4MWpO+dIPazlecJAew/Kuk9xdDdMpo5Qw3hzPj5DtOeCZjoYivglUjtsvtgJIPNonattUFM+KugsubM3f88eFXlcN04uyPf8bVYEoLukoaXNh4MYsxtrXmACqpPquHe3/bRcC4sI7/YISRasXeqQGpJQw3g+eI7WebCVcQjWQXzEn/Lu0Hp8+KIXQoJ+TD2C8CS+FbiLfGjSdUeXYpJjEIxmrhYqVWObOFM2DZCQe/FxomVjiQ31iom+LeUTMUwd8Khn5V+eYvKLmRsQkPreBjp3P+/x7hF2L6jXtMOO/jjp3R/w99zXDpNujQQBHT3TbnSQ/E1/C2iWGB5pIkHh0lChsFQ/kDMiAylI8Ox10WEneh2+gB+ouoyrYKcDd+qVjUzI62WF1ykTgTYbcQ9Xf9KYhz5QTzX9/xuyI5ptOdZW0zxMTBGjchwZAmdBFEsxHDyLn7xvGsmBM9lJOkREb1Co1b9m+dRbolto43FrIeOEbhJ49oUBZidYqy1rsh4dW1eML1wRJAbp0wOKEkGIKVy3xpc2HgxizDB7xYKnPl6W+tFPqg8MiEHqqDVj/3+sASANzu0E6ifEMXbvN8L8/N3kpT0j2P3c+6dqbWozEpLP1izdWdahFioPdE4fVOsjigen/uOWBWQpiTvflBq9LWzSVkNEantgWQqR0Rk/59tdGWGjHj2s1ZxMNoxnNxcaVRdkHB3W9y1Pji+7ASu9EHKD/iln+AsZ1sibptUG/T6MZ+QM6D7BvDIS+qf06yjAEpWp/lnSf1b8v08OvjiXpdd1JoVJ/yCZ1hCvq55yzFaaVdWwckJigTNkmJ6wt9PDuUEsnueP+FuJVV0s8cZnnepZ0BesrUgOPqONoQ88iQN2BoE9EBaPSXtUF2p6ZmZdMUY9abi08p3kptNScUWw1QXh/Dl7tMtcf/0ACKWGetPNbu6Uw+c8V/khEb1atrurV+H2+AfavqntdQXxIGkLtB/op9Du6ZGKhmBpHIy/332s9CLbxXIBL+LmwBk2uFnzA4aA3wC9mB4c3loC4d7zFBIs8wYKxSSrf0SuGIXR9/NbRUGzQvcv4M3GSrlIRG5COkNQqTqz8XDwkCcwX28jQrDsUfbjnapYsOSIrxK5smTNtx7CHT/rmW0gvAU21kT+HE1HaHgXzJg6+GupR2rvTaGXvHjV0nfqy0hF7+x3FVKLfnxdrSm/py1Fd+5nLGvEGOpEaRBNZ+08MxZbg7FnotPLUof7IpmMtNIYqgNM9MPzV+J+2fENpHvQDLRmN7O5I133zTbDFFzDPEuL9xq7G2GtcWpxWubBIigchLKmQgx95g6v0CccjuKvYN/NUGbJeKQ7A44Zqdjxkk3kx7VvDZnKZ2bJ4tploxBBofHwWwgTRLtwTqu7gjdTW/Pz0bs+u/83zvksqb6SoouLS2FJe5D+5WwHzx1HWQ6WK1LAzaj1HN2QqoCmfIpmPocpWisjxseMJhtOAyBZGV6UmVVm6LvVO6dtU+rqWI3O85e1yjO260f+yLG5vxKiJZvP4QS6uN29RyvKP/gQsihGrS7Cos9Sz14BdEzinLnHOzi3EZLNXsAlWN3SUWCVemVed6WwsMZmVV+Ny+1/HatDlAqeusx/ANzZrLKrUR96bwzqXhZfoxPD2MoEAEnb85/dRgGVn/CV3a3asLf8NchlFLTUk5EzWcUc9ZWe6E8LezLSY6E1puQdQ47K+wOM3G/EzHNnecpjw3Bbv+zKY9s6JPL+jZ010M8Pigsk1rSJ6oYDsVWIdcBo1YnYvL5L1xMXwhG3z40F/NM8Gylq7pFi+7KDsMawtG4m3W7vPP5/PJi7vVNu8rH/xu00/NJwkGDz393KmGUd1sUUI/sHrCy6CSJwccqT1FOtS5hU8NDtZCZ2tRxzpH7B5yfDUImiPS+EbyrjwUkBi7M9EPJL32pqwqIZrseq6B77Z3s2GGCFrb9P33VIcpKCukDd0M4N5l7lF8cZpd6bUeSc9taZoTMcqtDMS9rP0wJyS+RS/Q0OOiOycDXSUvGV0KQ5e9lzquai5FWl4Lis1q25vjWFZTrEbhztvAojuKrbuvLaZjTWerHkt7ECLIQRvOdd44PDZAlwODuhZZc/Snjy35gm3vmB8L12E6swkiT/REAvOscOuanA1Zi3bz/16u7WKU+oO5+KrXDJuVUGOCGh2TKs+BCSyx+VOWdHbm4pzNgJISeqkDK7NrT3zdL56bx0g7Dhfqyl+cfUs1lds36x7KGGZ2njNA3+ql1M9kfvTB1DB0woRz7Vy2hvELg+e9sv5Pgvzn4I+Jk6Fw/jy0T3sufAcm9tkv4YGjgaQyqVQInYMqy9ZXCLQyML2Wig2rXr+9A1R6D2nzsFKbqpHmQvnBGWPGc68yMUXuveBVoToaZ4yRZD6urnRYMlWgL6DeVvaYa5X4gXppZMAP56CE6dX8Ke8Lm0NE2jK9Bqy2fSr+DD0JY1WxQFltpy7c5elwjEzzqMYusNlBQA5ulODGImLXXLgb7hgAbx/q0O9vHXw/IioLWsO3PrlytP5zw8BVg6OPuy/C/Xx+2mWH9aesQqB07RMXN+hUYF4HIAjVx5Y4Ef2NuNje2XQuxf6IZwzTb4GWKTHGEUSKE1L+UYMHFEAR252vtKDLJC16X9RBYQgQexn1Tt06Q0a89Nv8uXCR7mJXjl4VXeg/jLAjaf+DErMYkAs/LJR2y4s8/pghOglihcp77EciuuZMuIjDhrkM9/KIs7BZAVRDW01mqVIckeQdzTjY+nG/NHNZFxuuEFiAiX75UakvhnLFwrBfKan0FTiZLr0zF64eYkkL2Q2DowyThTPkDY4baWLWUG4fuRcQGS8BfHj6jsFAU8bntO8BSKGeUPzmiKO7/ELOtMx76gGDrOB5bnzei8Jkg3okXaogjosEGHcgSbejQ6yNhfeFzHkLAZSTdz4H5FIyP6N2HGefVgOkJgkFpO/PRmuQqHsdEFFUwJAQFGSrvnI1ufoCvH1MYvHvqH0OgOY/wJdEVpWUmX27G7nJbbVzLPI7Zw9FBIiRd29W+mr7Hi9z0M8mjocEjcWUa4OSIqOCUOOb8UvMJW271/g7v+qUfPCR4Pa+MZri3FJi6ZqGVVfe7tHINNnyypHJgc2+WCVLHCY0OgcwiZMcBBMp5iJLE9TYdq5SRqJiUFRooUZ4Q6XYf/50RDT9kbKKoIF5qVSFOsufTQL44vA138S7V8oU6ABD+Yeh7YLLBBfsxEFePBVXYGp/l7xcPpc29LUf/XS3PoD+1GsuLvpWt0h3gdGiWkEvnd9FMPyHDSrbu3uIblFwfFC8Gof4YZzltkWu7aylrN+XVw7tCOOdEyLFR/7wXXIbMDL9Q/oubjRm+6ZibBcGxAtzDT+L/qmRVt1rXrcJ+VRF4SUyWw4SccL4ocO7hJ4YSDP5DoKkUhc3hJsWfuoeubXQ9rFMMsceRJcfEYykoQNLYEy9lH2RLwKeItkz1krQb1EVk+lrJy7g/FcgARxxt/FqCrpKZFEWro3OYeiTRMAF9ByLopLR+APfM276fgh2MXigd2sctKwCL+aQ+r3Tz9OrlRhTQ19g+TuSoXa+UL0fv08nW9jMEOXW2q+sGtlSAP+47XBlMwwr6s1FnuWVQ5VBi/sCmbm1mOOqwror2pd38tpUkh7WeB3w/s29eu59c592bDnN+GLw3GUOYWga3L+Fw0mN2fdWPvQGUWwW8vHfytIb2aBLzUzUr0p/zB5F1+2370iDrjYV3IzfPsqWN11PUskFzRhaB1f+X3iMF1x8uXcxV7l3QgjCHxjgdt4sWcfDkibQJdKiFem1QFUr1NjWTrR3NAwB3ivzkYkK+paNsl/jUIqESdsa77idpTrgyAxc05ssmC9OSJJ3w4cPeFxbAuR0+3KjOyXV8c6WsjJ0uAhll5F4WA3ooZ2rERr8EK/j2Tmw0iBDCrkFW1sJXxEP/DWm79hrSXavVpx8SV/bSgOFXvuhPC4SYeLoLfoyGq5NIRxAfupO91ZdZdqACED72gPE8DdS4iWG3N+ycCR9u1PNIOE+zFfXrB2r9ASUBmx0ihX4LbqXg+lKgKYpq63w9j4lfoGVOnYzNNOyP5RG2DMWTszsglbF9F65lcLqZYoq0OuumsWZQWlx9oF2F5biwfKkRH0kC48+VpoLW+ZpsZGNj9YFbq81bC7i6RkEnxrRblXNPYqfuY62AqUEVFAoyJeUqCuym3bQtbOfwCneYGp/ckI//y4XvwZSYuBcjlWD11RLrzBBqvZtdD2g+0s9rR5+tL1sylTHeOTr6r7CdaIbiPNSkVn/aLKnqOqgmcvAou6ytEq4aP10ERDe8GPSv/DxX+SP77xBsV8pdqXW+30WativWQI14ehg6Wv5Mt4kBYlTZAtNO3Nh4Tw13+hcBzn8IxQxlvSMKSvhhcyXxIZ0ekru4wxA33zlYwYtIcOK1lvtEwYP7CS6F82L5mdZGx7wtuvLUkNcuk519wNtvJj7rN7/vJd7QPgqO7x9mlc3/PlZZ6mJbmsTFnqXlaKEJCv//GF0vm1Yz/M09r48dYxoE9KFqbNKHYPhYNn8nJVvGXcuyQZn6XKhrH+eZz7AqcAh0H+cynsp2GxKYnE3w4IPCrBUNjfn6QjXyKU7xBomzz6MlPpZPdCZfdOGtUkkzWqvaIf/hRuR5RKiLtbIunegisVKSofubaL2ayia0OVBW3EypafcUO28QWZuA9AMWcANInF7jc+0Rxu/sR4PNoRkQ+TQKdWTsoZzH7Dzq/xqy/V+xVVV2d8srJRA6vxfzVKh2ndUpjaAqI5Gt2WuelIUcTgxvfr/vz7AAD2Na2adbWPKjomcFjUEwB8OkBE6HEImWTWYS+A1PFedHpacqEng+0KrhfeP+7iYBC9ejNltazGPVSYoXWt14ITtC519DWssXFeAaqMukceZWCJk0y+0V/HvyyDK35WUjy6NVC0uXXZXtPBk2BLxUqHV+Dy1hDuhc4poKwo/6Bg6ToQ5ntCIsAaJw0zEIyqglQu8g3+DAWwBbg8GYQ0ytnrVot7CHmLtxeWjB2vlJ3sLj25Mh1eKFkxgROgDdIr2dHGs8uaHGllVIPViB99T5cbCdDrco33C3hyJq7QgFJR/twOS6DJZXpBww5cSpkhjTXZQn8M2mI1njfn+UlSZIUt0X+yA+PAMvDGb7VDgo7UdQPHNM/2QKdfTbRumDcuIFbta/0HuT/lf9m13E0qHCcNC+b4fzWUOar5fMkomfW9zSsd65E2bdLOplhuB3I5KYJh3iLqZb3Up/xcsm6/qHC87W7640fKYj8FgnPEfgLRnFVaChlo5vaWN1N4J3Z9XITXxn5jyYCBHQMKhLcoiHCTtMrgHDc3fIW5lVruVkiwt69xjJmcRC+R3UU0yhuDIYm35zfnbrjwj5g7q9hwxmNNWkU+RXWI2Iyu+IIPG6qA0EXU3ugcpoAAKpx9iaBYrR3WXtDB4BzsvNUZF22Db1ZE+slNkTDsgt03mCAc/Hhl4lW9B9AzPAi0ljF1q41IShgbAyG4v5uy5k4vkfv0F41hN0mnvsvaQy8Q8cerWIc/uZzm+PwvFAa7NyrfkFi5etFwbM/EllX1ko9Bk2AZSUVJ8h5cEnQaWYh4l6U3Jt2de+lVfG9uG4+mLqbetZYsYbVJsOeRctME42DmSxjCK8WXDnQeM4U/AOZV7X7tP2d/kw23T4kTnxEYVczZ2slosXGvM0zrM/7yJpdyQ9KRw4bW9KaKSkYJ5h6UgiMjJ0hMnW0Odh91zDLxZ1NVRZrqjdvr9XQEKnVN9rovLpY1FU8HjKW7v0ev9NqRHnSr7lA1qMMPwhvSkWp0CPABgkACAz4pyz47rBl32P0Jr+ZimoYKV+frvNm6c9Ux0EBEyDoQy7k43YLiWRjgpNYPPJjeKrCEy/8MGyDMtd/lkB59RLYZROtNSa9x9EenBKj9z1FN40+2KbEz2nYEAe3I0kV9p7uY58TRLRlsiUUu9oRoO6qBtTiq3sVvMN1eVIv1MMy1RsH4v1WNrUEHFJYGkazgGMpI6xQmuZfgR4nrvMnJ2FzETTITiLiETDW4KqF4bwMcHDOF6SxOaVOAJd4Ud17+sKcK5JgvVTdynbxc+QzH7ASFxLhIheDPhp6AyufRyYttT/RPjKtkg2N9mx5IRL136QDRhq70KmWk6OCMzGCcMXU6pH2k/AEREvq9BYsKWC49dWLVxy1XTIrXAm6w0XKgYsh1iqFATz8fzzM7jejIHQWRkMO95Yxjxd2H6zQLfu8urgDF/lNKFrns2+BtngSuF7rLtfmbWYO4qZlNJZ9MaTFAbZ3loR7AMpmaWjeNBu3oF2LBxxB1VldwOi0l6vBa+rofamN3hpYNMjOXTcH72Hack/w49jdW8NlUAIS3EIvl1ztpFlMoFqMcFfERilRNqsvQKp9qGzetmJfNVaYj5bxcbpsx7QdGRigafZlk0zC79tdmvKtxN2wc2jMFnCjmN0Q3rdWDAY4YkIoDICx43AfGmstQ2DAHFWBpay2nsEaejtwJBeLFKoNpmAqpvpWgXXAvbK0Uef1fUm1WqUl6sXJoOrfrVU680aGTjNNZriRCynAvVQVpP+Atz0yOtz2WpdIL3If0rsiI7FTW7HG7wMN02Q4kDlPHc/uHropm6YfP9e/Khdg2HpoAxkmia1wWFu7NdKlfP37HRlMX9nTqYFjrME2BxGinzn64C+gyp9MpHcK4ipmWXZCmB3snB5HXFFeMAgz7mdblEuWQxIxycDlQIHHF1a1ohKMfSXRrRDrQU27Qrn6TYJWnr8bwEpSlx6RhIQZ5xpXW1Zoj5ADaLL+p2A04YczQ2itN0hJuzzOsE5i2pe7gsEYlnQup/Jw7dCJ/CJ5n4q4NgPD9Hu8u0a/HLnuTG2eBpbPeY3yOsbSh0GjRO9ooIZEP1ldQRfDM/jRpCW6UtvC8NpwUs/8iafP+GdpvcsX5xTf1i3iqhSx74NKmTHwSaTSEvsH2bONOyr+G0UGBuyVx9Ilp6wF87Q44mC1zAFsY2ufOfQwMnrwD/GXFXgxtZ1z+Z4/67YnlQDbtVbVWSjf59be7B2wAN65nwgVF6lYUBwTxOqcMSBlBGyFf0pj3KZ/qiWMuq1PAqZtnp0jqgmlvmb15OMCPLEP3/b/whKVWSuLlMNyeBKaST8vkEglcy/5KXLINX7BpEWsApJuRN1DTG4hHrRlXrd6fma8wUI34WtyKq92IBoTFUb/46gceZBxabkRBgsK9SeUFq5UiPjlBKpb5RHX2eeQOrPFzXUr3DsZc31pFTznPL4dD/tn8kph0mS0Mv0j8RaAamz03CZ91j6oCp6NXnNmlE+tVqawzCkQIXPKfJEARXQAIra9aW0aSSvI8pWRjkjY9YW8RNKpzQekyDcD/p61MlO658RNNs+ET5JEIS9oRfxed9tzadK/gbhXRMpyyKbUvjND+IB6y/Kh/qahfnAuIwFGr0vNSwkHnwlTvlWed8aQuulU7yo1Xn1Fv9R2F8+D7x47QpHMfhXSdjak0so17U82h9aZGPE1dZ96/3iBNGl2FgYG2UouXF6WJAYSMSvHAGxuBE9V4Nz+wbP7dfyrPPyIW2cG9Sj09vsscO0Yqqpl3VAdZ97xbq7xPYylyocLdUKggquWRXZOQSoTNxT0OQY7ZiGGmA04xHcu79lmScsKJRvk1JhHYOxm63guE6+sBC/0+WEFYOaUV2tG2nqEskoCJ+KEse8vDSb8Uln4UyWw5WYLqLeYGR5iDxn2h+vFFWFq3cnttJgvDTEqUZuAgalVdary9D5ui62mwyo6h/55B6ttEOMX1SqUe/iE7LhlmXv04L0V1OMoiJsuH9jNtJ111rGrkfUtYElMBZF4rZM8l+wh5g+o3FZl/WU45FzAZ9zBEzSUfy6zSazWLa2yfWqRKql1U2o/fWzm5c0J2SWcjXmIzHANR1i+/xAOe5bHyUd5WFLQBeQNV4fOFUOzdnLRHuYcU31OWWylLRHpVmpNbyqF0/yzHeMUwIUxcvT8G5+7/PoyYEvI4sKwBjwDt3/sL9N0M2qhNGYNp23fsnIoqIsLFEnt77Hoo7QgQmLuIGX16tXC+bySd8sMrf8MV7zSRggq4Oj19Z1CBVeww1g9DcNwoeYiaRUnsbICxbkDMS6i6k3rSOJXy6nYD9kphaUmcBiTryO0hm2wu3Y+Uz1z1aM+De74VUnzUj9UD8JYYG0c92gCLLI+oeFAvngIUcXbA445PBMPSgknrqaD3SCSip6UeKyijhatQeGDJ12Ias0BPcYH90v+Mx8V7tT9HgPT+CsXSQAzIqAh6oHWVu+/N9SmQwpYqJsv1pUWD/TWeHfc94JisW8m6tZVB7bbCPYv1cgVDOU+1G87PpkSGORvgVkGzzL/HwLQtpskmvTqSVqCCPLZ+021Xkux1E82rMx03mXaixp97rCLsugdXLseN6e+IRxKQ3VcV2uFkAV89X9A2yZoUBD4Cn8nCmd/dHm/F/9TJNo9P7vxBqmprjp/oD5p7/EErSIfzzXuX+e3gVcLrI0trWTPbotXiLgwkZc4umETvPZ0L13bt6QJEuSpQNEZtzhF2t8jwi0416u9+2AAAAADVcA6wAAAAW19Kq2tXUjwDunmw54c07eLPFAKqtXUaCWVUIBnt1DDHOhAejz6f6dHfRRjfSJ8Sra8uiiHald/Vzg477bnAbncYfrWx4qOrUkdQSfRLv9/X91niglr5ljAiulJgYudC2d+up3DHBHo9n6ZU7u4QdTMeOIBhQFDh6Oa4Eb/mAmdwxo3+oSGg2G5jNGHZFFG2sqnW3tH5RgiLCr8xU06bmU4rX59DP9Vd9BAUERzjc9Jhfo+iHRkxMlwh9/X+yDhNwQOAOGD5KCbdKj0I4UggE747YkHl+eXXKpsRFNQ6dArQOKX8jvECyU9089JQrzgGerFg0YJgUgCTc/YBR0QyduIx1rJixdkiN9nE7gvCmFzweOIP051iuV6NooMA453JLL7tEoNb6kqJUmSl0+24eceIR3PQhEFxCeD4a20+SPmSzaItLyfbpecmDlfd8e4I08is6JmK4AoTnGJHCzwr1SDNjvgKnD7+nxoKwqWmUndivcX9QWlDPDd56bnhdpnmRFvo0yvz72+ZAp0VMuNfwkx7KzSyD+32X0vjZKxdschU6QCnaBDatDocRN2GeBwgrrEEl7uMAF9ca0ZsAhcDtMKXbF7PBE016xWIp2Ej5kdo5wG/h7kt8NGZ1KMrbHAs7SwVbJh3ipCSRxscN8UMo00YBFOUvhU6r+3qI13jov0RceyLiJXO9sp8DGiWotj+LbO5K3ZkgpHaw4y8dorNeR0UqoznJhszWfm0IDIqlLKGWoX0kCLeZ71FsFefFfyPTlLOnePLPA5aEszy4jJBBQyUDkDwsp8uKsGtkgkLmvo/VPdMDyDBYNXot6hlS6OSkTW5EvVXwo0dDZ44+nCi4WcEEQG054FUVURhbUopuLt/3GCuJmGWOsCKTAMLFN984WhVmqURwIOHIHgZ3+aNXL6YxVDZAglggNf8GJbrTDdF2aJnDxytsU1jPbkoHS5rAq502q6sE0wGkaJkvzxaAodxPOuoNZM+h89+yPOygrFZb3RWaG4/HmyVvXhX7eR46VjrWlW4Qv0OHSsP79e0WDHA0c1ag6ierM6c9IqUh4cp9shgQAf0xNZS/JC2Pya7LjjNMuLnfQuPvEn47YOx+xuZ+EXsFn3an092q3JM3eWhivInVhSMy8oBmUnl9yfQhBi/h9o51LHuKnfaz1PVt/ddP+hkRb6NMr1g/GadURhAki4250DsNoyzI0x6ZgcngW3AgbI1oO3V7ggw0Je0i39q9nsdx0HJLEmwoZyylrYRxoMvCkBx545nJyxVDmE7hkpmOEk217XNjiL4PE0iM3OInbx/DDOn2d2SEUBEzoYu9KKeyR+Rqm9DQd1TgODpASQFU8Vw1xW/wSCxbAuiPPVrOEeL0U771mEHFCidssfzvh198xbscwm8nUEbcwuqnBsasA89ki1xFC+u+kB3P1WEcUhtNsSQZ9KcuEh7VPAIoa8ncc31SobCIZ3lDDBJs7erEDSNau2hH8iiqrYaQZ9e+OBaedYwT1O9rBdAZdyAmX9iyJpgT/G4JIJOMmKMMZP7MYLpvqigDpwF7mbP8IelkHu/4lqbizVtYYo3Y9Qpx4n6raIH4Tdk7Vml3Sbbpbcqg0LSFpKXKmWV/v8c8zdRbm/bObHNLMa/TD76I/F03D9ovuF1YWC6nLX/OxTJXqKyQV0gJwGWEuIpDiXO+R954CDKTkOIwNOLAGtgsQEOjhfYPRvDyeibzjrL8phxnnEytkX0Xnvh4fWfmtlzycyMrDcT3P4rLIZToyV6vkp9vZ9JtIK2MySY1lZrcHmNbskokVJawwUdAWui2LfPU/FtEAoNTHcdU4BeUVHUZjk9ELHWDQA6dccpdY9zFMi+Lzk1hx9iX98uLeadlmdZfwbj5aYflX66g+Y/sAG3hUS3wBZFeuXFikA90t0s2XeIWl5CaJf/jat/SbhRU4dDzsiG36dKCybDHGkYehM5a5AyAhnKaCXABxg1jWaEUbe4/qXOFQjWUX622vZXKMsapDf0v+SNk8P8HLPZJBzATUgmPWbbBv9UZXRcUsKnqBILrLQb1MIPLWPGqM+gvmNNOo9M6k7emun65ewev2G/JVx8nzh5n35scC+W8kfqdd3fwowvHKkes2L6kJuFqUmYV4scqkVcIOnQlvESUYMWpQCxWMN32KyYvkHcdF5wt39UFXNealzeUSAT2llQhV/RzGaqAc/wc9Gkep9ZSN7jIlbvWUK9ggmDz+7uVWON3OeIIH0X9tANMhH7gVIwCizT/janUc5lgB0CxilPTvXu3mvlIonW9/+js/lST75GHmq3Neifu7s/X1Zbpjym2UKXmP6dIWFKVlTjYzHSQtu6m3uCcb1iexBNmAmN2/wp/fxPYQ+TZVynywih0xRIqyIjAntq9lZErbgfs9LzHwb1eePI/psCQ/4cf7aJWfzflZyPT9J8lmvf0akcpGJxr83mgypW1+r12LUArsJrg4MVBeqqd1CFplugkUuDZYoILjNJ2cm8mj3YIVqP89FjMz2mi+f6FNdaLiMo/XpnF5xCsoycs+fn7mWrkJl65KegMfgyGJAzQJyu4D/RtSTmST8NOsjRkjq8cDESuYNKCOb+NB1sB38W8thOqqhtGMvXNAPDuOl1f80HigoBFZoqI1jjDsqhgIA6pJWRumWU3W+Uimfw2libhutKy5hWeflWi0XN5VMZWlaD7amgNCJAZqwQgai0dJEtsghVj6B+0yHcKEajqaFdgCzCYBoLkbWzIJEk2eNfGP+6XMoPb2CiA34rtvs+3R+plE44NPQjLfULnWUogYQlLLLGIFvKpoJ7BQT+o6Xc/CrROID6QXRC5lVcn/xWTiWzGunbbbQ2rG08lGaOzWTt2BpHpjpMQ4QLFY+VHgZWJYRCZ22RsDV8zz5snWT7xTWJ7OGf5Z5PPJL+KC/kYO+F0WCobAPIKzibgx0VQ000NdW+3z/LohFGOeEA/gCFblsSUca887fL2cO9tWIbcaUnP0qLiAKKH29J+7czN1NrXeq6qPfGBAJwnOBaHR76xX+VeXUtRP1qiAFx32WBEtD/BInQx5Ob4Tlu0yAZo3wUJS+EaJQ0UKtlWrDyCa0BpOLBBmnMVjXSndpIk5+k0NruwhV33Gwe6lGUmjpJey+wisq4cy44oxSZZTQXH87Z/tQLyisUbjINZ7rcYv19vJWmFq+wCzPcDc/2oUdP69Pn/zz5OBgiFOclFd2LdKe/hMQdlQ3f4TjWTcxq64onui1xGO54Z9xSShX/TtFiVLuU/KvDGR+5dLYT50sTjWDuEXAG1RW1LmxizXHQSTCB4W5RrbiqGZbbYYXAA11ECMF1AeC7cu4IYRPFN0sBVnWRYu2WUn54fihQMm8RKWyL2F/885w9fgx2nPHSKWbg8HTqMxVUfcmbsvYqfAjtuCRoQnfGQDDsRTxoXEZAAoSfuhhFYg7EHLY1FOzNRWAlzqRmW3MqB13STY/VRCKiDFNa23oHDq1mrmjF1VaJTcqDoP42PAJodPe+zLoHgB+zMRad3hi4h/SkCoUr7Gn1HZn6XiF/dSxOWJO0atpXXVBOERDkOLONh1zHHX6gHbGb9/ziOywYdrmdXuyEEOtwZNYT+9mpCxlcmcK8PXBY95XIYn0gfm0WyPEzkt4ApFAmDOVKyyTYf0Cb2X03WVfsOnP95dmrnuNMAMc5HEfeOGbJw4yUy0iLQOjcLIQbicG/Uz3zuTMpgpU3LzPW7Lv0mw2S3t+FJ+p1mKn1roGAzQuTPHEkHeTKERqu6KR1iLXVM4e4zi7iCuCnf4NKfC+2qh0xq52WxHLDd+aqY7cd2LlB1MglOoRBr5exoISAcPc69gbuKvMlg+SSSceQMPuq+EFTaRgOfIqC1giqwrGv0dayUjQrhdEAvZq6KSc8KmoNEwGBT1yLjgCFFJ5yUG5QqPctAMtEbtOfk2NoQ2S9SbWSPPyYUSHdshYKShWGRfp+mz8rLOvnhliSS9e7cP1f1w6j2NBoOe7mZVTd5cfrSCEdeEWsjajQUq0uecBGutlcIZ5Av21xGT4tCRYtfNd37oEVSinCWsE3wrByX8Ff6oK8H6uZje63YzggNC0SJBCknoDkxYtFvF5JLDd+w6gY5BrnyLojHNrPdeiPW4AnUMo/9xOoVsBrD0z6tsBQKtLxCV1+YfrSa8O0eCgJuxZEz/mEYVmp2CMBNOwHtzxUE3p+FPdoPOnhKvo6aKMYahhjbo2IhauoDrAxHFlEgg8dQxg4nQV1X2mIaORPS99SJDtoCLqLQT4P75lsGRCN8AM9OhR6kFeTc9xTQ7D2IPWQCI+y91upoCKAukq6GR39WV93lHcZomqolsJLfee9IVnxD9yP5FmCNDCbb1FoQof06C0EXYpjxT8Rrf7wl89P98af2EK1N8qrBUyxGVGLJjClYEsX1eDp2obYNuONJgAoFU7303va6muU+1U2ikapB0DYSRqaLX27mVdXYmuipgAJT1iycd3U4sPEYzXjGJBFybC4j3dqTCkZz4d0Pdqm7WUDMZJOae97lXH9U2/9R/lE67OHZxpOMqKbDeb2YJ6y3THg6IwK8f6u7HDFy60ntEhqNgtlRhHwiVJoWcvs2MkOuVTfocK7OosxaNQwGLSd6mz7rNzUCDm7h6i7QTyfzMh5Zb3A/Gx4YQgJgB4H3qayqqcnMC+QFi6/pczkcNyZVCTxz2rjfaPMbB6UaVDDDi3zsRugtxpDIs65TwvMcDPB1ggEwV3CXM3mtlORivxipeS3HxUc4W3IJ0w2CzsYYBYRAKGiEhusDFZQ7NKpvJoK0hQDF74fjlEIKo0xQ8reRyFoajhtzRxqK6YQZyO2LjuUE0TIH+jF6emYVv/CGktbNe8KsDuKN1a/Fz7QHHYNB45p6ZoGC8T/QWM/wx3Vi9ZeZufV1vz3Ju6n0TFtWQON1ZyR2wx7l2XPqDEMnag63IGU539nm5naLuz4XlFGGMNnwqnNbxYGTatYQoCy8j8JigEpZWjpNcM2gxPLh50lsrGgVLkFufQZlnkZ/isYTEXrynhWBcWsuwjZ/Y+f4A1AWUoiaD0hEgI77yIP7Ui8i92qcOPca576UZ59GxlsaX2b41szdbwJJaD6Gyoolay3CU91OqC++yfuaZ3honqgVttOp4gGuVCpehCyb7JXcLe2cQ7cZ6GwbwPyC4UNgaaKoHeoJu+zQl5MHpb8lcJqMNVFI9cuLgh6iTFezjrOV1XwfsX2U7V5d8khQ6BnctLYlEYqUb4T8yn69KkGEyfu37wrVIMjG/ae7zHuVlpztbIKMyad4KFE/wfrjiTwZtL3ggVSkSyQVzg0tIa1x9LtWfixVmNtchNoHx3jFl7k+TSyTSS0JeLT/F7/ky7m6flU/6jcL7pHCbBHFcbpl+Lu+olKu8XDjk5rSjzJ5Lf3n19tYEJ3Opc9TLxRqw9K9+/qfmoCGgaaDFY+e7MirYXBH/ZFtJ1anNSgr3fQ3uzhYd9iwjs4Fr5Lu6jKg08mYarpQLaeuMVOhW1kpPB6BJmW8kanPrS8ZkboAWCZyPDysxnTLHNYp6NC9Lpghi826+otiJcMlp8d6FWyWePACQ//jLcVdYRgdb1b7+OjBltIKn72eOEKV3YZacw+TyjPl47YiO4hh0RgUhJMH6QfukYe732ePegIw+wGaHYzXR6jXNQOzih5h95pa89rpL6VliGWg8J4Uco3Kk3tncA0+DxpXVKMfXzsWgRlkYIgYs06rfo06KIbmdZyvVdqHB82Yf9MZkJq1rKcmmg8DfnBB7tV0VpLRr39TZrwZh4zXqXgNt380YL1dfTZ0hC082yJj9Eyco0qWhN5DK24mM5Gflax3oLp+15G69wHzV1+004oz6EhInnLUH3hi5xEBGLy0TVo04Ugth1OaYA6HgHoCe0bTX9kMWVVsX6YtdUk8P9iQiYXszRb8+hmIysy9lcIYbZ9O6vJepeDbfEeeU2108QKoAFB2WDnpfSbd58lDpTB+OvlL/psvnNeklJC/g3ePE+K9Sn5mg2Pl+TgAGnWAmeuv9zCz4+CpQAORruPAOU9dlHwCvMZc7Ss8NObaEaCU6lRDIFnx5Dy2hxxYQCpN/lKqIe99cPbCkejhxUCYQ2qK6RBSiUe7X5bFrtjNXzQVXoEP8SumEw6sSdNNwHeWlL32c0gPop0a1K+giZAo+BH0KhuybxIrX5rxL9rtb1eAkXXj9XIar4BBZ5/Eqb17n0y2ryRAEVz5kW1z0X89EqdZ9BVGN7+Rx9tZ5KdsLZ9g+kOMqpnZoC2J4aPrOmfibkzlAaUroquPr39UAvlPgcH029ds7Cz1nOfQLOzCBAhXedE3EYd2gZSKvtn6fGVG3D+XHq9t9EOM+VpqdW45n+3yHU0uqBlmERdrkaT1j2DZIXQgHXXwh4AndpX57aRiX6mT2L77swllDnfYajtTvxaISamHZ0a7XZr4oZ+UU8OLTy7yLXJ4SBiEn5RrBA4oQ+s29Kb0hpzWimbQGVbb2Ij7zgZbtEI3TVBtCoS8dW2V1ja7p1iZ/o3iILfryRc7z2y2pNqvjd43bPWwO9RstnIO06LlXNH+MSt7+890Sor6SaogGVP+QWr6D7C8mjbeBkMu7XWm4GHhwoJQe1TYeJSE3kZwQQseGX0bpsHf+vaLRLWXILxXZ0tAYQAZPkQNlqJ63/NCP6+zX8pTUsXjCJdbO/amyTjF561aNNJAxkU4h4T6CqQ1l2O++/aO2kKGu3r9TRtNZofshboF0AEU2USaErbK8OCD1opa5LdhglnxgDBL9i65EzPZA9d5ANe5tIFP5NFYBVTTtOGnePfY2eL8TDVO5iPGPuBP3FhIFbzENqUqj0sgghAxPj+PH6c0vHGkRizAUqvxPloARVBPFSxXs/8rZNbVgZXv7qs/JkEm2lVIhFGr2O0qA0Tr0J0Y7PzHMnNwbV68X/x8E0S5jPvSCGr8U+CICZ1JCY8buxwQenoVCirUWKBoavKj0HqonDa4KulQzXV6DCpcEA8AVInQsZzUpIiP796j0zaNub96JBthKR9BFMMoZomV/2icD1OO8gnamxGM7uknsERs7yDc9Ggz+XgoVmV0ujK+mylaTreMgUjBXoXZQaDUxvwAQbhv4OoJkOfwTy0GszLuYRmnywYKPYQ0UUis/dXRoMKbO+YJniwyhyzv7qkLOJd3TuakDrRNvM3dbg6Gx7szWsfyn4dONITydtOYpwMAcFtIDCbNPse5WMDo8ZgoJlJQtGXPzzWiPfiPAbpUukeDZUF9+AttkMzb8suniAdll40BSJhqMXgb0UWK8bBq0J5q+2f2QkQYmvfU31zHOZCirPsEyGI6h4jsIdQwG8vkeR1X0KxVLG7+j1rev4IOaVVikB1Y83HWtqoIy+wHQbLzV5ccMG/iO143HiP2Khgkv4U7dpy1xUi5eyyKtYux2lBvFdRHz4+fQH4nh/JRYPsKjbb8y5Ie9JxNdkNpHner+BBVb9pYQDERiQ27MHnEgx0VZj90og0Cw3a5xaYlmXSkElJUy3e5a41qjFVv2otaeZQnoZV8/SmDP+hnUdjTZ+Okr5aeuV2KRg8NOgZMlHDDTNiV9PnmhZPOKh3kMia3O43yQNCyn8pjDugBxM0WEn/frjSCZJ3/Jcwf7Z6od9DkZsCS9nBYb3uiPJbY6unZxRm26+geA3KJzce9Ohr6nj4+2Byiu56fexdTwFxE4wVPcI6XCez4XCpPZSm07FKJFZAAF9cFSn4yq5awcHPYDstjAhkOdv8NZVtJuQ8E8u/qMu44OEgCSWNtvW5LKOa56nJyz5M23wbhjwWXdMkYoZpRdeCtI8cldWXdYLr2/Cu5B5VCbya4732ELIi331pQoFyxdO8skmaZtw9TuQVDzJ7gBHWUxbLKmjjKax7w0GxygIPuZH/glDOTuqB5Quns07l8w2WxuVLTrGvZEFR/8ukEUQIsw7ruJBUrsiu5W0HRNeNT3/LC3iVN/10/ZVQJFIlbK5qEDMNGOy7wd8GriUzhsSoBDzvZDLl+kbxMakCJACba3Y8qgDZYey2W8FR71SVyNyiAEzDr/FLfZOaT8Rk/WRjqpLxWV4I2J/fjaYhpW8OLDDoYtDMyIbnJ79mkIHgvD8P2SOIFqJ04CxYAb7+pFR+WgBsQBh4rueKXHdLjArEUC+OJsmAiA4GvL2iUD1lOMrjht+0ZGP4YJqrAF/zodvzGh5o0VMqYHX1KNZAjgZaLI5pnLIVCsD1aqPn0dK2ak/LVulGu2eJ6u/0AWlWLEc3aDauUfgl+t8N4Q1lFjDETDP5e9xNqlp+zy0L5tBCaiRI+guz2RpmVk73XuvnV8P0R4pKzlta1sTcJ77lCdeEck14pySiWnmkhJgYs/4bM0Vl70inrxznItS9md5GS75kuWCE11/Ws9ASMK+RaPTXMUmB3QrO4mqAINNC/2BU2jXdMJiWSNTeSctBh+bZk/NvSgIbQbjOfA9oXSk9mRwJbvShKNyAv5f/7sg3nd8HhY/0hY3pNKfA0rF6Eu6MxSGJ42N65QJgu1uo92U1gdVBCuOhxxpjh4+UBDt29bYxCJkAuLfIhKCtUuk+b4HJPNZm+R6fMYB0bAgcmJUX7IRwmtZuiF1d6mfF6vXzCizZGCB/yjLekQbIyZT3K8i6aQgkl0iOom1qfg4Bl3OWx6vjbRR5B6o7CxmXHt4ol2b9+8ScJfdzn8mxjwys0mMhjlW6RCpfTSW6idxItS4oo4JYYqiGOiAIB373TjOo0x4oxHmgCb69llRkXT+V33mxbrCler9fKSKGLX5/217yyBnh9M4mo9M+1rUpI76p0XsSeh9XxNr/+QJAzXRQ8T6dgW+TOp5VBKffFBGipAYeysJv9QreuSF5ptaP6oQueCgGzGp84m5Y/6MgdvXNFvcbYmUhk7q2Znv3hrRUqkBmghTcL7rngVegQycg4EpC4OFD18YWwnew7HbfHsEc0whurXr7FW+Fm0EScyRmFpn/pMG+d+ADrCwVtUP349bdOu8RKu1Z6k72pgrN7M+wEs9zGxVh9Q74/B9slyAHme3AmYcvDWSAasVlecVoBFL6tSrh6CbNsBNqZ7LtFWs4JwjSZoK0lv3VfHW8MepltjDXVa0lSgoR/v/UNOhaXYOvnnuYjQdfSZULn4fdLCr/FHUcfmfy2ALflCcjuWHcLPGNA+q6rGGLPiWvDYIQmdDuNOIE9TsKvjtjUcQ1ee68WPuks5r2nl8uAbPQMd95fS6hy5xGxs/niapwGLb1Sp7xHsv2SIRlu5SBH2fxtREtTTohGqTiKNY1SRQYmcrCMHtN92lx+qBkii3dhkf9oQKW+FGmcqJXUoR+mRn/SAhwmcsI7hoVxR7jG1m1U4GWx1yPrIYXl8UFbmz4us74poQ0xmkuulDy5uVi3KxB5v+KXrzW7Gp6OK+l6Ebxu8ji9mwqsaEhdBgZ7L6Taa5h+VjWLPn2FhRNwmGLKBM8SewKqTgVe0fI6WakgLw6VzlDZPo38lMCIOaV5qZqV6U/+9WmpdrLgc3K/uWcEx+FP9XH5iYZ56B34OXzFo+pbsJqcZi3L3Mlaq/9RRhGehRIXF26TKQmCDNTqlOBTChWDaxQKMFUNMwxVIKX4FAl0zoTJxKWgo2m4I453fx1rM4xfOOyEwqSWH3B2BiUVGGlBHe07HYzsegTF08mCUc+XrLJTzAVEpc5ZvKAs5w61FtDhDCy81O2UjjouwLMVS6/5opMori8ruoGYIFiVoAo0ShM5HaOMnNJqoLNoOR1PnWqN+QyjsSlXoB340OxpaOBBQybphn1a3KcXa2PTDlXGqt3APSnUMySabeFvFWgUHmucvZ9Mryb9gKnERsE/Rq8KPCqdOfM4TkgR17WTeUwArNo6dhnUIYtJYoO1ndN5MxjNiqGL9FKroVweTTtErC3aLSSlnCKMIxXmHIRVe73dKqRlaIOZsITs6T9vwWdUckaArneWo7VxzifjgZH/1kNJWzFl84800rwv5ZKn54fC5OootZn72hFHEtmbd4kyakUmjxTqNt2A0TBZY3CV5NNNVY8vEIIRHMrxjF2sNp7U65iIVWGGgNi9WwBnc8Tnn7+ugScGTeOA8bWMjHyd6x+B/aB21wVShDtWjxw0Q8cwaUSDEs8jCQtSD8kYQONSay9lZmb2ciWBxCYEvGUbiJp8G2Wr9E8YuVNb0sn6RWfNYtWG0UPlSpTDKl02+vKMOUs4lIOXaV1Rtfud8iC512rKp0F6hLoZLk16cVoNMmXtxmgg7PZP0km7N0FXb74wwYmQieKJY6b2MQL/6ROY9R+8Oh9FrvaijemukiQdRx5HNWWKf+j8uZU3swdJ2h+ojRAAdByvlqlPnGOHP1avePm4gq4ONKzsO8pazUyzeqzu7vc8pkuXt2L59Q7P5hd5FC3AcsmmMS49CJbKeoXIfF8vrlyfaxGD+Xu6Tq1Qw0qSsGwqlHyZDWSaQZl6I1GkzwQ9xpLIKz+kxXiVRCyMWBsO9SHh+9X4IIMlXe4j2W6Dwfbr50ABcYNKSla4Gp2W3K81QBMobRk9O4fT7fh3syx5LqOXzmtsmMmGJhhEBJL4jnyBFvw/2C9kysMMrOENv4Bab0wq67iOClEvCa/L03kncG9vL5XaPneTi/uBQYgYM9GGNzAUTz/Lz6SquSVxRHUI8g3nljnedS7Nm2zeqUAiapazOM+B7dlGl7tnlswH1TMMkJbj24Luo7tOL+rJ+uXM0wgY9vXlVyfa8qaNa1HYLkK1lZD2T4h9HKtXwMnII6BidxhW7Eip2zR+cRAROFOEdNuYyzFUF+0aHZQW6r9xhIAU+fG80YglZ4JkNIdtAcLoDTOBkrZ9Jsxj6oLLfLrqlpIJT1huhExOxFHBCHhMAzIhpbfcnGv5GJY8TkvI9GN44Zo5sJx0E6wvzq+uotAHYil049B4YkTrwKwtta4x3UeppKIoEIWy5ABXhvhHeNKLjXqqHkS2o7n3b+JQYfdLsejaPicm1+RCVRTa+hKwRH5yfeCLtcEZ2fSbR0zJ30KSGvTgvJUHM4wCAiQ4/YE7vv16G4Q7S9eECP9aHNj36NuwHBy8cvV3fzKdIdtB6S6YBzk6SZrZltxpwb0UooRnkMAAgqcnvRLtW/bTlwdrs1ZZm81os0I9hPlKITJKIioMu+IzwYMtdbWpwTUlGdI+Fcpa9nOLrUD+8RzzzmtshdXnwrjkeFRmL+XKJwGdwIAASbTsBE2uvPehRkY4wgx5PDYOj+kz6FRPmeed2psO8GNjjTVpQRd2M1gAPXth71esmRyNgyVWhHMAzRFbH+DD0Z3tKMRLYEzJ6AKuuZo50E15hbp3lcdBnnRPIwfiONpV9opqX166GkSKFwNM/SKyC6ca95uGcxxWiHUNgTIDWc/zocjvnbefyJ+Kt68zma6Cfd5pGAVPAMuEVka0TCoDe/EiXtm1OQaTYfSJh3OCFLE6P0GBr9cyae6mNG9nV2e0+xOVkq2aY5giNeA+8MDSLIpGeheVi37RgxnZ3qXe4RBOJak/LIIuArXEg9ThbJC+IzQv+UXQxbOAvycNh6hbRXhZ3iPgtLOkomvoOVTMnaA0I70zXHkhpB/uqhfAQsB+J+r324JkG7ZJrxL021/feX+6Y1yIcb3EHfXMkLyTMsRlTHPvJo5eJ7JjpF3vkeqY8TWpTJmFdGuu18dSF1v/NMp0CrcKqvxhVKAbm+sb/5tBlTPoxYQtCrEwvXANsmbb3tyc0NL+KH221eOhf1EFLbJ8SanjrvFdeiWwHOTR6CHpoCUk4hvuAxGvwNvGmNd875h5M7fkaiVmXgXE6SKo7W9U8CMKOJglwL7cru6HkeL9y18VT9AMDEJe8AjZZaPcofvqT7iBINKQvRvfYHN0cA9RiqhOttK4KMGPFw7bZb78+jrbvLeCS/Mh6W+cuJurzMwNOf9AZPZzDYe8cWDoqbRkTYChZcxUhqgLek/6Lz7Gob8wlLtXHYL2dsfRvbCsYe/pCGMaMYJSheyZY0nwXztM2+8yK9B6SAcH+tF1eAJUjGqTpzZt7oSr59W32LebSSnQm1drX4hKExVamj9O/CgqACKjHkwXrA0QE2I585KYVD0vEVssODEzv6yYWinGxP20lJuwxpawHcTVcFps46tU18PZ/y999C3n16zTnyoK+tar8UoNF9NoGkgtFAKrwMFYybZWRGU64f5ggEhnp3qNgl9HQ3wH5Dwt0QyYq5CWyp3tQp5CYgx33feIj1M5sNQdqXsO0aVaf5npmc1e9mNN3R0FXiXLmpfovXVgsiuW82D0jjwlLGEOMEATxddCUmZ71PPHe1EavWP8aVHcLmVzeCkx9hczRhTzK+Ku4V+RsdOWmxSfDKxSV1PoZaORJDgSYkTpihYr+EHZiE6uzE/boKeIv1hOnHUIlmkTfFftw9g/Xkza5Z96INUmm6gVLCAHIGiSGupB5zXNJLkRbWiTvhD73TjEhwpyowqCqgB0AiNBUh7Cc9scPok6eRL85XEty21/1K+UtR8EEYzVlB9EcxS4KkggJ/6jqFnRw4ZTGQ4ThcOr3lA3Z+Lu5nXKRB1DOgEIgoW640Qvdi0P8qxZX0BeOZJRA0ArrwweaxLQ1zvv+fpSDMH6Xhcam7XtTOKIVDgEc2gRXb3TEaq21E0IrPChGQ5YRhi/ZNAi3jXFsbmeqjzRxVHkq8I5l3NkZkmRWB8ZwoCAOfUV3gj2HmOlYV4bLvJ9ndak3DxUmL9l91/nWf+luCRM9JiINbkWRRZyzF8nVZx1lND/NQ6zKR3KeXE1mu1nJJ/tJQs1lluxGGCAzsKq5E7xi7KPxIBWStGiDSUbonOeTR9GhKa5RIMm0LgvM5Y2epIVkX2ZKrWJWF++yeJnQD9v0v5MS7+J1xlKy+ZbgSZcm4m5M4sTzdJPg55azGAQHfLn96Rf6ZP0xbktHwEvHKfEWfEfyisChInqy0AX8Wu8TbdqU5t6ofMeF+6n5tAgfAFFcUqrE3adUb9qPwuDZswLMs+koNZpmYj7DcgVhrcKApAKTfLE9dlscNE1cyc01ZBLRqMYOfqqeTMfNuCWfp2c2SMlQoHFJaJRwaZJT7CylQmSCEfZTupmGXVFoanByOg8plvLpqNC0yuhTmovqsyZ86L80f+kYib6QQWiyb6VObWDrq2A0romNY5EiwcQ4B+yF8F/V3Wz4UhuVizBuZisr20aKGag9714V/2r2uXDWJQ9tTA3pt08Lq45l7YLmuVSP0i5YvhRHFXFrqMLF6PHERPLKWxT7gn3IPB46MZFlCy1ObkB0Zb5TyNJQGS+yBbBY1zDyw9sNClVe5alLOq/rRIT3l8dYEkGBVBZ0VR93IpvTRToRdc5h4tYomgi25K9E7KaAEQ6B8uzxoh51LPzEOBqipysIG2BeMd2KyA7hv1eBtVzFNRUm2QliyiFOBdk8JbN4s+yj2F270jYV0eg2m2VwSsLxoRLkalB3/PqoMrugAvLn1aX/HQ9SYTSGa/RIznCkXJouzVOHMTkGKKZ2VoODqH+DuwF8YAPIuwzWoOwc/Cc8zfbo9+29zxCY7t5Ua+w4PwNip03Cea1pi9EBjxDCoK9K2EACTf4RSoqb2x8i89sIJ5aLJaHrNFV4FA3k4xB1Ec77owHXswIJAblJbrFMDnl4RCbaAlo+dtykE2ofgt8MbZWNLHObjBOqbH4OsgrIcVdbwGi0dHIjXoCnxz9mo3UCj5q3iC0luUKP0HsQ7K4YdC7/RJG1QzhEtE/8Ij7SWINzuFi7xafW2Pf/ZjT/kOTlB/logp4LGFXtZrPX5PEYZOtc85Yz4BxYMPUtUAwJL4d+UB+PGEOq/6eB4TTVrUjCOuiubwbwkpcR8k/fVf7OPh3BfefoLClsUPai1+fyukcTtHX2fU3WbBWRKjWB6UniofpwvXZVBLpNGL9EpsOSiq42OZ4IZ/ufCk12aRuB4j0ls5+ZgvShIHHV7fXbcK2V8Gjn3jtz6k3I6fmCR0bmgTgdcwypdrsKdEVMBP8tyVfdUS3S+LHfiSBInlApodMiNxWzZPuZ7iecl5RAb62OKjUE35SJGcT+6AHIDXfOoVAWoxQGITtTavjyXeg616EkHulccPtP8WMi1XgpF9c4F08uBRszPySrDumhCxWKXaZU7WvEBJUNDPigdzfgOHfZJ37zv9rbF/IKndSvWwxAtnMiav0dGju8trYb2g+9GjMaKEuVUKuLz3GdHQ/V+E3Iz4LdxsEtCJI7Pj/9Fc8xIv1jrwVkpCYPNlmsoNbjaWx1RwwEijXJBszAoke3A6Q79iPdFFQf8DR0R/i5XynplgIIdEcBuH5gUBgaH/vrKScKWkB6/eRfAXzlbF3YsZL07pbjz8Ufiqo1119q8ATO1xEVqvqbC/BR6sbRCVcToPQZUzmIJP9ynNU/pMC9LRZv1HsXZDbTOKUtDgYc48hYMUjXoLwyPRqesaV7l4IV9K7R2wDaGtvidka8AJGS+r6fR42VxKF4SYTd5cOL9Zj7IUIx+8V6EYRSsHcCeTcZu43gfAVG7hH6g2BnESz+Snknf8ddwQT9JQMQFP3HVFImV8/qXhNpsbZWP6c+D8mfxeegNOo0rN9p+Hns6ITPuaZYKY1W2HDp9BGmo0CzX9OxmYLRbCXN/NvEN5WrBAc6gBxOoK7mxybLdEIog+7jyd66dLdfaIb36oVeZBIY0UdwDfCoSxlI28ip7YoEAo9B9yYnWJ4o0V0bUED/CjYzFX0sn/MtEjxfceMsBsG8ChUAKs+ZC3e5i2vdMUOpOv66TaVc2rAAYXFgVInAFs9eqMhb03Kh/eskVLEzj44m+rs3pqWW2IS0FX6d7VUdwJSln8HON59IPq9+ajQH/djYSDPv+4R5eT+G3OloMf6sI6uXF7hNTIBxB4t03ka4QvVhMQ4+SImkYKYgPLlL7R4U/rSafa1ciG+P/DjeJfH2/Z+ArZBssPPSpNRPCz5YVZi16hTsoEV1holhnmGMrZ/vKeoEyAK7sx/j7VTXrv5YCL+YiUo0wcluUfNmZhPFtWuaTcGDuBIh9sTsgmInfObV3Fq5IBaWvN0UxBHPBXNGYuTvI9Wql09fYUa8On4hHQ4DLT58pye5b5zC7Ie6sSNXovbw196Ml6kEtFVLu7eTOhcWXpFu3Dok3+RCK3qhtQbHleT59wKubkyfPDwkVGz9vArQ720hJSwjKDgVAt38c3AxwQWVB/4Tr6pcfXwOknJxVkhBaevoHGC4bhqwc2Iy6OSFWSBoHn1Can+PKwdimiIaKuZxNqIYZcyabZAOzz3HVgFvn5sDw1EIgmcigGOcmb69fVByJy1jfOTWVj2AB0ez2PeAzKzDiw6ed/JBK9E1LFSemKweb5jcfOa+iZ1Pe3g9Hbibifueq2SJ4oDH/uWrsFwHnEd18xtTDcGPJnqMKGVTa/Hv5wiyCGf0Nrq9xVGbUxtFb571V00hvHxUUuMXCs5AJeu/h5Vcrb1tdxj/OblXHpna5vXYx6itcxpiD5rlyRIvijZJb3XVs+AEab8saioplu+zT9nP8h8WBPYTqNZBsQ3Xy3mnzlPQJ3tpj1Ljmhxf6BxPEiJ01fEf+AxadeZLXl2PEunKJxFDVZduCH+oJW4sdsny7+Y4zb2l51VUUimYmIYuktSjfpxxcQ6f/OANB9SdgTDVdr3BWbjCRIOCcuLKUk6lCcMYtHH+8JkT7lq+MNQuQ2CgjjIEsUSvuLqS5+4YGrgq79Wn9prU93jzQHGuKIFVh7O86D3i9KtLzwVzRmLk+YwFcjHnbQU+zKQyjV1uGJM6ufMZlAU9Zxk5lMbN7qbU+CqUSPgKFfDMh1ceGJL9gnvPWMgnXdbiILaO2Dp1fA4Rg5WPRC0nCyJLqUwF2GgLf1rOh8yEX8KkbYstIW0OI41DVN9scYOCsXgYfj+B7n8WXQvRnKXPYL9cc5DdbZht8NPKcv5KGAjuay/Aim4h8UQxlJY13MKnB/nrZG3VAhmJ4ygaAm2jiQkFshCN+TaCNIoSac2pOBoG1f601yO1EwBZL/KDsXPKoB+fisr2jI6nAKhwKHh2s7FU/AFBcffXekkN32NTPkKHElGCj1sBdDDcfO7enshzohCUAXw7DiZvRwGRTshODCAAAAAAA=="></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1480206980178403337"><span aria-label="31 likes" class="social-embed-meta">❤️ 31</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="6 reposts" class="social-embed-meta">🔁 6</span><time datetime="2022-01-09T15:56:59.000Z" itemprop="datePublished">15:56 - Sun 09 January 2022</time></a></footer></blockquote></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/ldodds/status/1480492871954411521"><span aria-label="6 likes" class="social-embed-meta">❤️ 6</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-01-10T10:53:01.000Z" itemprop="datePublished">10:53 - Mon 10 January 2022</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1480360552845103104" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/simonw" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRogCAABXRUJQVlA4IHwCAAAQDQCdASowADAAPrVSpU0nJKOiJzgKSOAWiWMAtvt/BoxFdJfkoA/GrXS3WCayrFb+cR9WMY0SAv50mBEKMPv9WUvsFIdmrkHY6QxxwvNavTdN8X2nJ2wzFiMfponmkAndSVK1YaP07ThHOqPctKlDwAD+51h9cp+3KSQ5qxuedsaAuW/z+3dXn5fMuWwnHqAmM/c56QeUTRfevdElylVHrqX7ny/V47Nxp32Y3tXBXiWZrX4M5rspulRCsT8T46uXihnmh3FsJ2PHyH03mIoRpOwYZXiq1Sm3sfv+oVVvaetFMOUMm4rmDhwA6IWW2gJCV2vEH7tYUBs4ORW5zV7HIaYAiE4Ap8BqqgM7ws6AO8GOzHhjmfixM9GmTdYO+8/ObgaeQ0Pbzp4z5ephPOb7pCf4uh2Hox5pug4sTDcQfWTl95Jywl5haeV7Ec0jHZzb70G3yMtqbXJdIMHxQnfxzZQ5EPMi7ZgY63/0Wxod+oytqTf0b0a++SiI6AJYupq9UEF5ZrWxK4nj+9KC9bzU0L8iy4g0b9JNTTLrObrYDY+OHUcFl3jUptJ9338ISilu5ySMnvrWsXUBJrtZFYJBj1JFNt0NC0VdsVZ5SJdKC+hJ4ffvuDCThjdwvcBLwPO9ufho+Xc68dYN9OT/8tZ514cvk2RHZdUz06RDRYIFoEtZDYki1NDSEt0aQ0yRdizfyyJ8ug/owAxxwFL2igJKjcB6gHCye1Upho7RK1AWBI4P1aSXmN5XWkjqQyHn9Ve2d+3ckx0BMyInLwp0naKtCMsyuG7nEse/8hmiex1ThFIP6Xo4aumJ10F3OLUQvXBKQBCGP4+edThAAAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Simon Willison</p>@simonw</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Thanks to this tip I just found out Datasette gets a mention in this academic paper! "What Else Is New? Open Data Users Need to Know What’s Changed" <a href="https://www.computer.org/csdl/magazine/so/2022/01/09576893/1xNJfq0SwG4">computer.org/csdl/magazine/…</a></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/simonw/status/1480360552845103104"><span aria-label="25 likes" class="social-embed-meta">❤️ 25</span><span aria-label="1 replies" class="social-embed-meta">💬 1</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-01-10T02:07:14.000Z" itemprop="datePublished">02:07 - Mon 10 January 2022</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1480792098601271297" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/sephr" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,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" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">🕊</p>@sephr</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1480206980178403337">Replying to @edent</a></small><a href="https://twitter.com/edent">@edent</a> Woah I got 8 pages of results. Completely unexpected!</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/sephr/status/1480792098601271297"><span aria-label="2 likes" class="social-embed-meta">❤️ 2</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-01-11T06:42:02.000Z" itemprop="datePublished">06:42 - Tue 11 January 2022</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1480823441091612673" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/autiomaa" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRloBAABXRUJQVlA4IE4BAAAQCgCdASowADAAPrVOn0unJCKhqrqsAOAWiUAVhmqxqBfANEWV7Pxona20T/UdGlubhkrl+uiSFHNu3LHB8DqNydfwPIy+78FIB2bMnaHPIb3sBzTVrrbGAAD+ERsX+S1E+iWc7w0D5ifrn+KFSZqyp/xvkzVpNBfSZCdh9SQydPSKljogpFLejicqhY+O0sjTjFfRJzsC+wuwYWV+oYljAKfBfv56GLIaHCMaFK1F+BK+asK9zl+wiulsJAJ6b/SYq6sJPQTFQHTn5WzVqnnwF1BcVM+XDqjfLzdn8XmD/Phf5ZNo73wqB8enJFms/QDl4qTWD8zQrqhiSe1fQlUgyeQuV0X4eN9v+KJQmaylX+H6Zrzl8h1qomGB1/0fVKXpPvYwWvfABP6NrVe5bt7WyOpcgp+qf8yVxQBShhYL4fJ97qxr2twH5/nLsDgA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Daniel Schildt</p>@autiomaa</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Google Scholar search results <a href="https://scholar.google.com/scholar?hl=en&amp;as_sdt=0%2C5&amp;q=github.com%2Fd2s&amp;btnG=">scholar.google.com/scholar?hl=en&amp;…</a> found one academic reference to my list of companies that use GitHub. <a href="https://github.com/d2s/companies/blob/master/src/index.md">github.com/d2s/companies/…</a><br><br>Documentation can be useful in research &amp; learning.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/autiomaa/status/1480823441091612673"><span aria-label="2 likes" class="social-embed-meta">❤️ 2</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-01-11T08:46:35.000Z" itemprop="datePublished">08:46 - Tue 11 January 2022</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1480855033193189377" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/faltoo" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRtgCAABXRUJQVlA4IMwCAABQDQCdASowADAAPq1EmEmmI6IhNVgKqMAViWgAnTLoQ9hA1AXNXwB8af09omyiOJlo6XdotYfpS4VbEKuXPr/PAYHT/f7URYptSfO9ZXK3EswZrdi9rdPKtRNJBck4zMgmGPFOXggCNIfIsAzN9uUwdg4AAP7szfb+gLmSgtMmbAAP1+zrJiDwK7Uk1eN985Ko0rfgUaNTH9U2dnF6Tff/6/IzrZ+0kbf8czW3ZOvSrcGDZUJsRt3Y//HQA+KelV5ZPdwcwEhRGXXoneA17NkXWlb5YgRqGfkNJAz88uIClzoWg765GcSn4vk+/xPxNfSNajRhJNsGoSm4A+LwTyyvsOjChWPaDcgDSCQ+PngIvBDmm2n3x+cTLnKzOJdjzKf4+JWlOmgkeElHV3lTcGC4VVHapS/l7pwBf5d77XsTs1XTfvM+Jdp832fTE1jqdWBcqogsFdktM3CmzZFmYbvoCOki1JxabYZaroeamDh1C9sip8UOR9Lqljj5/BsOZn0XEo5+v37ENSWLtKbE00GGpL08qPH9Hl10804bCbPg8B3OfwBbQFZZrKGlv4+nDvBgKaLplZeDT9K0o1q1TJSsETZthtkSURqIS8QIrt/spSny6bzOOLg9kN5ZNvxqQrbRkJVMRUPLQaRqsJSEz+xtjvvQSa+HPklhVZ/AVV7T/XBZZ9Z/FWq1MP5hch3i/xU7Jcsjk1OowL/gQrIMLm26y4bkf4T9sUcQMhABTmovolyEvhbiy5pxIl3agzlhXDAKEQk8xqPbA25vBsESsoAP5Wh5Q/cGxT8HqVqxBHBwyAoJekqRZHM/ArZ1DgOq1zN1z9F5tOUGNGia/fR0lGVQKvU9ISg/8Pr29rcMXnbDFH+IL8Wf5mZlIVSggLlZylMlgX3hmOsJT6dTh5YPf7zFEu3fu2ZJ08ylyeAYTi6P4z/PXY5BJhlVliAAAA==" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Pratyush Mittal</p>@faltoo</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Wow! <a href="http://Screener.in">Screener.in</a> has been cited in at least 21 papers: <a href="https://scholar.google.com/scholar?start=0&amp;q=www.screener.in&amp;hl=en&amp;as_sdt=0,5">scholar.google.com/scholar?start=…</a></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/faltoo/status/1480855033193189377"><span aria-label="217 likes" class="social-embed-meta">❤️ 217</span><span aria-label="22 replies" class="social-embed-meta">💬 22</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-01-11T10:52:07.000Z" itemprop="datePublished">10:52 - Tue 11 January 2022</time></a></footer></blockquote>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=41624&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/01/check-if-your-code-is-cited-in-academic-works/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Book Review - Working in Public: The Making and Maintenance of Open Source Software by Nadia Eghbal ★★★★⯪]]></title>
		<link>https://shkspr.mobi/blog/2021/12/book-review-working-in-public-the-making-and-maintenance-of-open-source-software-by-nadia-eghbal/</link>
					<comments>https://shkspr.mobi/blog/2021/12/book-review-working-in-public-the-making-and-maintenance-of-open-source-software-by-nadia-eghbal/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 24 Dec 2021 12:34:25 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Book Review]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[oss]]></category>
		<category><![CDATA[software]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=41379</guid>

					<description><![CDATA[Over the last 20 years, open source software has undergone a significant shift—from providing an optimistic model for public collaboration to undergoing constant maintenance by the often unseen solo operators who write and publish the code that millions of users rely on every day. In Working in Public, Nadia Eghbal takes an inside look at modern open source software development, its evolution o…]]></description>
										<content:encoded><![CDATA[<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/working-in-public.jpg" alt="Book cover." width="338" height="500" class="alignleft size-full wp-image-41380">

<blockquote><p>Over the last 20 years, open source software has undergone a significant shift—from providing an optimistic model for public collaboration to undergoing constant maintenance by the often unseen solo operators who write and publish the code that millions of users rely on every day. In Working in Public, Nadia Eghbal takes an inside look at modern open source software development, its evolution over the last two decades, and its ramifications for an internet reorienting itself around individual creators. By delineating the structure of open source projects, she explores, for the first time, the maintenance costs of production that software incurs for its developers. Drawing on hundreds of developer interviews and analyses of platforms like Twitter, Facebook, Instagram, Twitch, and YouTube, Eghbal argues that examining who produces things on the internet, and not just what they produce, helps us understand the value of online content today.</p></blockquote>

<p>This is an excellent book. If you're an experienced open source developer, it'll bring clarity to a bunch of concepts you're familiar with but couldn't name. If you're managing teams who work with - or produce - open source, it'll give you a greater understanding of the scene and its limitations.</p>

<p>Given the current furore with Log4J developers basically being volunteers, the book presents several ways that critical open source can be funded.</p>

<p>But, for me, the best thing about it is the way that it reflects our culture at this moment in time. Sure, it covers the history of F/OSS and it looks to the future - but it is mostly about what working on Open Source is like <em>right now</em>.</p>

<p>If you're interested in software as a cultural movement - and its intersection with commerce and government - this is the book for you.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=41379&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/12/book-review-working-in-public-the-making-and-maintenance-of-open-source-software-by-nadia-eghbal/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Sometimes a bad patch is better than no patch]]></title>
		<link>https://shkspr.mobi/blog/2020/12/sometimes-a-bad-patch-is-better-than-no-patch/</link>
					<comments>https://shkspr.mobi/blog/2020/12/sometimes-a-bad-patch-is-better-than-no-patch/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 24 Dec 2020 12:01:43 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[Open Source]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=37266</guid>

					<description><![CDATA[Cunningham&#039;s Law states &#34;the best way to get the right answer on the internet is not to ask a question; it&#039;s to post the wrong answer.&#34;  Edent&#039;s 7th Law (My blog; my rules!) states &#34;the best way to get an open source project to fix an issue is to send a slightly wrong Pull Request.&#34;  Let me explain...  Two years ago, I noticed an annoying bug in the markdown parser of WordPress&#039;s JetPack plugin.  …]]></description>
										<content:encoded><![CDATA[<p>Cunningham's Law states "the best way to get the right answer on the internet is not to ask a question; it's to post the wrong answer."</p>

<p>Edent's 7th Law (My blog; my rules!) states "the best way to get an open source project to fix an issue is to send a slightly wrong Pull Request."</p>

<p>Let me explain...</p>

<p>Two years ago, I noticed an annoying bug in the markdown parser of WordPress's JetPack plugin.  I did what every good open sorcerer is supposed to do - I wrote out a comprehensive bug report, including screenshots, and <a href="https://core.trac.wordpress.org/ticket/45324">posted it in the <em>wrong</em> place</a>.</p>

<p>I didn't know it was the wrong place, but they kindly <a href="https://github.com/Automattic/jetpack/issues/10595">directed me to the right place</a>.</p>

<p>A year later and no-one had taken a look at the bug. I get it. It's low priority and they have hundreds of bugs coming in. So I added a reproduceable test case.</p>

<p><em>Another</em> year went by, and I asked for help. I am not an expert in JetPack's baroque structure and didn't fancy spending a few days trying to understand it.  With a bit of guidance, I found the correct file and submitted a patch.</p>

<p>I <em>knew</em> the PR wasn't brilliant. It had no tests, only handled a limited subset of the problem, it didn't quite conform to the project style, and was done in a bit of a rush.  But, crucially, <em>it worked</em>.  I could demonstrate that this problem could be fixed - even if I hadn't fixed it in the right way.</p>

<p>To be clear - this wasn't a malicious PR. I just didn't have the time or energy to dedicate to writing something perfect. I knew from experience that it's easier to fix a bug in the <em>right</em> way if you've seen it fixed the <em>wrong</em> way.</p>

<p>And that's what happened. The talented folks in the project - seeing that it was possible - are now creating a patch which works properly.</p>

<p>I've done this <a href="https://github.com/Automattic/jetpack/pull/17971#issue-532417633">a few times</a>. Spotted a bug, written an almost-working fix, and let people more clever than me worry about the details.</p>

<p>Don't spam open source projects with crappy PRs. Take your time to do something which works. Show that the issue is solvable. Let others with more experience finesse your code into something beautiful.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=37266&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/12/sometimes-a-bad-patch-is-better-than-no-patch/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[There's nothing I hate more than text config files]]></title>
		<link>https://shkspr.mobi/blog/2020/06/theres-nothing-i-hate-more-than-text-config-files/</link>
					<comments>https://shkspr.mobi/blog/2020/06/theres-nothing-i-hate-more-than-text-config-files/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 02 Jun 2020 11:02:12 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[Open Source]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=35162</guid>

					<description><![CDATA[I&#039;m going to revisit an argument I had in… Ooooh… 2001ish? I wanted to make some edits to my university&#039;s fledging student union website. In order to do this, I needed to learn the arcane art of SSH. This was one of my first introductions to text based config files. I was horrified! A single typo, or a stray comma could break everything. The instructions our WebMaster provided were laughably unc…]]></description>
										<content:encoded><![CDATA[<p>I'm going to revisit an argument I had in… Ooooh… 2001ish? I wanted to make some edits to my university's fledging student union website. In order to do this, I needed to learn the arcane art of SSH. This was one of my first introductions to text based config files. I was horrified! A single typo, or a stray comma could break <em>everything</em>. The instructions our WebMaster provided were laughably unclear. Manually creating a config file - and getting it right - was a chore.</p>

<p>So I downloaded <a href="https://www.chiark.greenend.org.uk/~sgtatham/putty/releases/0.51.html">PuTTY</a> and never looked back.  It had a simple GUI. Well… simple enough. It was impossible to type an IP address into a box designed for a port number, it could tell that username was unlikely to contain a non-ASCII symbol, and that made it slightly easier to configure a connection.</p>

<p>The job of the computer is to do the hard work for us.  Computers shouldn't recognise that we've made a mistake - they should stop us making mistakes in the first place!</p>

<p>Flash forward to today. I wanted to release an update to my <a href="https://www.npmjs.com/package/super-tiny-icons">NPM package of SuperTinyIcons</a> - which are hosted on GitHub.</p>

<p>I figured that I'd have to click a link on GitHub, do the OAuth dance, click on a few GUI elements, and hit a big save button.</p>

<p>Nope!</p>

<p><a href="https://help.github.com/en/actions/language-and-framework-guides/publishing-nodejs-packages">I have to create YAML text files</a>. Manually. Because it is the Year of <a href="https://www.nadiyahussain.com/">Our Lord</a> 2020 and computer engineering hasn't evolved since the earliest days of UNIX.</p>

<p>Don't get me wrong - I love the utility and versatility of the command line. I'll happily manually edit a JSON file in nano and use <code>sed</code> to update a bunch of documents. I rely on <code>diff</code> and <code>grep</code> daily.  But when it comes to configuring things - I am undone.  I don't want to learn <a href="https://yaml.org/spec/1.2/spec.html#id2777534">whitespace rules</a> just to get something working.</p>

<p>Let's take a simple example.  Here's a snippet of YAML from the official guide to releasing NPM packages via GitHub:</p>

<pre><code class="language-yaml">jobs:
  build:
    runs-on: ubuntu-latest
</code></pre>

<p>What are valid options for "runs-on"?  Where would I find them? What are the differences between them? What happens if I spell something wrong?</p>

<p>Luckily, the GUI was invented to save us from ourselves:</p>

<p><select>
    <option value="">--Please choose an option--</option>
    <option value="stop">Ubuntu Latest (This is the most common option)</option>
    <option value="reading">Grarch 3.5 (Useful if you need flargon support)</option>
    <option value="my">Plan9 (Choose this if you require Python 1)</option>
    <option value="code">Windows 3.11 (Only works on older, 16 bit projects) </option>
</select></p>

<p>M A G I C !</p>

<p>This goes for almost every element of the config file. If there are a set list of choices, present them to the user. If there is only one option, hide it. If there are two options, give them a checkbox.</p>

<p>The thing is, GitHub gets <em>part</em> of the way there. If you want to setup a webhook - you get a GUI.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/05/Screenshot_2020-05-26-edent-SuperTinyIcons1.png" alt="A GUI for creating webhooks." width="908" height="810" class="aligncenter size-full wp-image-35165">
Why does one part of GitHub offer a user-friendly way to manage configuration, and another part only provide a user-hostile environment?</p>

<p>To make it worse… <a href="https://github.blog/2020-04-15-npm-has-joined-github/">NPM IS OWNED BY GITHUB</a>!</p>

<p>I'm not saying you <em>can't</em> have a text file. I'm not trying to take your toys away from you. Have a <code>sudo</code> mode which lets user hand-stitch a config together with butterflies and a binary keyboard. Go nuts!
Want to store the config in git so you can see what changes have been made? Brilliant!
To be <em>explicitly</em> clear - <strong>store</strong> the config in a text file. But have a GUI first, and expose the text file to any masochists who want to manually replace all the tabs with spaces.</p>

<p>I just can't be bothered reading 22 thousands words of YAML spec, a further two thousands words of GitHub instructions, and - no doubt - a hundred different StackOverflow questions, just to send data from one computer to another.</p>

<p>I heard someone say that part of Amazon's success was its relentless focus on convenience.  How is manually creating fragile text files convenient for me?</p>

<p>We have to stop this fetishization of the text file as the primary method for configuring computers.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=35162&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/06/theres-nothing-i-hate-more-than-text-config-files/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Feature Request for GitHub - commit *as* an organisation]]></title>
		<link>https://shkspr.mobi/blog/2020/05/feature-request-for-github-commit-as-an-organisation/</link>
					<comments>https://shkspr.mobi/blog/2020/05/feature-request-for-github-commit-as-an-organisation/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 15 May 2020 11:45:08 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[github]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=34977</guid>

					<description><![CDATA[There was a &#34;situation&#34; at work. We were publishing a high-profile project (take  a wild guess) on GitHub. We had received abuse and were worried that someone might target the programmers who worked on the project. Obviously, we take cyber-security seriously, but how do we deal with personal-security?  Here are the options we considered:   Get everyone to sign up for a secondary GitHub account to …]]></description>
										<content:encoded><![CDATA[<p>There was a "situation" at work. We were publishing a high-profile project (take  a wild guess) on GitHub. We had received abuse and were worried that someone might target the programmers who worked on the project. Obviously, we take cyber-security seriously, but how do we deal with personal-security?</p>

<p>Here are the options we considered:</p>

<ul>
<li>Get everyone to sign up for a secondary GitHub account to use for this project.</li>
<li>Redact the history so no-one could see personal information.</li>
<li>Use the same GitHub credentials for everyone.</li>
</ul>

<p>There are problems with all the above approaches. Additional accounts are a huge administrative and cognitive burden. Scrubbing the history on publication doesn't facilitate transparency.  And sharing login details? Yeuch!</p>

<p>So what could we do?</p>

<p>GitHub has a nifty feature - <a href="https://github.blog/changelog/2019-03-15-creating-a-commit-on-behalf-of-an-organization/">it allows you to commit <em>on-behalf-of</em> an organisation</a>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/05/github-commit-organization.png" alt="A GitHub commit message with a badge saying it was committed on behalf of some organisation." width="652" height="200" class="aligncenter size-full wp-image-34979">

<p>With a simple change to your commit message, you can show that you're working on behalf of an organisation. Handy if you want to separate your commits into personal and professional. Or if you're a member of multiple organisations.</p>

<p>Here's what we wanted - publish <em>as</em> an organisation!</p>

<p>I'd like to sketch out how this might work - then I'd like some criticism from you on why it's bad idea.</p>

<h2 id="user-story"><a href="https://shkspr.mobi/blog/2020/05/feature-request-for-github-commit-as-an-organisation/#user-story">User Story</a></h2>

<ul>
<li>As an <strong>@Organisation</strong> on GitHub</li>
<li>With a <strong>team</strong> of <strong>authorised members</strong></li>
<li>I want all the public commits from the <strong>team</strong> to show as coming from the <strong>@Organisation</strong></li>
<li>So that I can preserve the privacy of the <strong>authorised members</strong></li>
</ul>

<p>(This could also work by committing as the <strong>team</strong>.)</p>

<h2 id="practicalities"><a href="https://shkspr.mobi/blog/2020/05/feature-request-for-github-commit-as-an-organisation/#practicalities">Practicalities</a></h2>

<ul>
<li>Add a team to GitHub</li>
<li>Populate it with members</li>
<li>Flick on this option:

<ul>
<li><input type="checkbox" id="ghtest"><label for="ghtest"> Enable commit privacy. All commits will show as from @Organisation.</label></li>
</ul></li>
</ul>

<p>Any member of the team can see that <em>this</em> commit came from Alice and <em>that</em> commit came from Bob. But people outside the team would just see both of those commits coming directly from the organisation.</p>

<p>This enables the team to see who made which changes, but keeps it private for everyone else.</p>

<h2 id="downsides"><a href="https://shkspr.mobi/blog/2020/05/feature-request-for-github-commit-as-an-organisation/#downsides">Downsides</a></h2>

<p>Does this lull developers into a false sense of security? If the commit message still says "Asked to add this by @alice. Yours sincerely, @bob" then privacy is compromised.</p>

<p>Is this even possible with the git protocol? Teams are a part of Git<em>Hub</em> - but I don't think they're part of the specification. Would this screw up the cryptographic signing of commits?</p>

<p>Part of open source is transparency. Do we want to lose that?</p>

<p>GitHub would be able to de-anonymise you. But you're already trusting them with parts of your infrastructure anyway.</p>

<h2 id="your-thoughts"><a href="https://shkspr.mobi/blog/2020/05/feature-request-for-github-commit-as-an-organisation/#your-thoughts">Your thoughts?</a></h2>

<p>Is this useful - or am I barking up the wrong tree?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=34977&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/05/feature-request-for-github-commit-as-an-organisation/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[OpenBenches is a recipient of a Microgrant!]]></title>
		<link>https://shkspr.mobi/blog/2020/01/openbenches-is-a-recipient-of-a-microgrant/</link>
					<comments>https://shkspr.mobi/blog/2020/01/openbenches-is-a-recipient-of-a-microgrant/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 08 Jan 2020 08:20:43 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<category><![CDATA[Trade Union]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=33766</guid>

					<description><![CDATA[We&#039;re delighted to announce that our OpenBenches.org project has been awarded a $250 microgrant from Icculus!  Ryan C. Gordon@icculusGoogle gave me an award for my contributions to Linux gaming and open source, and while I’m honored to be acknowledged, I can’t accept money from a company that is actively engaging in union busting.❤️ 2,934💬 0🔁 48402:20 - Wed 25 December 2019Ryan C. Gordon@icculu…]]></description>
										<content:encoded><![CDATA[<p>We're delighted to announce that our <a href="https://OpenBenches.org">OpenBenches.org</a> project has been awarded a <a href="https://icculus.org/microgrant2019/">$250 microgrant from Icculus</a>!</p>

<blockquote class="social-embed" id="social-embed-1209660053332082690" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><blockquote class="social-embed" id="social-embed-1209660051645972481" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/icculus" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRh4DAABXRUJQVlA4IBIDAABQDQCdASowADAAPrVKnUonJCKhsdmYAOAWiUAW/jG7CJAT09/NcKtnrEa73UwVw0qnmbeRv6c1EZefnNQQ6AFybExGlaSubkNhiyMmDWxePfuD3VV8kQLE2svLr8okqBU/DCTdtlcPg5PfRAmSYfZ/Yi8QAP74saAEl74jfz6tAZidx6XmCQGkhsWgikuTEz2n2Q+aMlmbi+hO8IoheuvXpTx/+yO/QHl0oEb3b8nYrvYOmdlfe/vtRlGm/7m7foDwbH1jtRtHS4qM5qBRs+/ZyoOrYTUJ49XO8OvuCJd9OIDddedc4dbsx63ybLI810nXVdZqSKQ8LjkFCZ8pknmMltKbN+LQNkRfzktoy+Fk7tweBZf1+G9CWw8EbQlnGD/jXG366V3Neb1QZiCAai5SYD9750j2d6P4zp0P1O88fTHXbEoci4fLoLs1A1Kn9//wYac+fiGsuFxt+f+7eKWWF0tipwuIYIArcPJ8VL0db9587BzO5IOVHKeZGPiKYWZO6Jpv5MFhzcLWqJMNVuptAyJODYNfHK/E9iWCJ/O+0yQ1K0ufLf5JnpApuQ062eZpP9VlP2LCc1Il6GnP/48Ca4fp6SYqsZw/7dn+alO9H9MMdGytjX2N17FYk9htmW/L5IIZYU4pwex4kwIBicfGLajfxvaIBDE9l9JNZ3AuIYQH8M0c8r70dNQreeDeFwKzPQ1Es0wFISn//P/madJQNvK8qrMos8hXShfU/0OCKFUutbJ+9D7kgOAFtOC4rAUZ/d7WGjQNyACoshAMQVeH3CyAR4//160sIVD7xLp1rWnkWxW1KX83+JtavEODOH2qfDXfGZgf8IPUJX7EVBKolukQkxKkLmbkQ8EG8y5NQsAUfJknLaddHmPbcmI3/ynrrXmz/a/2s6Z3psYYBG7hd1anoE7I4H3kRD4alb7uUDbT8XwATos1kSMbmwr3mFBBPWmJPEn7t33+e8mZHoMYEIlSqdVBgglfvYJZt2HyCfkkwn6iz5cW07PsuI1CWI2Qu9EpCOrKJsB1HG9vxa5uAAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Ryan C. Gordon</p>@icculus</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Google gave me an award for my contributions to Linux gaming and open source, and while I’m honored to be acknowledged, I can’t accept money from a company that is actively engaging in union busting.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/icculus/status/1209660051645972481"><span aria-label="2934 likes" class="social-embed-meta">❤️ 2,934</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="484 reposts" class="social-embed-meta">🔁 484</span><time datetime="2019-12-25T02:20:05.000Z" itemprop="datePublished">02:20 - Wed 25 December 2019</time></a></footer></blockquote><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/icculus" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRh4DAABXRUJQVlA4IBIDAABQDQCdASowADAAPrVKnUonJCKhsdmYAOAWiUAW/jG7CJAT09/NcKtnrEa73UwVw0qnmbeRv6c1EZefnNQQ6AFybExGlaSubkNhiyMmDWxePfuD3VV8kQLE2svLr8okqBU/DCTdtlcPg5PfRAmSYfZ/Yi8QAP74saAEl74jfz6tAZidx6XmCQGkhsWgikuTEz2n2Q+aMlmbi+hO8IoheuvXpTx/+yO/QHl0oEb3b8nYrvYOmdlfe/vtRlGm/7m7foDwbH1jtRtHS4qM5qBRs+/ZyoOrYTUJ49XO8OvuCJd9OIDddedc4dbsx63ybLI810nXVdZqSKQ8LjkFCZ8pknmMltKbN+LQNkRfzktoy+Fk7tweBZf1+G9CWw8EbQlnGD/jXG366V3Neb1QZiCAai5SYD9750j2d6P4zp0P1O88fTHXbEoci4fLoLs1A1Kn9//wYac+fiGsuFxt+f+7eKWWF0tipwuIYIArcPJ8VL0db9587BzO5IOVHKeZGPiKYWZO6Jpv5MFhzcLWqJMNVuptAyJODYNfHK/E9iWCJ/O+0yQ1K0ufLf5JnpApuQ062eZpP9VlP2LCc1Il6GnP/48Ca4fp6SYqsZw/7dn+alO9H9MMdGytjX2N17FYk9htmW/L5IIZYU4pwex4kwIBicfGLajfxvaIBDE9l9JNZ3AuIYQH8M0c8r70dNQreeDeFwKzPQ1Es0wFISn//P/madJQNvK8qrMos8hXShfU/0OCKFUutbJ+9D7kgOAFtOC4rAUZ/d7WGjQNyACoshAMQVeH3CyAR4//160sIVD7xLp1rWnkWxW1KX83+JtavEODOH2qfDXfGZgf8IPUJX7EVBKolukQkxKkLmbkQ8EG8y5NQsAUfJknLaddHmPbcmI3/ynrrXmz/a/2s6Z3psYYBG7hd1anoE7I4H3kRD4alb7uUDbT8XwATos1kSMbmwr3mFBBPWmJPEn7t33+e8mZHoMYEIlSqdVBgglfvYJZt2HyCfkkwn6iz5cW07PsuI1CWI2Qu9EpCOrKJsB1HG9vxa5uAAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Ryan C. Gordon</p>@icculus</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/icculus/status/1209660051645972481">Replying to @icculus</a></small>When I agreed to the award, I hadn’t heard about <a href="https://twitter.com/eiais">@eiais</a>’s firing, or any of the others. It’s not much money, but I don’t think quantity is relevant.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/icculus/status/1209660053332082690"><span aria-label="194 likes" class="social-embed-meta">❤️ 194</span><span aria-label="3 replies" class="social-embed-meta">💬 3</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2019-12-25T02:20:05.000Z" itemprop="datePublished">02:20 - Wed 25 December 2019</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1209660057614454784" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><blockquote class="social-embed" id="social-embed-1209660055160840193" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/icculus" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRh4DAABXRUJQVlA4IBIDAABQDQCdASowADAAPrVKnUonJCKhsdmYAOAWiUAW/jG7CJAT09/NcKtnrEa73UwVw0qnmbeRv6c1EZefnNQQ6AFybExGlaSubkNhiyMmDWxePfuD3VV8kQLE2svLr8okqBU/DCTdtlcPg5PfRAmSYfZ/Yi8QAP74saAEl74jfz6tAZidx6XmCQGkhsWgikuTEz2n2Q+aMlmbi+hO8IoheuvXpTx/+yO/QHl0oEb3b8nYrvYOmdlfe/vtRlGm/7m7foDwbH1jtRtHS4qM5qBRs+/ZyoOrYTUJ49XO8OvuCJd9OIDddedc4dbsx63ybLI810nXVdZqSKQ8LjkFCZ8pknmMltKbN+LQNkRfzktoy+Fk7tweBZf1+G9CWw8EbQlnGD/jXG366V3Neb1QZiCAai5SYD9750j2d6P4zp0P1O88fTHXbEoci4fLoLs1A1Kn9//wYac+fiGsuFxt+f+7eKWWF0tipwuIYIArcPJ8VL0db9587BzO5IOVHKeZGPiKYWZO6Jpv5MFhzcLWqJMNVuptAyJODYNfHK/E9iWCJ/O+0yQ1K0ufLf5JnpApuQ062eZpP9VlP2LCc1Il6GnP/48Ca4fp6SYqsZw/7dn+alO9H9MMdGytjX2N17FYk9htmW/L5IIZYU4pwex4kwIBicfGLajfxvaIBDE9l9JNZ3AuIYQH8M0c8r70dNQreeDeFwKzPQ1Es0wFISn//P/madJQNvK8qrMos8hXShfU/0OCKFUutbJ+9D7kgOAFtOC4rAUZ/d7WGjQNyACoshAMQVeH3CyAR4//160sIVD7xLp1rWnkWxW1KX83+JtavEODOH2qfDXfGZgf8IPUJX7EVBKolukQkxKkLmbkQ8EG8y5NQsAUfJknLaddHmPbcmI3/ynrrXmz/a/2s6Z3psYYBG7hd1anoE7I4H3kRD4alb7uUDbT8XwATos1kSMbmwr3mFBBPWmJPEn7t33+e8mZHoMYEIlSqdVBgglfvYJZt2HyCfkkwn6iz5cW07PsuI1CWI2Qu9EpCOrKJsB1HG9vxa5uAAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Ryan C. Gordon</p>@icculus</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/icculus/status/1209660053332082690">Replying to @icculus</a></small>As such: I’m announcing the 2019 Icculus Microgrant. If you have a cool open source project, reply here about it and the one I like best, I’ll give $250 dollars. Do whatever you want with the money. I’ll try to pick one this week.<br><br>If anyone wants to match my donation, DM me.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/icculus/status/1209660055160840193"><span aria-label="344 likes" class="social-embed-meta">❤️ 344</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="87 reposts" class="social-embed-meta">🔁 87</span><time datetime="2019-12-25T02:20:06.000Z" itemprop="datePublished">02:20 - Wed 25 December 2019</time></a></footer></blockquote><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/icculus" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRh4DAABXRUJQVlA4IBIDAABQDQCdASowADAAPrVKnUonJCKhsdmYAOAWiUAW/jG7CJAT09/NcKtnrEa73UwVw0qnmbeRv6c1EZefnNQQ6AFybExGlaSubkNhiyMmDWxePfuD3VV8kQLE2svLr8okqBU/DCTdtlcPg5PfRAmSYfZ/Yi8QAP74saAEl74jfz6tAZidx6XmCQGkhsWgikuTEz2n2Q+aMlmbi+hO8IoheuvXpTx/+yO/QHl0oEb3b8nYrvYOmdlfe/vtRlGm/7m7foDwbH1jtRtHS4qM5qBRs+/ZyoOrYTUJ49XO8OvuCJd9OIDddedc4dbsx63ybLI810nXVdZqSKQ8LjkFCZ8pknmMltKbN+LQNkRfzktoy+Fk7tweBZf1+G9CWw8EbQlnGD/jXG366V3Neb1QZiCAai5SYD9750j2d6P4zp0P1O88fTHXbEoci4fLoLs1A1Kn9//wYac+fiGsuFxt+f+7eKWWF0tipwuIYIArcPJ8VL0db9587BzO5IOVHKeZGPiKYWZO6Jpv5MFhzcLWqJMNVuptAyJODYNfHK/E9iWCJ/O+0yQ1K0ufLf5JnpApuQ062eZpP9VlP2LCc1Il6GnP/48Ca4fp6SYqsZw/7dn+alO9H9MMdGytjX2N17FYk9htmW/L5IIZYU4pwex4kwIBicfGLajfxvaIBDE9l9JNZ3AuIYQH8M0c8r70dNQreeDeFwKzPQ1Es0wFISn//P/madJQNvK8qrMos8hXShfU/0OCKFUutbJ+9D7kgOAFtOC4rAUZ/d7WGjQNyACoshAMQVeH3CyAR4//160sIVD7xLp1rWnkWxW1KX83+JtavEODOH2qfDXfGZgf8IPUJX7EVBKolukQkxKkLmbkQ8EG8y5NQsAUfJknLaddHmPbcmI3/ynrrXmz/a/2s6Z3psYYBG7hd1anoE7I4H3kRD4alb7uUDbT8XwATos1kSMbmwr3mFBBPWmJPEn7t33+e8mZHoMYEIlSqdVBgglfvYJZt2HyCfkkwn6iz5cW07PsuI1CWI2Qu9EpCOrKJsB1HG9vxa5uAAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Ryan C. Gordon</p>@icculus</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/icculus/status/1209660055160840193">Replying to @icculus</a></small>(If I don’t get any good projects, I’ll buy 250 bucks worth of pizza for the next Google organizing  meeting or something. But if you’re proud of your project, tiny or not, that should be all you need to tweet it at me. Good luck!)</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/icculus/status/1209660057614454784"><span aria-label="164 likes" class="social-embed-meta">❤️ 164</span><span aria-label="3 replies" class="social-embed-meta">💬 3</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2019-12-25T02:20:06.000Z" itemprop="datePublished">02:20 - Wed 25 December 2019</time></a></footer></blockquote>

<p>Huge thanks to Ryan, and everyone else who chipped in.</p>

<p>Because I'm part of <a href="https://github.com/sponsors/edent">GitHub Sponsors</a>, the donation will be matched by GitHub.</p>

<p>So, that's US$500 - about £375. Nice!</p>

<p>If you'd like to sponsor us, you can do so on <a href="https://github.com/sponsors/edent">GitHub</a> or via <a href="https://paypal.me/edent/gbp10">PayPal directly</a>. Or, we have an <a href="https://www.amazon.co.uk/hz/wishlist/ls/13GFCFR2B2IX4?type=wishlist&amp;linkCode=sl2&amp;tag=shksprblogwish-21">Amazon wishlist</a> if you'd like to get us a physical present.</p>

<h2 id="what-will-we-spend-the-grant-on"><a href="https://shkspr.mobi/blog/2020/01/openbenches-is-a-recipient-of-a-microgrant/#what-will-we-spend-the-grant-on">What will we spend the grant on?</a></h2>

<p>This is what we said we'd use the money for:</p>

<blockquote class="social-embed" id="social-embed-1209755670008025089" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/icculus/status/1209660055160840193">Replying to @icculus</a></small><a href="https://twitter.com/icculus">@icculus</a> <a href="https://twitter.com/mjg59">@mjg59</a> My wife and I run <a href="https://openbenches.org/">openbenches.org</a><br>It's an open source / open data project which crowdsources photos of memorial benches.<br>$250 would allow us to move away from Google's OCR engine, and on to a faster web host.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1209755670008025089"><span aria-label="1 likes" class="social-embed-meta">❤️ 1</span><span aria-label="1 replies" class="social-embed-meta">💬 1</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2019-12-25T08:40:02.000Z" itemprop="datePublished">08:40 - Wed 25 December 2019</time></a></footer></blockquote>

<p>No one is auditing us, so we could spend it all on a luxury holiday to Bognor Regis. But we won't!</p>

<p>Although... <a href="https://openbenches.org/location/United%20Kingdom/West%20Sussex/Bognor%20Regis">There are a <em>lot</em> of unmapped benches in Bognor</a>...</p>

<h2 id="the-web-is-cheap"><a href="https://shkspr.mobi/blog/2020/01/openbenches-is-a-recipient-of-a-microgrant/#the-web-is-cheap">The web is cheap!</a></h2>

<p>Don't tell anyone who wants to give us money, but it's quite cheap to run a niche site on the web!</p>

<p>We're lucky to be in the free tier of our 3rd party providers:</p>

<ul>
<li><a href="https://opencagedata.com/">OpenCage</a> provides the reverse geocoding, and is free for 2,500 calls per day.</li>
<li><a href="https://www.cloudimage.io/">CloudImage</a> is free for small projects.</li>
<li><a href="https://auth0.com/">Auth0</a> does social login - and offers more features free for Open Source projects.</li>
<li><a href="https://www.mapbox.com/">MapBox</a> renders beautiful OpenStreetMap tiles for free, up to 50,000 per month.</li>
<li><a href="https://cloud.google.com/vision/pricing">Google Cloud Vision</a> we're just about within their 1,000 free scans per month limit.</li>
</ul>

<p>We've occasionally gone over those free limits, so will keep a couple of quid in reserve in case of a surge in our popularity.</p>

<p>Our major cost is hosting. We paid £300 for 3 years of shared hosting with <a href="https://krystal.uk/">Krystal.uk</a> - use code <code>EDENT</code> at checkout and we both get a fiver.</p>

<p>That hosting deal runs out in August this year, so the bulk of the grant will go to upgrading our package to something a bit bigger. Notably, we're capped at 2GB of RAM which we seem to regularly max out.</p>

<p>Because we have over 130GB of photos, we'll probably stay with Krystal - unless anyone knows of a UK based hosting provider with <a href="https://krystal.uk/green">impeccable green credentials</a>?</p>

<p>In the spirit of the grant, we'll look at moving away from Google's Cloud Vision.  Current contenders are</p>

<ol>
<li><a href="https://docs.aws.amazon.com/rekognition/latest/dg/text-detection.html">Amazon Rekognition</a>

<ul>
<li>Although they're just as ethically dubious</li>
</ul></li>
<li><a href="https://azure.microsoft.com/en-gb/services/cognitive-services/computer-vision/">Microsoft's Computer Vision</a>

<ul>
<li>Ditto!</li>
</ul></li>
<li>The Open Source <a href="https://github.com/tesseract-ocr/tesseract">Tesseract OCR</a>

<ul>
<li>Which is sponsored by Google...</li>
</ul></li>
</ol>

<p>Suggestions very welcome!</p>

<h2 id="unions"><a href="https://shkspr.mobi/blog/2020/01/openbenches-is-a-recipient-of-a-microgrant/#unions">Unions</a></h2>

<p>Regular readers will know that I'm a proud member of <a href="https://prospect.org.uk/">Prospect - the union for ambition</a>.   As a professional knowledge-worker, I rely on my union to provide me with legal services and support me in pay negotiations. If you're in the UK and want to be part of a union for professionals - <a href="https://prospect.org.uk/join/">join Prospect today</a>.</p>

<p>If you join Prospect, and mention my name, <a href="https://prospect.org.uk/mrm/">I'll make a £10 donation to charity</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=33766&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/01/openbenches-is-a-recipient-of-a-microgrant/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[HOWTO: Add sponsorship to a GitHub project]]></title>
		<link>https://shkspr.mobi/blog/2019/05/howto-add-sponsorship-to-a-github-project/</link>
					<comments>https://shkspr.mobi/blog/2019/05/howto-add-sponsorship-to-a-github-project/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 30 May 2019 11:02:00 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[Open Source]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=32227</guid>

					<description><![CDATA[I&#039;ve just seen that I can now add sponsorship to my GitHub projects.  Here&#039;s a quick guide to how it works:  Repo settings  There&#039;s now a new option in your repository settings. Tick the box and click the button. Easy!   WTF is YAML?  This is a bit of a weird one. To set up sponsorship, you have to hand-edit a YAML text file.  I would have expected this to be a easy to use GUI. Or something to…]]></description>
										<content:encoded><![CDATA[<p>I've just seen that I can now add sponsorship to my <a href="https://github.com/edent/">GitHub projects</a>.</p>

<p>Here's a quick guide to how it works:</p>

<h2 id="repo-settings"><a href="https://shkspr.mobi/blog/2019/05/howto-add-sponsorship-to-a-github-project/#repo-settings">Repo settings</a></h2>

<p>There's now a new option in your repository settings. Tick the box and click the button. Easy!
<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/05/Sponsorship-option.png" alt="A new option - big green button for adding sponsorship." width="725" height="189" class="aligncenter size-full wp-image-32231"></p>

<h2 id="wtf-is-yaml"><a href="https://shkspr.mobi/blog/2019/05/howto-add-sponsorship-to-a-github-project/#wtf-is-yaml">WTF is YAML?</a></h2>

<p>This is a bit of a weird one. To set up sponsorship, you have to hand-edit a <a href="https://yaml.org/">YAML text file</a>.  I would have expected this to be a easy to use GUI. Or something to OAuth with payment providers. Oh well, it does the job.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/05/YAML.png" alt="Yaml - a text interface." width="1003" height="330" class="aligncenter size-full wp-image-32230">

<p>You can add up to four GitHub contributors. Handy if multiple people work on your project. Limit seems a bit low though.</p>

<p>The file is stored in <code>/.github/FUNDING.yml</code> if you want to change it.  If you screw up the formatting, there are no error messages and the sponsorship button won't appear.</p>

<h2 id="new-buttons"><a href="https://shkspr.mobi/blog/2019/05/howto-add-sponsorship-to-a-github-project/#new-buttons">New buttons!</a></h2>

<p>At the top of your repo, there will be a new ❤️ button - next to the watch, stars, and fork buttons.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/05/Button.png" alt="A heart button next to the fork button." width="980" height="28" class="aligncenter size-full wp-image-32229"></p>

<p>Click it, and you'll get a pop-up with the options you've set.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/05/Screenshot_2019-05-30-edent-openbenches1.png" alt="Sponsorship options for OpenBenches." width="448" height="338" class="aligncenter size-full wp-image-32235"></p>

<p>The GitHub sponsorship doesn't show up for me - I'm on a wait-list I think - but you can link out to:</p>

<ul>
<li><a href="https://patreon.com/edent">Patreon</a> - the big name in sponsoring creators.</li>
<li><a href="https://Ko-Fi.com/edent">Ko-Fi</a> - a UK based company which uses PayPal.</li>
<li><a href="https://opencollective.com/edent">Open Collective</a> - an open source friendly payment provider</li>
<li><a href="https://tidelift.com/">tidelift</a> - another open source funder.</li>
<li><a href="https://communitybridge.org/">Community Bridge</a> - developed by the Linux foundation.</li>
<li>Custom - I used an <a href="https://www.amazon.co.uk/hz/wishlist/ls/13GFCFR2B2IX4?type=wishlist&amp;linkCode=sl2&amp;tag=shksprblogwish-21">Amazon Wishlist</a> - but you can also use Venmo or any other service which lets you craft payment URLs.  For example <a href="https://liberapay.com/edent">Liberapay</a>, or a <a href="https://paypal.me/edent/gbp5">PayPal link</a>. You can't set a custom name for the custom URL.</li>
</ul>

<p>That's a pretty good list to start. Only time will tell if it drives people to pay for open source contributors.</p>

<p>There's no way to add the same sponsorship details to every repo you have - so there's a lot of copy &amp; pasting needed.</p>

<p>Anyway, please <a href="https://github.com/edent/openbenches">sponsor OpenBenches</a> or any of the other Open Source stuff I do!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=32227&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/05/howto-add-sponsorship-to-a-github-project/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Harvesting phone numbers and email addresses from GitHub]]></title>
		<link>https://shkspr.mobi/blog/2019/01/harvesting-phone-numbers-and-email-addresses-from-github/</link>
					<comments>https://shkspr.mobi/blog/2019/01/harvesting-phone-numbers-and-email-addresses-from-github/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 08 Jan 2019 12:10:05 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[privacy]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=31036</guid>

					<description><![CDATA[Code-sharing site GitHub automatically sends email notifications to users.  If you&#039;ve commented on an issue, you&#039;ll get an email each time there&#039;s an update. That&#039;s pretty handy.  It also allows users to reply by email.  The reply is then automatically posted in the issue thread.  Also handy. But a little dangerous.  Lots of people have email signatures which contain personal details. When these…]]></description>
										<content:encoded><![CDATA[<p>Code-sharing site <a href="https://github.com/">GitHub</a> automatically sends email notifications to users.  If you've commented on an issue, you'll get an email each time there's an update. That's pretty handy.</p>

<p>It also allows users to <em>reply</em> by email.  The reply is then automatically posted in the issue thread.  Also handy. But a little dangerous.</p>

<p>Lots of people have <a href="https://en.wikipedia.org/wiki/Signature_block">email signatures</a> which contain personal details. When these people reply to a GitHub notification they may unwillingly share their contact details in public.</p>

<p>GitHub does a reasonable job of hiding this from the casual observer. When it detects the signature block, it hides it behind a button.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/01/GitHub-email-sig.png" alt="A GitHub issue. There is an &quot;overflow&quot; button onscreen." width="792" height="225" class="aligncenter size-full wp-image-31038">

<p>What happens if you click on that overflow button?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/01/GitHub-email-sig-redacted.png" alt="A user's email signature - the phone number has been blurred out." width="792" height="428" class="aligncenter size-full wp-image-31037">

<p>I've manually redacted the user's details.</p>

<h2 id="finding-numbers"><a href="https://shkspr.mobi/blog/2019/01/harvesting-phone-numbers-and-email-addresses-from-github/#finding-numbers">Finding Numbers</a></h2>

<p>A quick search for common email signatures like "This email and any attachments are confidential" reveals thousands of issues like this. Many have phone, fax, and postal details of the user.</p>

<p>Searching GitHub issues for <code>"This email and any attachments" &amp; "+44(0)"</code> gives a hundred or so results - mostly from UK individuals replying to emails.</p>

<p>Similar searches for other formats of phone numbers reveal thousands of potential accidental leaks.</p>

<h2 id="what-should-github-do"><a href="https://shkspr.mobi/blog/2019/01/harvesting-phone-numbers-and-email-addresses-from-github/#what-should-github-do">What should GitHub do?</a></h2>

<p>GitHub can obviously detect when a reply is an email - and includes an icon on the issues screen to show the user.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/01/Comment-left-by-email.png" alt="A comment on GitHub, there's an email icon next to the user name." width="792" height="637" class="aligncenter size-full wp-image-31040">

<p>The signature detection isn't perfect - in the above example it hasn't recognised it.</p>

<p>GitHub <em>could</em> proactively scan incoming emails and offer to redact personal info from them.</p>

<p>Repository owners can also edit comments to make sure that personal data hasn't accidentally leaked.</p>

<p>This isn't just an issue of personal responsibility. When you receive an email, it is natural to reply. You may not even realise you have a corporately mandated signature. You may not know how to remove it. There's nothing in the email that suggests replying will post your details in public.</p>

<p>Yes, people should take a little more care - but I think GitHub should do a better job of detecting and deleting personal information.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=31036&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/01/harvesting-phone-numbers-and-email-addresses-from-github/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Redirect GitHub ID to Username]]></title>
		<link>https://shkspr.mobi/blog/2018/11/redirect-github-id-to-username/</link>
					<comments>https://shkspr.mobi/blog/2018/11/redirect-github-id-to-username/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 22 Nov 2018 12:01:00 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=30651</guid>

					<description><![CDATA[Scratching my own itch here...  GitHub users have a username (mine is @edent) and have a user ID number (mine is #837136).  If you want to redirect a user ID to a username, you can use the little service I&#039;ve cobbled together:  https://edent.github.io/github_id/#837136  That will take your browser to my GitHub page, using nothing but my ID.  Why?   Some login services only give you the GitHub…]]></description>
										<content:encoded><![CDATA[<p>Scratching my own itch here...</p>

<p>GitHub users have a username (mine is <code>@edent</code>) <em>and</em> have a user ID number (mine is <code>#837136</code>).</p>

<p>If you want to redirect a user ID to a username, you can use the little service I've cobbled together:</p>

<p><a href="https://edent.github.io/github_id/#837136">https://edent.github.io/github_id/#837136</a></p>

<p>That will take your browser to my GitHub page, using nothing but my ID.</p>

<h2 id="why"><a href="https://shkspr.mobi/blog/2018/11/redirect-github-id-to-username/#why">Why?</a></h2>

<ul>
<li>Some login services only give you the GitHub user's ID.</li>
<li>GitHub users can change their username - but their ID stays the same.</li>
</ul>

<h2 id="how"><a href="https://shkspr.mobi/blog/2018/11/redirect-github-id-to-username/#how">How?</a></h2>

<p>Inspired by <a href="http://caius.name/">Caius Durling</a>'s useful <a href="http://caius.github.io/github_id/">GitHub username to ID</a> service.</p>

<p>Mine is a scrap of JavaScript which uses <a href="https://api.github.com/user/837136">this undocumented endpoint</a> to get user info.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/10/GitHub-API-fs8.png" alt="A screen of JSON code showing my details." width="596" height="354" class="aligncenter size-full wp-image-30652">

<pre><code class="language-javascript">&lt;script type="text/javascript" charset="utf-8"&gt;
function get_github_name_for(id) {
    $.getJSON('https://api.github.com/user/' + id + "?callback=?", 
    function(json){
        var github_user_url = json["data"]["html_url"]
        window.location.replace(github_user_url)
        return false
    });
}
$(document).ready(function() {
    if (document.location.hash) {
        var id = document.location.hash.match(/^#(.*?)$/)[1]
        get_github_name_for(id)
    }
});
&lt;/script&gt;
</code></pre>

<p>Feel free to copy it, or use <a href="https://edent.github.io/github_id/#837136">https://edent.github.io/github_id/#837136</a> as a handy little webservice.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=30651&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2018/11/redirect-github-id-to-username/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Self-inflicted Denial of Service on GitHub (Disclosed)]]></title>
		<link>https://shkspr.mobi/blog/2017/02/self-inflicted-denial-of-service-on-github-disclosed/</link>
					<comments>https://shkspr.mobi/blog/2017/02/self-inflicted-denial-of-service-on-github-disclosed/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 14 Feb 2017 07:36:16 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Bug Bounty]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[hacking]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=24801</guid>

					<description><![CDATA[I&#039;ve found an interesting, but low severity, way for a malicious user to selectively deny access to specific GitHub issues and Pull Requests.  This doesn&#039;t affect the whole site - just targeted pages. It doesn&#039;t require elevated permissions, nor any special skills. This is just GitHub punching itself in the face.  Here&#039;s how it works.       An attacker creates thousands of comments in their own…]]></description>
										<content:encoded><![CDATA[<p>I've found an interesting, but low severity, way for a malicious user to selectively deny access to specific GitHub issues and Pull Requests.</p>

<p>This doesn't affect the whole site - just targeted pages. It doesn't require elevated permissions, nor any special skills. This is just GitHub punching itself in the face.</p>

<p>Here's how it works.</p>

<ul>
    <li>An attacker creates <i>thousands</i> of comments in their own repos which contain references to a specific issue or PR in an external repo.</li>
    <li>When that issue or PR page is loaded, GitHub tries to render every single reference from all repos.</li>
    <li>This <i>often</i> makes the page completely unavailable (Unicorn Error) and <i>always</i> slows down page loading and rendering time.</li>
    <li>Site owners are unable to remove the malicious links, leading to a either permanent degradation of page loading time, or a page which can never be loaded.</li>
</ul>

<h2 id="uses"><a href="https://shkspr.mobi/blog/2017/02/self-inflicted-denial-of-service-on-github-disclosed/#uses">Uses</a></h2>

<p>Suppose a GitHub issue is talking about a security vulnerability - a malicious actor can deny access to that page.</p>

<p>Similarly, a competitor can disrupt your normal GitHub workflow.</p>

<p>Users on slow / mobile Internet connections will have a markedly worse experience accessing pages.</p>

<h2 id="examples"><a href="https://shkspr.mobi/blog/2017/02/self-inflicted-denial-of-service-on-github-disclosed/#examples">Examples</a></h2>

<p>A good source of examples is the Linux Kernel.</p>

<p>Take a look at <a href="https://github.com/torvalds/linux/pull/12">Pull Request #12</a>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/02/Screen-Shot-2017-02-14-at-10.12.30.png" alt="Linux PR on GitHub showing a timeout" width="836" height="518" class="aligncenter size-full wp-image-24808">

<p>(Edit - this page now appears fixed and no longer times out.)</p>

<p>Most of the time, the page fails to load. When it does load, it renders slowly on desktop. At the bottom are <b>hundreds</b> of links to places which <i>appear</i> to refer back to this. But they don't! Instead, the comments often contain lists of numbers like:</p>

<pre><code>#5 ffffffff812a12de (____fput+0x1e/0x30)
#6 ffffffff8111708d (task_work_run+0x10d/0x140)
#7 ffffffff810ea043 (do_exit+0x433/0x11f0)
#8 ffffffff810eaee4 (do_group_exit+0x84/0x130)
</code></pre>

<p>GitHub gets confused and thinks that those numbers refer to an Issue or Pull Request.</p>

<p>When it tries to render the page, it can timeout while gathering all of the comments which appear to be links.</p>

<p>In my experiments I found dozens of pages which repeatedly gave timeout errors.</p>

<h2 id="severity-and-disclosure"><a href="https://shkspr.mobi/blog/2017/02/self-inflicted-denial-of-service-on-github-disclosed/#severity-and-disclosure">Severity and Disclosure</a></h2>

<p>This is a low impact bug.</p>

<p>When there are thousands of comments across dozens of repositories, gathering all references can be time consuming. Once the servers have managed to successfully render the page, it reduces the likelihood of the page being blocked again.</p>

<p>I reported it via <a href="https://hackerone.com/">HackerOne</a> on the 13th of February. The next day GitHub responded:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/02/wp-1487056528520.png" alt="" class="wp-image-24800 alignnone size-full" width="1381" height="422">

<p>In the meantime, there isn't much you can do to protect yourself. There's no way to bulk remove malicious references.</p>

<p>On GitHub's side, they should be truncating pages before a timeout occurs. They already do this on mobile - perhaps it should be standard everywhere?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=24801&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2017/02/self-inflicted-denial-of-service-on-github-disclosed/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[An API for Amazon Wishlists]]></title>
		<link>https://shkspr.mobi/blog/2015/11/an-api-for-amazon-wishlists/</link>
					<comments>https://shkspr.mobi/blog/2015/11/an-api-for-amazon-wishlists/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 05 Nov 2015 12:44:56 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[fiverfun]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=21804</guid>

					<description><![CDATA[In the glorious past, Amazon had an API for interacting with its &#34;Wishlist&#34; service.  Not any more though.  So, here&#039;s the inspiring story of how a rag-tag band of adventurers brought it back from the dead!  Several years ago, Justin Scarpetti created a tool to extract data from an Amazon wishlist - the imaginatively named Amazon Wish Lister.  It used that most vulgar of programming practices -…]]></description>
										<content:encoded><![CDATA[<p>In the glorious past, Amazon had an API for interacting with its "Wishlist" service.  Not any more though.</p>

<p>So, here's the inspiring story of how a rag-tag band of adventurers brought it back from the dead!</p>

<p>Several years ago, <a href="https://web.archive.org/web/20151209104815/https://www.justinscarpetti.com/portfolio/amazon-wish-lister/">Justin Scarpetti</a> created a tool to extract data from an Amazon wishlist - the imaginatively named <a href="https://github.com/doitlikejustin/amazon-wish-lister">Amazon Wish Lister</a>.  It used that most vulgar of programming practices - Screen Scraping!</p>

<p>Yup, gobble up the HTML and attempt to parse it.  Needs must in a dire situation.  It worked, but it felt <em>dirty</em>!</p>

<p>Actually, scratch that.  It <em>mostly</em> worked.  It wasn't retrieving prices due to a change in the page structure and it was hard coded to the US site.</p>

<p>Time to fix things!</p>

<h2 id="the-aim"><a href="https://shkspr.mobi/blog/2015/11/an-api-for-amazon-wishlists/#the-aim">The Aim</a></h2>

<p>I want to add something to my Amazon Wishlist and have it automatically appear on my <a href="http://fiverfun.tumblr.com/">Secret Santa Tumblr</a>.</p>

<h2 id="the-changes"><a href="https://shkspr.mobi/blog/2015/11/an-api-for-amazon-wishlists/#the-changes">The Changes</a></h2>

<ul>
    <li><a href="https://github.com/edent/amazon-wish-lister/commit/6811972675b50bad148134b5de3b2e85cf6b33e2">Add support for international Amazon stores</a> - not just .com.  This was pretty easy, all Amazon stores use the same URL structure for their wishlists and (mostly) the same HTML for their pages.  Some Amazon stores don't have wishlists at all.</li>
    <li><a href="https://github.com/edent/amazon-wish-lister/commit/bbfb9e50105c0b11eb85207acaede424c93ddcd4">Get the prices</a>. Again, a simple fix - although it is at the mercy of Amazon changing their page structure. Such are the perils of screen scraping.</li>
    <li><a href="https://github.com/edent/amazon-wish-lister/commit/3cc05540401b3c5ebbee305b4c41e9ea251499b2">Better XML Output</a>. Some weirdos prefer XML to JSON. Fools!  This was intended to be a precursor to RSS support before I realised there was an easier way to do it.</li>
    <li><a href="https://github.com/edent/amazon-wish-lister/commit/011cfd98ab57513837956281d017a52965b4bd6d">Get the AISN</a>. Due to Amazon's consistent URl structure, it was easy to grab the item's ID.  Useful for the next few parts.</li>
    <li><a href="https://github.com/edent/amazon-wish-lister/commit/ea3c89504f10f8b35cf43d5b689c84d8616e818a">Bigger images</a>. By default, Amazon gives fairly small images as standard.  A little URl manipulation and we can get much larger picture served over HTTPS.  Weirdly, all images are served from the .com site.</li>
    <li><a href="https://github.com/edent/amazon-wish-lister/commit/9371c2b421030e4401c22f1cbeb297976b0251d1">Amazon Affiliate Support</a>. One of my major reasons for doing this project is that I earn a small amount of revenue from Amazon whenever someone clicks my links &amp; then goes on to buy something.</li>
    <li><a href="https://github.com/edent/amazon-wish-lister/commit/b859eb8740fa9fbb93101a98652fc58a1f391904">RSS Feed Generation</a>.  With all that groundwork laid, I was able to quickly generate a (mostly) valid RSS feed.  Every time something is added to the wishlist, the RSS feed updates. Perfect!</li>
</ul>

<p>Rather than monkeying around with the Tumblr API, I just used <a href="https://ifttt.com">IFTTT</a>.  It checks the RSS and should post any new items onto the blog.</p>

<h2 id="the-result"><a href="https://shkspr.mobi/blog/2015/11/an-api-for-amazon-wishlists/#the-result">The Result</a></h2>

<p>IT WORKS!
<a href="http://fiverfun.tumblr.com/"><img src="https://shkspr.mobi/blog/wp-content/uploads/2015/11/FiverFun.jpg" alt="FiverFun" width="467" height="1030" class="aligncenter size-full wp-image-21806"></a>
<a href="http://fiverfun.tumblr.com/">Visit my FiverFun Tumblr</a> to see it in action.  Each time I find a cool stocking-filler under five quid, I add it to a specific wishlist.  IFTT picks it up and sends it to Tumblr.</p>

<p>You can <a href="http://github.com/edent/amazon-wish-lister">download the updated code from GitHub</a></p>

<h2 id="bugs"><a href="https://shkspr.mobi/blog/2015/11/an-api-for-amazon-wishlists/#bugs">Bugs</a></h2>

<p>It wouldn't be an Open Source project without a few bugs!</p>

<p>If you can help with any of these, <a href="http://github.com/edent/amazon-wish-lister/issues/">please chip in over at GitHub</a>.</p>

<ul>
    <li><a href="https://github.com/edent/amazon-wish-lister/issues/3">Japanese text encoding is <em>hard!</em></a>.  I'm not sure if it's a Shift_JS vs UTF-8 issue, or a multibyte thing - but something is screwing up the text formatting.</li>
    <li><a href="https://github.com/edent/amazon-wish-lister/issues/2">India's prices are nested within another set of tags</a>. Need a way to always get the innermost content.</li>
    <li>Both of the above may be related to the screenscraping library - the ancient <a href="https://web.archive.org/web/20151120195016/http://phpquery-library.blogspot.com/">phpQuery</a>.  It may be worth either fixing it or moving onto a new library.</li>
    <li><a href="https://github.com/edent/amazon-wish-lister/issues/4">International dates are problematic</a>.  I need to find a way to easily convert them into <a href="http://www.faqs.org/rfcs/rfc822.html">RFC-822</a> format.</li>
    <li>Transient text encoding issues - mostly, I think, due to vendors copy &amp; pasting from MS Word.</li>
</ul>

<p>If you've enjoyed this post, you can <a href="http://www.amazon.co.uk/gp/registry/wishlist/13GFCFR2B2IX4">buy something for me from my Amazon Wishlist :-)</a></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=21804&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2015/11/an-api-for-amazon-wishlists/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Is GitHub Racist?]]></title>
		<link>https://shkspr.mobi/blog/2013/06/is-github-racist/</link>
					<comments>https://shkspr.mobi/blog/2013/06/is-github-racist/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 08 Jun 2013 16:20:26 +0000</pubDate>
				<category><![CDATA[usability]]></category>
		<category><![CDATA[accents]]></category>
		<category><![CDATA[chinese]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[racism]]></category>
		<guid isPermaLink="false">http://shkspr.mobi/blog/?p=8316</guid>

					<description><![CDATA[One of the interesting aspects of privilege is how it lays bare our unconscious assumptions about the world.  A male software developer may never consider that a user would want or need to change their name.  Thus they would design a product which ignored the millions of women changing their names after marriage.  It&#039;s very temping to see software as racist when, in reality, it&#039;s more likely to…]]></description>
										<content:encoded><![CDATA[<p>One of the interesting aspects of privilege is how it lays bare our unconscious assumptions about the world.  A male software developer may never consider that a user would want or need to change their name.  Thus they would design a product which ignored the millions of women changing their names after marriage.</p>

<p>It's very <a href="https://web.archive.org/web/20130812093717/http://mymisanthropicmusings.org.uk/is-my-crm-racist/">temping to see software as racist</a> when, in reality, it's more likely to have a root cause of unconscious assumptions.</p>

<p>Take, for example, <a href="http://github.com">GitHub</a>.  You can host all of your software projects on there - as long as you speak English.</p>

<p>Wait? What?</p>

<p>Try adding a repository which contains, say, Chinese - and all those beautiful characters will be replaced with "-".
<img src="https://shkspr.mobi/blog/wp-content/uploads/2013/06/Chinese-GitHub-fs8.png" alt="Chinese GitHub" width="382" height="215" class="aligncenter size-full wp-image-8320"></p>

<p>I asked GitHub about this, and quickly got this reply.</p>

<blockquote>Unfortunately, at the moment, you can only use ASCII (i.e. Windows-1252) characters in Repo names. Most things on GitHub.com support non-ASCII but because of limitations in Git, the repo name isn't one of them. Sorry about the international-unfriendliness</blockquote>

<p>Interestingly, that's not quite the case.  <a href="https://en.wikipedia.org/wiki/Windows-1252">Windows-1252</a> contains some characters with accents - they simply aren't recognised by GitHub.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2013/06/Accents-Github-fs8.png" alt="Accents Github" width="369" height="217" class="aligncenter size-full wp-image-8319">

<p>We don't live in a homogeneous world. US English is not the global language.  Even if it was, ASCII is insufficient to the task of information interchange.</p>

<p><a href="https://en.wikipedia.org/wiki/ASCII">ASCII was invented in 1972</a> - 40 years later and our brand new shiny kit is hamstrung by the needs of the <em>telegraph</em> industry!  It's like that wonderful urban legend about the <a href="http://www.snopes.com/history/american/gauge.asp">Space Shuttle being constrained by the size of a horse's arse</a>.</p>

<p>Obviously, GitHub isn't racist.  Either they or the originators of Git have assumed that their local dialect is sufficient for a service which aims to be universally acceptable.  All the more strange given that Linus Torvalds, the creator of Git, is Finnish and - one presumes - knows about <em><a href="http://en.wikipedia.org/wiki/Finnish_alphabet">ääkköset</a></em> (the "extra" letters in the Finnish alphabet).</p>

<p>At this stage in the maturity of the software industry, we should consider the practice of not supporting Unicode as outmoded and dangerous as assuming every year can be represented by a two digit number.</p>

<p>There's a world outside our narrow viewpoint and, if we want to do business with that world, we need to speak their language.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=8316&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2013/06/is-github-racist/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Open Source Shakespeare (in MySQL)]]></title>
		<link>https://shkspr.mobi/blog/2012/04/open-source-shakespeare-in-mysql/</link>
					<comments>https://shkspr.mobi/blog/2012/04/open-source-shakespeare-in-mysql/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 20 Apr 2012 14:15:47 +0000</pubDate>
				<category><![CDATA[Shakespeare]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[shakespeare]]></category>
		<guid isPermaLink="false">http://shkspr.mobi/blog/?p=5583</guid>

					<description><![CDATA[My good friend Richard Brent has often complained that my blog has very little Shakespeare content. Despite the domain name, I don&#039;t think I&#039;ve ever blogged about The Big S.  For shame!  Fear not, my Brentish-Boy, this post is all about Shakespeare. And MySQL....  Ahem...  When I first started shkspr.mobi it was intended to be an easy way to get Shakespeare on your phone.  At that time, there…]]></description>
										<content:encoded><![CDATA[<p>My good friend <a href="http://www.linkedin.com/in/rbrent">Richard Brent</a> has often complained that my blog has very little Shakespeare content. Despite the domain name, I don't think I've <em>ever</em> blogged about The Big S.  For shame!  Fear not, <a href="http://www.jabberwocky.com/carroll/jabber/jabberwocky.html">my Brentish-Boy</a>, this post is all about Shakespeare. And MySQL....</p>

<p>Ahem...</p>

<p>When I first started <a href="https://shkspr.mobi/">shkspr.mobi</a> it was intended to be an easy way to get Shakespeare on your phone.  At that time, there were no mobile formatted texts of his plays and sonnets, so I had to create them.  Finding Shakespeare's works in a suitable format for conversion wasn't too hard - but it meant lots of crufty code to read text files line-by-line. Yuck.</p>

<p>A few years later, I stumbled across <a href="http://www.opensourceshakespeare.org/">Open Source Shakespeare</a>.  The project grew out of <a href="http://www.opensourceshakespeare.org/info/paper_toc.php">Eric Johnson's MA thesis</a>.  It's a remarkably good idea with only one <em>minor</em> problem.  The database it uses is Microsoft Access.</p>

<p>MS Access, as a database, could best be described as</p>

<blockquote><p>deformed, crooked, old and sere, ill faced, worse bodied, shapeless everywhere, vicious, ungentle, foolish, blunt, unkind, stigmatical in making, worse in mind</p><p>(Comedy of Errors, Act IV, Scene II)</p></blockquote>

<p>There are a few Open Source Shakespeare projects on GitHub, but they don't seem very practical.</p>

<p>So, naturally, I've decided to create my own version of Shakespeare's works - in MySQL :-)</p>

<p>This is what it looks like:
<a href="https://github.com/edent/Open-Source-Shakespeare"><img src="https://shkspr.mobi/blog/wp-content/uploads/2012/04/Shkspr-MySQL.png" alt="Shkspr MySQL" title="Shkspr MySQL" width="600" height="240" class="aligncenter size-full wp-image-5592"></a>
You can <a href="https://github.com/edent/Open-Source-Shakespeare">download it from GitHub</a>.</p>

<p>I've stripped out a lot of the extraneous stuff from the original version - word counts, etc.  So it should be a fairly lean database which is easy to use.  I'm not a database professional, so I would be grateful if you could suggest any improvements. Either using this blog's comment form or on <a href="https://github.com/edent/Open-Source-Shakespeare">GitHub</a>.</p>

<p>There are four tables</p>

<h2 id="paragraphs"><a href="https://shkspr.mobi/blog/2012/04/open-source-shakespeare-in-mysql/#paragraphs">Paragraphs</a></h2>

<p>This is where the main body of text is.  A typical row will look like this</p>

<ul>
    <li>WorkID: hamlet</li>
    <li>ParagraphID: 639015</li>
    <li>ParagraphNum: 3427</li>
    <li>CharID: hamlet</li>
    <li>PlainText: Has this fellow no feeling of his business, that he sings atngrave-making?</li>
    <li>Act: 5</li>
    <li>Scene: 1</li>
</ul>

<h2 id="works"><a href="https://shkspr.mobi/blog/2012/04/open-source-shakespeare-in-mysql/#works">Works</a></h2>

<p>This is what translates the "WorkID" into something human readable - plus some extra metadata</p>

<ul>
    <li>WorkID: hamlet</li>
    <li>Title: Hamlet</li>
    <li>LongTitle: Tragedy of Hamlet, Prince of Denmark, The</li>
    <li>Date: 1600</li>
    <li>GenreType: Tragedy</li>
</ul>

<h2 id="character"><a href="https://shkspr.mobi/blog/2012/04/open-source-shakespeare-in-mysql/#character">Character</a></h2>

<p>This is what translates the CharID into a human readable name and description</p>

<ul>
    <li>charID: hamlet</li>
    <li>CharName: Hamlet</li>
    <li>Abbrev: Ham</li>
    <li>Works: Tragedy of Hamlet, Prince of Denmark, The</li>
    <li>Description: son of the former king and nephew to the present king</li>
</ul>

<h2 id="chapters"><a href="https://shkspr.mobi/blog/2012/04/open-source-shakespeare-in-mysql/#chapters">Chapters</a></h2>

<p>This gives the setting for each Act and Scene.</p>

<ul>
    <li>WorkID: hamlet</li>
    <li>ChapterID: 18893</li>
    <li>Act: 5</li>
    <li>Scene: 1</li>
    <li>Description: Elsinore. A churchyard.</li>
</ul>

<h2 id="whats-next"><a href="https://shkspr.mobi/blog/2012/04/open-source-shakespeare-in-mysql/#whats-next">What's Next?</a></h2>

<p>The next steps for the project are fairly obvious:</p>

<ol>
    <li>Write some high level example code to show people how to use the database.</li>
    <li>Make <a href="https://shkspr.mobi/">shkspr.mobi</a> a showcase site which runs off the database.</li>
    <li>Fix any bugs and inconsistencies that people find.</li>
</ol>

<p>You can <a href="https://github.com/edent/Open-Source-Shakespeare">download the Shakespeare MySQL Database from GitHub</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=5583&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2012/04/open-source-shakespeare-in-mysql/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
	</channel>
</rss>
