<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: genetics</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/genetics.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2019-10-21T18:42:41+00:00</updated><author><name>Simon Willison</name></author><entry><title>Weeknotes: The Squirrel Census, Genome SQL query</title><link href="https://simonwillison.net/2019/Oct/21/weeknotes-squirrels-genome/#atom-tag" rel="alternate"/><published>2019-10-21T18:42:41+00:00</published><updated>2019-10-21T18:42:41+00:00</updated><id>https://simonwillison.net/2019/Oct/21/weeknotes-squirrels-genome/#atom-tag</id><summary type="html">
    &lt;p&gt;This week was mostly about incremental improvements. And squirrels.&lt;/p&gt;
&lt;h3 id="the-squirrel-census"&gt;The Squirrel Census&lt;/h3&gt;
&lt;p&gt;Last October a team of 323 volunteer Squirrel Sighters got together to attempt the first ever comprehensive census of the squirrels in New York&amp;#39;s Central Park.&lt;/p&gt;
&lt;p&gt;The result was &lt;a href="https://www.thesquirrelcensus.com/"&gt;the Central Park Squirrel Census 2019 Report&lt;/a&gt;, an absolutely delightful package you can order from their site that includes two beautiful five foot long maps, a written supplemental report and (not kidding) a 45-RPM vinyl audio report.&lt;/p&gt;
&lt;p&gt;I bought a copy and everyone I have shown it to has fallen in love with it.&lt;/p&gt;
&lt;p&gt;Last week they &lt;a href="https://data.cityofnewyork.us/Environment/2018-Central-Park-Squirrel-Census-Squirrel-Data/vfnx-vebw"&gt;released the underlying data&lt;/a&gt; through the NYC open data portal! Naturally I loaded it into &lt;a href="https://central-park-squirrel-census.glitch.me/"&gt;a Datasette instance&lt;/a&gt; (running on &lt;a href="https://glitch.com/"&gt;Glitch&lt;/a&gt;, which is also made in New York). You can &lt;a href="https://central-park-squirrel-census.glitch.me/csv-data/2018_Central_Park_Squirrel_Census?_facet=Primary_Fur_Color&amp;amp;_facet=Highlight_Fur_Color&amp;amp;_facet=Age"&gt;facet by fur color&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="analyzing-my-genome-with-sql"&gt;Analyzing my genome with SQL&lt;/h3&gt;
&lt;p&gt;Natalie and I attended the first half of the last &lt;a href="https://sf.sciencehackday.org/"&gt;San Francisco Science Hack Day&lt;/a&gt;. I made a 44 second pitch asking for help &lt;a href="https://github.com/dogsheep/genome-to-sqlite/issues/1"&gt;using SQL to analyze my genome&lt;/a&gt;, and Dr. Laura Cantino answered my call and helped me figure out how to run some fun queries.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s my favourite example so far:&lt;/p&gt;
&lt;pre&gt;&lt;code class="lang-sql"&gt;&lt;span class="hljs-keyword"&gt;select&lt;/span&gt; rsid, genotype, &lt;span class="hljs-keyword"&gt;case&lt;/span&gt; genotype
  &lt;span class="hljs-keyword"&gt;when&lt;/span&gt; &lt;span class="hljs-symbol"&gt;'AA&lt;/span&gt;' &lt;span class="hljs-keyword"&gt;then&lt;/span&gt; &lt;span class="hljs-symbol"&gt;'brown&lt;/span&gt; eye color, &lt;span class="hljs-number"&gt;80&lt;/span&gt;% &lt;span class="hljs-keyword"&gt;of&lt;/span&gt; the &lt;span class="hljs-built_in"&gt;time&lt;/span&gt;'
  &lt;span class="hljs-keyword"&gt;when&lt;/span&gt; &lt;span class="hljs-symbol"&gt;'AG&lt;/span&gt;' &lt;span class="hljs-keyword"&gt;then&lt;/span&gt; &lt;span class="hljs-symbol"&gt;'brown&lt;/span&gt; eye color'
  &lt;span class="hljs-keyword"&gt;when&lt;/span&gt; &lt;span class="hljs-symbol"&gt;'GG&lt;/span&gt;' &lt;span class="hljs-keyword"&gt;then&lt;/span&gt; &lt;span class="hljs-symbol"&gt;'blue&lt;/span&gt; eye color, &lt;span class="hljs-number"&gt;99&lt;/span&gt;% &lt;span class="hljs-keyword"&gt;of&lt;/span&gt; the &lt;span class="hljs-built_in"&gt;time&lt;/span&gt;'
&lt;span class="hljs-keyword"&gt;end&lt;/span&gt; as interpretation from genome where rsid = &lt;span class="hljs-symbol"&gt;'rs12913832&lt;/span&gt;'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It works! If I run it against my genome it gets GG (blue eyes), and if I run it against &lt;a href="https://twitter.com/natbat"&gt;Natalie&amp;#39;s&lt;/a&gt; it gets AG (brown).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2019/genome-eyes.png" alt="Running SQL against my genome and Natalie&amp;#39;s genome" style="max-width: 100%" /&gt;&lt;/p&gt;
&lt;h3 id="twitter-to-sqlite-crons-for-dogsheep"&gt;twitter-to-sqlite crons for Dogsheep&lt;/h3&gt;
&lt;p&gt;I upgraded my personal Dogsheep instance to start fetching fresh data via cron. This meant improving twitter-to-sqlite to be &lt;a href="https://github.com/dogsheep/twitter-to-sqlite/issues/20"&gt;better at incremental data fetching&lt;/a&gt;. Here&amp;#39;s the resulting relevant section of my cron tab:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Fetch new tweets I have tweeted every &lt;span class="hljs-number"&gt;10&lt;/span&gt; minutes
&lt;span class="hljs-number"&gt;1&lt;/span&gt;,&lt;span class="hljs-number"&gt;11&lt;/span&gt;,&lt;span class="hljs-number"&gt;21&lt;/span&gt;,&lt;span class="hljs-number"&gt;31&lt;/span&gt;,&lt;span class="hljs-number"&gt;41&lt;/span&gt;,&lt;span class="hljs-number"&gt;51&lt;/span&gt; * * * * /home/ubuntu/datasette-venv/bin/twitter-to-sqlite user-timeline /home/ubuntu/twitter.db -a /home/ubuntu/auth.json --since

# Fetch most recent &lt;span class="hljs-number"&gt;50&lt;/span&gt; tweets I have favourited every &lt;span class="hljs-number"&gt;10&lt;/span&gt; minutes
&lt;span class="hljs-number"&gt;6&lt;/span&gt;,&lt;span class="hljs-number"&gt;16&lt;/span&gt;,&lt;span class="hljs-number"&gt;26&lt;/span&gt;,&lt;span class="hljs-number"&gt;36&lt;/span&gt;,&lt;span class="hljs-number"&gt;46&lt;/span&gt;,&lt;span class="hljs-number"&gt;56&lt;/span&gt; * * * * /home/ubuntu/datasette-venv/bin/twitter-to-sqlite favorites /home/ubuntu/twitter.db -a /home/ubuntu/auth.json --stop_after=&lt;span class="hljs-number"&gt;50&lt;/span&gt;

# Fetch new tweets from my home timeline every &lt;span class="hljs-number"&gt;5&lt;/span&gt; minutes
&lt;span class="hljs-number"&gt;2&lt;/span&gt;,&lt;span class="hljs-number"&gt;7&lt;/span&gt;,&lt;span class="hljs-number"&gt;12&lt;/span&gt;,&lt;span class="hljs-number"&gt;17&lt;/span&gt;,&lt;span class="hljs-number"&gt;22&lt;/span&gt;,&lt;span class="hljs-number"&gt;27&lt;/span&gt;,&lt;span class="hljs-number"&gt;32&lt;/span&gt;,&lt;span class="hljs-number"&gt;37&lt;/span&gt;,&lt;span class="hljs-number"&gt;42&lt;/span&gt;,&lt;span class="hljs-number"&gt;47&lt;/span&gt;,&lt;span class="hljs-number"&gt;52&lt;/span&gt;,&lt;span class="hljs-number"&gt;57&lt;/span&gt; * * * * /home/ubuntu/datasette-venv/bin/twitter-to-sqlite home-timeline /home/ubuntu/timeline.db -a /home/ubuntu/auth.json --since
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That last line is quite fun: I&amp;#39;m now hitting the Twitter &lt;a href="https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-home_timeline"&gt;home-timeline API&lt;/a&gt; every five minutes and storing the resulting tweets in a separate &lt;code&gt;timeline.db&lt;/code&gt; database. This equates to creating a searchable permanent database of anything tweeted by any of the 3,600+ &lt;a href="https://twitter.com/simonw/following"&gt;accounts I follow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The main thing I&amp;#39;ve learned from this exercise is that I&amp;#39;m really grateful for Twitter&amp;#39;s algorithmic timeline! Accounts I follow tweeted between 13,000 and 22,000 times a day over the past week (&lt;code&gt;/timeline/tweets?_where=id+in+(select+tweet+from+timeline_tweets)&amp;amp;_facet_date=created_at&lt;/code&gt;). Trusting the algorithm to show me the highlights frees me to be liberal in following new accounts.&lt;/p&gt;
&lt;h3 id="playing-with-lit-html"&gt;Playing with lit-html&lt;/h3&gt;
&lt;p&gt;I have a couple of projects brewing where I&amp;#39;ll be building out a JavaScript UI. I used React for both &lt;a href="https://github.com/simonw/datasette-vega"&gt;datasette-vega&lt;/a&gt; and &lt;a href="https://github.com/simonw/owlsnearme"&gt;owlsnearme&lt;/a&gt; and it works OK, but it&amp;#39;s pretty weighty (~40KB gzipped) and requires a complex build step.&lt;/p&gt;
&lt;p&gt;For my current pro;jects, I&amp;#39;m willing to sacrifice compatibility with older browsers in exchange for less code and no build step.&lt;/p&gt;
&lt;p&gt;I considered going completely library free, but having some kind of templating mechanism for constructing complex DOM elements is useful.&lt;/p&gt;
&lt;p&gt;I love JavaScript &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#Tagged_templates"&gt;tagged template literals&lt;/a&gt; - they&amp;#39;re like &lt;a href="https://docs.python.org/3/reference/lexical_analysis.html#f-strings"&gt;Python&amp;#39;s f-strings&lt;/a&gt; but even better, because you can provide your own function that executes against every interpolated value - ideal for implementing &lt;a href="https://code.djangoproject.com/wiki/AutoEscaping"&gt;Django-style autoescaping&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve used them for &lt;a href="https://gist.github.com/simonw/dec4bec9ec6041c053bc0466f1203da1"&gt;my own tiny autoescaping implementation&lt;/a&gt; in the past, but I&amp;#39;m getting excited about exploring &lt;a href="https://lit-html.polymer-project.org/"&gt;lit-html&lt;/a&gt;, which extends the same technique to cover a lot more functionality while still weighing in at less than 4KB gzipped.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://twitter.com/simonw/status/1183583625830227968"&gt;Laurence Rowe on Twitter&lt;/a&gt; I now have a tidy one-liner for running lit-html in the Firefox developer console, loaded from a module:&lt;/p&gt;
&lt;pre&gt;&lt;code class="lang-javascript"&gt;&lt;span class="hljs-keyword"&gt;let&lt;/span&gt; {html, render} = &lt;span class="hljs-keyword"&gt;await&lt;/span&gt; &lt;span class="hljs-keyword"&gt;import&lt;/span&gt;(&lt;span class="hljs-string"&gt;'https://unpkg.com/lit-html?module'&lt;/span&gt;);

&lt;span class="hljs-comment"&gt;// Try it out like so:&lt;/span&gt;
render(html&lt;span class="hljs-string"&gt;`&amp;lt;h1&amp;gt;Hello world&amp;lt;/h1&amp;gt;`&lt;/span&gt;, &lt;span class="hljs-built_in"&gt;document&lt;/span&gt;.body);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And here&amp;#39;s a full proof-of-concept script showing data loaded from Datasette via &lt;code&gt;fetch()&lt;/code&gt; which is then rendered using lit-html:&lt;/p&gt;
&lt;pre&gt;&lt;code class="lang-html"&gt;&lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;script&lt;/span&gt; &lt;span class="hljs-attr"&gt;type&lt;/span&gt;=&lt;span class="hljs-string"&gt;"module"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class="javascript"&gt;
&lt;span class="hljs-keyword"&gt;import&lt;/span&gt; {html, render} &lt;span class="hljs-keyword"&gt;from&lt;/span&gt; &lt;span class="hljs-string"&gt;'https://unpkg.com/lit-html?module'&lt;/span&gt;;
&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; myTemplate = &lt;span class="hljs-function"&gt;(&lt;span class="hljs-params"&gt;data&lt;/span&gt;) =&amp;gt;&lt;/span&gt; html&lt;span class="hljs-string"&gt;`&amp;lt;p&amp;gt;Hello &lt;span class="hljs-subst"&gt;${&lt;span class="hljs-built_in"&gt;JSON&lt;/span&gt;.stringify(data)}&lt;/span&gt;&amp;lt;/p&amp;gt;`&lt;/span&gt;;
&lt;span class="hljs-keyword"&gt;async&lt;/span&gt; &lt;span class="hljs-function"&gt;&lt;span class="hljs-keyword"&gt;function&lt;/span&gt; &lt;span class="hljs-title"&gt;go&lt;/span&gt;(&lt;span class="hljs-params"&gt;&lt;/span&gt;) &lt;/span&gt;{
    &lt;span class="hljs-keyword"&gt;let&lt;/span&gt; div = &lt;span class="hljs-built_in"&gt;document&lt;/span&gt;.getElementsByTagName(&lt;span class="hljs-string"&gt;"div"&lt;/span&gt;)[&lt;span class="hljs-number"&gt;0&lt;/span&gt;];
    &lt;span class="hljs-keyword"&gt;var&lt;/span&gt; data = &lt;span class="hljs-keyword"&gt;await&lt;/span&gt; (&lt;span class="hljs-keyword"&gt;await&lt;/span&gt; fetch(&lt;span class="hljs-string"&gt;"https://latest.datasette.io/fixtures/complex_foreign_keys.json?_labels=on&amp;amp;_shape=array"&lt;/span&gt;)).json();
    render(myTemplate(data), div);
}
go();
&lt;/span&gt;&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;script&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="everything-else"&gt;Everything else&lt;/h3&gt;
&lt;p&gt;I shipped a new release of Datasette (&lt;a href="https://datasette.readthedocs.io/en/stable/changelog.html#v0-30"&gt;version 0.30&lt;/a&gt;) incorporating some bug fixes and the external contributions I &lt;a href="https://simonwillison.net/2019/Oct/14/weeknotes/"&gt;talked about last week&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I started work on a new project which has been brewing for a while. Not ready to talk about it yet but I did buy a domain name (through Google Domains this time, but I got &lt;a href="https://twitter.com/simonw/status/1185769144945270784"&gt;some great advice from Twitter&lt;/a&gt; on domain registrars with non-terrible UIs in 2019).&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/genetics"&gt;genetics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/squirrels"&gt;squirrels&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/weeknotes"&gt;weeknotes&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="genetics"/><category term="projects"/><category term="squirrels"/><category term="weeknotes"/></entry><entry><title>Weeknotes: Design thinking for journalists, genome-to-sqlite, datasette-atom</title><link href="https://simonwillison.net/2019/Sep/20/weeknotes-design-thinking-genome-sqlite/#atom-tag" rel="alternate"/><published>2019-09-20T20:13:01+00:00</published><updated>2019-09-20T20:13:01+00:00</updated><id>https://simonwillison.net/2019/Sep/20/weeknotes-design-thinking-genome-sqlite/#atom-tag</id><summary type="html">
    &lt;p&gt;I haven’t had much time for code this week: we’ve had a full five day workshop at JSK with &lt;a href="https://twitter.com/tranosaurus"&gt;Tran Ha&lt;/a&gt; (a JSK alumni) learning how to apply &lt;a href="https://www.ideou.com/pages/design-thinking"&gt;Design Thinking&lt;/a&gt; to our fellowship projects and generally to challenges facing journalism.&lt;/p&gt;
&lt;p&gt;I’ve used aspects of design thinking in building software products, but I’d never really thought about how it could be applied outside of digital product design. It’s been really interesting - especially seeing the other fellows (who, unlike me, are generally not planning to build software during their fellowship) start to apply it to a much wider and more interesting range of problems.&lt;/p&gt;
&lt;p&gt;I’ve been commuting in to Stanford on the Caltrain, which did give me a bit of time to work on some code.&lt;/p&gt;
&lt;h3 id="genome-to-sqlite"&gt;genome-to-sqlite&lt;/h3&gt;
&lt;p&gt;I’m continuing to build out a &lt;a href="https://github.com/dogsheep"&gt;family of tools&lt;/a&gt; for personal analytics, where my principle goal is to reclaim the data that various internet companies have collected about me and pull it into a local SQLite database so I can analyze, visualize and generally and have fun with it.&lt;/p&gt;
&lt;p&gt;A few years ago I shared my DNA with &lt;a href="https://www.23andme.com/"&gt;23andMe&lt;/a&gt;. I don’t think I’d make the decision to do that today: it’s incredibly personal data, and the horror stories about people making unpleasant discoveries about their family trees keep on building. But since I’ve done it, I decided to see if I could extract out some data…&lt;/p&gt;
&lt;p&gt;… and it turns out they let you &lt;a href="https://you.23andme.com/tools/data/download/"&gt;download your entire genome&lt;/a&gt;! You can export it as a zipped up TSV file - mine decompresses to 15MB of data (which feels a little small - I know little about genetics, but I’m presuming that’s because the genome they record and share is just the interesting known genetic markers, not the entire DNA sequence - UPDATE: &lt;a href="https://customercare.23andme.com/hc/en-us/articles/202904600-Difference-Between-DNA-Genotyping-Sequencing"&gt;confirmed&lt;/a&gt;, thanks &lt;a href="https://twitter.com/laurencerowe/status/1175151249567576064"&gt;@laurencerowe&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;So I wrote a quick utility, &lt;a href="https://github.com/dogsheep/genome-to-sqlite"&gt;genome-to-sqlite&lt;/a&gt;, which loads the TSV file (directly from the zip or a file you’ve already extracted) and writes it to a simple SQLite table. Load it into Datasette and you can even facet by chromosome, which is exciting!&lt;/p&gt;
&lt;p&gt;This is where my knowledge runs out. I’m confident someone with more insight than me could construct some interesting SQL queries against this - maybe one that determines if you are &lt;a href="https://www.snpedia.com/index.php/Rs1805007"&gt;likely to have red hair&lt;/a&gt;? - so I’m hoping someone will step in and provide a few examples.&lt;/p&gt;
&lt;p&gt;I filed &lt;a href="https://github.com/dogsheep/genome-to-sqlite/issues/1"&gt;a help wanted issue&lt;/a&gt; on GitHub. I also put &lt;a href="https://twitter.com/simonw/status/1174712746157326336"&gt;a request out on Twitter&lt;/a&gt; for an UPDATE statement that could turn me into a dinosaur.&lt;/p&gt;
&lt;h3&gt;datasette-atom&lt;/h3&gt;
&lt;p&gt;This is very much a work-in-progress right now: &lt;a href="https://github.com/simonw/datasette-atom"&gt;datasette-atom&lt;/a&gt; will be a Datasette plugin that adds &lt;code&gt;.atom&lt;/code&gt; as an output format (using the &lt;a href="https://datasette.readthedocs.io/en/stable/plugins.html#register-output-renderer-datasette"&gt;register_output_renderer plugin hook&lt;/a&gt; contributed &lt;a href="https://github.com/simonw/datasette/pull/441"&gt;by Russ Garrett&lt;/a&gt; a few months ago.&lt;/p&gt;
&lt;p&gt;The aim is to allow people to subscribe to the output of a query in their feed reader (and potentially through that via email and other mechanisms) - particularly important for databases which are being updated over time.&lt;/p&gt;
&lt;p&gt;It’s a slightly tricky plugin to design because valid Atom feed entries require a globally unique ID, a title and an “updated” date - and not all SQL queries produce obvious candidates for these values. As such, I’m going to &lt;a href="https://github.com/simonw/datasette-atom/issues/2"&gt;have the plugin prompt the user&lt;/a&gt; for those fields and then persist them in the feed URL that you subscribe to.&lt;/p&gt;
&lt;p&gt;This also means you won’t be able to generate an Atom feed for a query that doesn’t return at least one datetime column. I think I’m OK with that.&lt;/p&gt;
&lt;h3&gt;github-to-sqlite&lt;/h3&gt;
&lt;p&gt;I &lt;a href="https://github.com/dogsheep/github-to-sqlite/releases/tag/0.4"&gt;released one new feature&lt;/a&gt; for &lt;a href="https://github.com/dogsheep/github-to-sqlite"&gt;github-to-sqlite&lt;/a&gt; this week: the &lt;code&gt;github-to-sqlite repos github.db&lt;/code&gt; command, which populates a database table of all of the repositories available to the authenticated user. Or use &lt;code&gt;github-to-sqlite repos github.db dogsheep&lt;/code&gt; to pull the repos owned by a specific user or organization.&lt;/p&gt;
&lt;p&gt;The command configures a SQLite full-text search index against the repo titles and descriptions, so if you have a lot of GitHub repos (I somehow have nearly 300!) you can search through them and use Datasette to facet them against different properties.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;github-to-sqlite&lt;/code&gt; currently has two other useful subcommands: &lt;code&gt;starred&lt;/code&gt; fetches details of every repository a user has starred, and &lt;code&gt;issues&lt;/code&gt; pulls details of the issues (but sadly not yet their comment threads) attached to a repository.&lt;/p&gt;
&lt;h3&gt;Books&lt;/h3&gt;
&lt;p&gt;I’m trying to spend more time reading books - so I’m going to start including book stuff in my weeknotes in the hope of keeping myself on track.&lt;/p&gt;
&lt;p&gt;I acquired two new books this week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://abookapart.com/products/just-enough-research"&gt;Just Enough Research&lt;/a&gt; by Erika Hall (recommended by Tom Coates and Tran Ha), because I need to spent the next few months interviewing as many journalists (and other project stakeholders) as possible to ensure I am solving the right problems for them.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://producingoss.com/"&gt;Producing Open Source Software&lt;/a&gt; by Karl Fogel, because my &lt;a href="https://simonwillison.net/2019/Sep/10/jsk-fellowship/"&gt;fellowship goal&lt;/a&gt; is to build a thriving open source ecosystem around tooling for data journalism and this book looks like it covers a lot of the topics I need to really do a good job of that.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next step: actually read them! Hopefully I’ll have some notes to share in next week’s update.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/genetics"&gt;genetics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/reading"&gt;reading&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jsk"&gt;jsk&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/weeknotes"&gt;weeknotes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/design-thinking"&gt;design-thinking&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="genetics"/><category term="projects"/><category term="reading"/><category term="sqlite"/><category term="datasette"/><category term="jsk"/><category term="weeknotes"/><category term="design-thinking"/></entry><entry><title>Quoting @simonw</title><link href="https://simonwillison.net/2019/Sep/19/dinosaur/#atom-tag" rel="alternate"/><published>2019-09-19T16:00:47+00:00</published><updated>2019-09-19T16:00:47+00:00</updated><id>https://simonwillison.net/2019/Sep/19/dinosaur/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://twitter.com/simonw/status/1174712746157326336"&gt;&lt;p&gt;Anyone with solid knowledge of both SQL and genetic engineering want to write me an UPDATE query to turn me into a dinosaur?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://twitter.com/simonw/status/1174712746157326336"&gt;@simonw&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/genetics"&gt;genetics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sql"&gt;sql&lt;/a&gt;&lt;/p&gt;



</summary><category term="genetics"/><category term="sql"/></entry><entry><title>genome-to-sqlite</title><link href="https://simonwillison.net/2019/Sep/19/genome-to-sqlite/#atom-tag" rel="alternate"/><published>2019-09-19T15:58:01+00:00</published><updated>2019-09-19T15:58:01+00:00</updated><id>https://simonwillison.net/2019/Sep/19/genome-to-sqlite/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/dogsheep/genome-to-sqlite"&gt;genome-to-sqlite&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I just found out 23andMe let you export your genome as a zipped TSV file, so I wrote a little Python command-line tool to import it into a SQLite database.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/genetics"&gt;genetics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;&lt;/p&gt;



</summary><category term="genetics"/><category term="projects"/><category term="sqlite"/><category term="datasette"/></entry><entry><title>How Grandmas May Give Kids an Evolutionary Edge</title><link href="https://simonwillison.net/2009/Nov/16/grandmas/#atom-tag" rel="alternate"/><published>2009-11-16T18:35:48+00:00</published><updated>2009-11-16T18:35:48+00:00</updated><id>https://simonwillison.net/2009/Nov/16/grandmas/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.newsweek.com/id/222472"&gt;How Grandmas May Give Kids an Evolutionary Edge&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Absolutely fascinating: XY v.s. XX chromosomes mean that paternal grandmothers have a 50% chance of sharing an X with their son’s daughters, but a 0% chance of sharing an X with their son’s sons. A study on survival rates of 43,000 children found a corresponding correlation with the proximity to a paternal or maternal grandmother. Men: Dad’s Mum is out to get you!


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/chromosomes"&gt;chromosomes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/genetics"&gt;genetics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/grandmas"&gt;grandmas&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/science"&gt;science&lt;/a&gt;&lt;/p&gt;



</summary><category term="chromosomes"/><category term="genetics"/><category term="grandmas"/><category term="science"/></entry></feed>