<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: teaching</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/teaching.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-12-21T05:26:09+00:00</updated><author><name>Simon Willison</name></author><entry><title>Quoting Shriram Krishnamurthi</title><link href="https://simonwillison.net/2025/Dec/21/shriram-krishnamurthi/#atom-tag" rel="alternate"/><published>2025-12-21T05:26:09+00:00</published><updated>2025-12-21T05:26:09+00:00</updated><id>https://simonwillison.net/2025/Dec/21/shriram-krishnamurthi/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://parentheticallyspeaking.org/articles/pedagogy-recommendations/"&gt;&lt;p&gt;Every time you are inclined to use the word “teach”, replace it with “learn”. That is, instead of saying, “I teach”, say “They learn”. It’s very easy to determine what you teach; you can just fill slides with text and claim to have taught. Shift your focus to determining how you know whether they learned what you claim to have taught (or indeed anything at all!). That is &lt;em&gt;much&lt;/em&gt; harder, but that is also the real objective of any educator.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://parentheticallyspeaking.org/articles/pedagogy-recommendations/"&gt;Shriram Krishnamurthi&lt;/a&gt;, Pedagogy Recommendations&lt;/p&gt;

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



</summary><category term="teaching"/></entry><entry><title>Quoting François Chollet</title><link href="https://simonwillison.net/2025/Oct/30/francois-chollet/#atom-tag" rel="alternate"/><published>2025-10-30T02:37:18+00:00</published><updated>2025-10-30T02:37:18+00:00</updated><id>https://simonwillison.net/2025/Oct/30/francois-chollet/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://x.com/fchollet/status/1983279755823853724"&gt;&lt;p&gt;To really understand a concept, you have to "invent" it yourself in some capacity. Understanding doesn't come from passive content consumption. It is always self-built. It is an active, high-agency, self-directed process of creating and debugging your own mental models.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://x.com/fchollet/status/1983279755823853724"&gt;François Chollet&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/teaching"&gt;teaching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/francois-chollet"&gt;francois-chollet&lt;/a&gt;&lt;/p&gt;



</summary><category term="teaching"/><category term="francois-chollet"/></entry><entry><title>Simulating History with ChatGPT</title><link href="https://simonwillison.net/2023/Sep/13/simulating-history-with-chatgpt/#atom-tag" rel="alternate"/><published>2023-09-13T03:36:48+00:00</published><updated>2023-09-13T03:36:48+00:00</updated><id>https://simonwillison.net/2023/Sep/13/simulating-history-with-chatgpt/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://resobscura.substack.com/p/simulating-history-with-chatgpt"&gt;Simulating History with ChatGPT&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Absolutely fascinating new entry in the using-ChatGPT-to-teach genre. Benjamin Breen teaches history at UC Santa Cruz, and has been developing a sophisticated approach to using ChatGPT to play out role-playing scenarios involving different periods of history. His students are challenged to participate in them, then pick them apart—fact-checking details from the scenario and building critiques of the perspectives demonstrated by the language model. There are so many quotable snippets in here, I recommend reading the whole thing.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=37480155"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/education"&gt;education&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/teaching"&gt;teaching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/chatgpt"&gt;chatgpt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/benjamin-breen"&gt;benjamin-breen&lt;/a&gt;&lt;/p&gt;



</summary><category term="education"/><category term="teaching"/><category term="ai"/><category term="generative-ai"/><category term="chatgpt"/><category term="llms"/><category term="benjamin-breen"/></entry><entry><title>Teaching News Apps with Codespaces</title><link href="https://simonwillison.net/2023/Mar/23/teaching-news-apps-with-codespaces/#atom-tag" rel="alternate"/><published>2023-03-23T00:39:33+00:00</published><updated>2023-03-23T00:39:33+00:00</updated><id>https://simonwillison.net/2023/Mar/23/teaching-news-apps-with-codespaces/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.thescoop.org/archives/2023/03/22/teaching-newsapps-with-codespaces/"&gt;Teaching News Apps with Codespaces&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Derek Willis used GitHub Codespaces for the latest data journalism class he taught, and it eliminated the painful process of trying to get students on an assortment of Mac, Windows and Chromebook laptops all to a point where they could start working and learning together.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://newsie.social/@derekwillis/110069743946512179"&gt;@derekwillis&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/data-journalism"&gt;data-journalism&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/derek-willis"&gt;derek-willis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github"&gt;github&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/teaching"&gt;teaching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github-codespaces"&gt;github-codespaces&lt;/a&gt;&lt;/p&gt;



</summary><category term="data-journalism"/><category term="derek-willis"/><category term="github"/><category term="teaching"/><category term="github-codespaces"/></entry><entry><title>Weeknotes: git-history, created for a Git scraping workshop</title><link href="https://simonwillison.net/2021/Nov/15/weeknotes-git-history/#atom-tag" rel="alternate"/><published>2021-11-15T04:10:50+00:00</published><updated>2021-11-15T04:10:50+00:00</updated><id>https://simonwillison.net/2021/Nov/15/weeknotes-git-history/#atom-tag</id><summary type="html">
    &lt;p&gt;My main project this week was a 90 minute workshop I delivered about Git scraping at &lt;a href="https://escoladedados.org/coda2021/"&gt;Coda.Br 2021&lt;/a&gt;, a Brazilian data journalism conference, on Friday. This inspired the creation of a brand new tool, &lt;strong&gt;git-history&lt;/strong&gt;, plus smaller improvements to a range of other projects.&lt;/p&gt;
&lt;h4&gt;git-history&lt;/h4&gt;
&lt;p&gt;I still need to do a detailed write-up of this one (update: &lt;a href="https://simonwillison.net/2021/Dec/7/git-history/"&gt;git-history: a tool for analyzing scraped data collected using Git and SQLite&lt;/a&gt;), but on Thursday I released a brand new tool called &lt;a href="https://datasette.io/tools/git-history"&gt;git-history&lt;/a&gt;, which I describe as "tools for analyzing Git history using SQLite".&lt;/p&gt;
&lt;p&gt;This tool is the missing link in the &lt;a href="https://simonwillison.net/2020/Oct/9/git-scraping/"&gt;Git scraping pattern&lt;/a&gt; I described here last October.&lt;/p&gt;
&lt;p&gt;Git scraping is the technique of regularly scraping an online source of information and writing the results to a file in a Git repository... which automatically gives you a full revision history of changes made to that data source over time.&lt;/p&gt;
&lt;p&gt;The missing piece has always been what to do next: how do you turn a commit history of changes to a JSON or CSV file into a data source that can be used to answer questions about how that file changed over time?&lt;/p&gt;
&lt;p&gt;I've written one-off Python scripts for this a few times (here's &lt;a href="https://github.com/simonw/cdc-vaccination-history/blob/6f6bcb9437c0d44c4bcf94c111c631cc50bc2744/build_database.py"&gt;my CDC vaccinations one&lt;/a&gt;, for example), but giving an interactive workshop about the technique finally inspired me to build a tool to help.&lt;/p&gt;
&lt;p&gt;The tool has &lt;a href="https://datasette.io/tools/git-history"&gt;a comprehensive README&lt;/a&gt;, but the short version is that you can take a JSON (or CSV) file in a repository that has been tracking changes to some items over time and run the following to load all of the different versions into a SQLite database file for analysis with &lt;a href="https://datasette.io/"&gt;Datasette&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git-convert file incidents.db incidents.json --id IncidentID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This assumes that &lt;code&gt;incidents.json&lt;/code&gt; contains a JSON array of incidents (reported fires for example) and that each incident has a &lt;code&gt;IncidentID&lt;/code&gt; identifier key. It will then loop through the Git history of that file right from the start, creating an &lt;code&gt;item_versions&lt;/code&gt; table that tracks every change made to each of those items - using &lt;code&gt;IncidentID&lt;/code&gt; to decide if a row represents a new incident or an update to a previous one.&lt;/p&gt;
&lt;p&gt;I have a few more improvements I want to make before I start more widely promoting this, but it's already really useful. I've had a lot of fun running it against example repos from the &lt;a href="https://github.com/topics/git-scraping"&gt;git-scraping GitHub topic&lt;/a&gt; (now at 202 repos and counting).&lt;/p&gt;
&lt;h4&gt;Workshop: Raspando dados com o GitHub Actions e analisando com Datasette&lt;/h4&gt;
&lt;p&gt;The workshop I gave at the conference was live-translated into Portuguese, which is really exciting! I'm looking forward to watching the video when it comes out and seeing how well that worked.&lt;/p&gt;
&lt;p&gt;The title translates to "Scraping data with GitHub Actions and analyzing with Datasette", and it was the first time I've given a workshop that combines Git scraping and Datasette - hence the development of the new git-history tool to help tie the two together.&lt;/p&gt;
&lt;p&gt;I think it went really well. I put together four detailed exercises for the attendees, and then worked through each one live with the goal of attendees working through them at the same time - a method I learned from the Carpentries training course I took &lt;a href="https://simonwillison.net/2020/Sep/26/weeknotes-software-carpentry-sqlite/"&gt;last year&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Four exercises turns out to be exactly right for 90 minutes, with reasonable time for an introduction and some extra material and questions at the end.&lt;/p&gt;
&lt;p&gt;The worst part of running a workshop is inevitably the part where you try and get everyone setup with a functional development environment on their own machines (see &lt;a href="https://xkcd.com/1987/"&gt;XKCD 1987&lt;/a&gt;). This time round I skipped that entirely by encouraging my students to use &lt;strong&gt;&lt;a href="https://gitpod.io/"&gt;GitPod&lt;/a&gt;&lt;/strong&gt;, which provides free browser-based cloud development environments running Linux, with a browser-embedded VS Code editor and terminal running on top.&lt;/p&gt;

&lt;p&gt;&lt;img style="max-width: 100%" src="https://static.simonwillison.net/static/2021/start-datasette-gitpod.gif" alt="Animated demo of GitPod showing how to run Datasette and have it proxy a port" /&gt;&lt;/p&gt;

&lt;p&gt;(It's similar to &lt;a href="https://github.com/features/codespaces"&gt;GitHub Codespaces&lt;/a&gt;, but Codespaces is not yet available to free customers outside of the beta.)&lt;/p&gt;
&lt;p&gt;I demonstrated all of the exercises using GitPod myself during the workshop, and ensured that they could be entirely completed through that environment, with no laptop software needed at all.&lt;/p&gt;
&lt;p&gt;This worked &lt;strong&gt;so well&lt;/strong&gt;. Not having to worry about development environments makes workshops massively more productive. I will absolutely be doing this again in the future.&lt;/p&gt;
&lt;p&gt;The workshop exercises are available &lt;a href="https://docs.google.com/document/d/1TCatZP5gQNfFjZJ5M77wMlf9u_05Z3BZnjp6t1SA6UU/edit"&gt;in this Google Doc&lt;/a&gt;, and I hope to extract some of them out into official tutorials for various tools later on.&lt;/p&gt;
&lt;h4&gt;Datasette 0.58.2&lt;/h4&gt;
&lt;p&gt;Yesterday was Datasette's fourth birthday - the four year anniversary of &lt;a href="https://simonwillison.net/2017/Nov/13/datasette/"&gt;the initial release announcement&lt;/a&gt;! I celebrated by releasing a minor bug-fix, &lt;a href="https://github.com/simonw/datasette/releases/tag/0.59.2"&gt;Datasette 0.58.2&lt;/a&gt;, the release notes for which are quoted below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Column names with a leading underscore now work correctly when used as a facet. (&lt;a href="https://github.com/simonw/datasette/issues/1506"&gt;#1506&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Applying &lt;code&gt;?_nocol=&lt;/code&gt; to a column no longer removes that column from the filtering interface. (&lt;a href="https://github.com/simonw/datasette/issues/1503"&gt;#1503&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Official Datasette Docker container now uses Debian Bullseye as the base image. (&lt;a href="https://github.com/simonw/datasette/issues/1497"&gt;#1497&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That first change was inspired by ongoing work on &lt;code&gt;git-history&lt;/code&gt;, where I decided to use a &lt;code&gt;_id&lt;/code&gt; underscoper prefix pattern for columns that were reserved for use by that tool in order &lt;a href="https://github.com/simonw/git-history/issues/14"&gt;to avoid clashing with column names&lt;/a&gt; in the provided source data.&lt;/p&gt;
&lt;h4&gt;sqlite-utils 3.18&lt;/h4&gt;
&lt;p&gt;Today I released &lt;a href="https://sqlite-utils.datasette.io/en/stable/changelog.html#v3-18"&gt;sqlite-utils 3.18&lt;/a&gt; - initially also to provide a feature I wanted for &lt;code&gt;git-history&lt;/code&gt; (a way to &lt;a href="https://github.com/simonw/sqlite-utils/issues/339"&gt;populate additional columns&lt;/a&gt; when creating a row using &lt;code&gt;table.lookup()&lt;/code&gt;) but I also closed some bug reports and landed some small pull requests that had come in since 3.17.&lt;/p&gt;
&lt;h4&gt;s3-credentials 0.5&lt;/h4&gt;
&lt;p&gt;Earlier in the week I released &lt;a href="https://github.com/simonw/s3-credentials/releases/tag/0.5"&gt;version 0.5&lt;/a&gt; of &lt;a href="https://github.com/simonw/s3-credentials"&gt;s3-credentials&lt;/a&gt; - my CLI tool for creating read-only, read-write or write-only AWS credentials for a specific S3 bucket.&lt;/p&gt;
&lt;p&gt;The biggest new feature is the ability to create temporary credentials, that expire after a given time limit.&lt;/p&gt;
&lt;p&gt;This is achived using &lt;code&gt;STS.assume_role()&lt;/code&gt;, where STS is &lt;a href="https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html"&gt;Security Token Service&lt;/a&gt;. I've been wanting to learn this API for quite a while now.&lt;/p&gt;
&lt;p&gt;Assume role comes with some limitations: tokens must live between 15 minutes and 12 hours, and you need to first create a role that you can assume. In creating those credentials you can define an additional policy document, which is how I scope down the token I'm creating to only allow a specific level of access to a specific S3 bucket.&lt;/p&gt;
&lt;p&gt;I've learned a huge amount about AWS, IAM and S3 through developming this project. I think I'm finally overcoming my multi-year phobia of anything involving IAM!&lt;/p&gt;
&lt;h4&gt;Releases this week&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/sqlite-utils"&gt;sqlite-utils&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/sqlite-utils/releases/tag/3.18"&gt;3.18&lt;/a&gt; - (&lt;a href="https://github.com/simonw/sqlite-utils/releases"&gt;88 releases total&lt;/a&gt;) - 2021-11-15
&lt;br /&gt;Python CLI utility and library for manipulating SQLite databases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/datasette"&gt;datasette&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/datasette/releases/tag/0.59.2"&gt;0.59.2&lt;/a&gt; - (&lt;a href="https://github.com/simonw/datasette/releases"&gt;100 releases total&lt;/a&gt;) - 2021-11-14
&lt;br /&gt;An open source multi-tool for exploring and publishing data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/datasette-hello-world"&gt;datasette-hello-world&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/datasette-hello-world/releases/tag/0.1.1"&gt;0.1.1&lt;/a&gt; - (&lt;a href="https://github.com/simonw/datasette-hello-world/releases"&gt;2 releases total&lt;/a&gt;) - 2021-11-14
&lt;br /&gt;The hello world of Datasette plugins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/git-history"&gt;git-history&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/git-history/releases/tag/0.3.1"&gt;0.3.1&lt;/a&gt; - (&lt;a href="https://github.com/simonw/git-history/releases"&gt;5 releases total&lt;/a&gt;) - 2021-11-12
&lt;br /&gt;Tools for analyzing Git history using SQLite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/s3-credentials"&gt;s3-credentials&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/s3-credentials/releases/tag/0.5"&gt;0.5&lt;/a&gt; - (&lt;a href="https://github.com/simonw/s3-credentials/releases"&gt;5 releases total&lt;/a&gt;) - 2021-11-11
&lt;br /&gt;A tool for creating credentials for accessing S3 buckets&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;TIL this week&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/kubernetes/basic-datasette-in-kubernetes"&gt;Basic Datasette in Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/deno/annotated-deno-deploy-demo"&gt;Annotated code for a demo of WebSocket chat in Deno Deploy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/javascript/tesseract-ocr-javascript"&gt;Using Tesseract.js to OCR every image on a page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/aws"&gt;aws&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/s3"&gt;s3&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/my-talks"&gt;my-talks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/teaching"&gt;teaching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/weeknotes"&gt;weeknotes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/git-scraping"&gt;git-scraping&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite-utils"&gt;sqlite-utils&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/git-history"&gt;git-history&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/s3-credentials"&gt;s3-credentials&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="aws"/><category term="projects"/><category term="s3"/><category term="my-talks"/><category term="teaching"/><category term="datasette"/><category term="weeknotes"/><category term="git-scraping"/><category term="sqlite-utils"/><category term="git-history"/><category term="s3-credentials"/></entry><entry><title>File not found: A generation that grew up with Google is forcing professors to rethink their lesson plans</title><link href="https://simonwillison.net/2021/Sep/23/file-not-found/#atom-tag" rel="alternate"/><published>2021-09-23T22:49:30+00:00</published><updated>2021-09-23T22:49:30+00:00</updated><id>https://simonwillison.net/2021/Sep/23/file-not-found/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.theverge.com/22684730/students-file-folder-directory-structure-education-gen-z"&gt;File not found: A generation that grew up with Google is forcing professors to rethink their lesson plans&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
This is fascinating: as-of 2017 university instructors have been increasingly encountering students who have absolutely no idea how files and folders on a computer work. The new generation has a completely different mental model of how applications work, where everything is found using search and data mostly lives inside the application that you use to manipulate it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Gradually, Garland came to the same realization that many of her fellow educators have reached in the past four years: the concept of file folders and directories, essential to previous generations’ understanding of computers, is gibberish to many modern students.&lt;/p&gt;
&lt;/blockquote&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/simonw/status/1440725351949213700"&gt;@dancow&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/teaching"&gt;teaching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/usability"&gt;usability&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/computer-literacy"&gt;computer-literacy&lt;/a&gt;&lt;/p&gt;



</summary><category term="teaching"/><category term="usability"/><category term="computer-literacy"/></entry><entry><title>No feigning surprise</title><link href="https://simonwillison.net/2021/May/17/no-feigning-surprise/#atom-tag" rel="alternate"/><published>2021-05-17T16:30:53+00:00</published><updated>2021-05-17T16:30:53+00:00</updated><id>https://simonwillison.net/2021/May/17/no-feigning-surprise/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://jvns.ca/blog/2017/04/27/no-feigning-surprise/"&gt;No feigning surprise&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Don’t feign surprise if someone doesn’t know something that you think they should know. Even better: even if you are surprised, don’t let them know! “When people feign surprise, it’s usually to make them feel better about themselves and others feel worse.”

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/cameronbardell/status/1394130798270369794"&gt;@cameronbardell&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/communication"&gt;communication&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/teaching"&gt;teaching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/julia-evans"&gt;julia-evans&lt;/a&gt;&lt;/p&gt;



</summary><category term="communication"/><category term="teaching"/><category term="julia-evans"/></entry><entry><title>Quoting Joel Goldberg</title><link href="https://simonwillison.net/2021/Jan/6/joel-goldberg/#atom-tag" rel="alternate"/><published>2021-01-06T19:43:02+00:00</published><updated>2021-01-06T19:43:02+00:00</updated><id>https://simonwillison.net/2021/Jan/6/joel-goldberg/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://www.bti360.com/what-ive-learned-in-45-years-in-the-software-industry/"&gt;&lt;p&gt;When you know something it is almost impossible to imagine what it is like not to know that thing. This is the curse of knowledge, and it is the root of countless misunderstandings and inefficiencies. Smart people who are comfortable with complexity can be especially prone to it!&lt;/p&gt;
&lt;p&gt;If you don’t guard against the curse of knowledge it has the potential to obfuscate all forms of communication, including code. The more specialized your work, the greater the risk that you will communicate in ways that are incomprehensible to the uninitiated.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://www.bti360.com/what-ive-learned-in-45-years-in-the-software-industry/"&gt;Joel Goldberg&lt;/a&gt;&lt;/p&gt;

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



</summary><category term="teaching"/></entry><entry><title>Weeknotes: software carpentry, compiling modules for SQLite</title><link href="https://simonwillison.net/2020/Sep/26/weeknotes-software-carpentry-sqlite/#atom-tag" rel="alternate"/><published>2020-09-26T02:30:24+00:00</published><updated>2020-09-26T02:30:24+00:00</updated><id>https://simonwillison.net/2020/Sep/26/weeknotes-software-carpentry-sqlite/#atom-tag</id><summary type="html">
    &lt;p&gt;This week I completed the Software Carpentry instructor training course, added two foundational features to &lt;code&gt;sqlite-utils&lt;/code&gt; and learned how to compile modules for SQLite.&lt;/p&gt;
&lt;h4&gt;Software Carpentry&lt;/h4&gt;
&lt;p&gt;This week I took the two day &lt;a href="https://carpentries.github.io/instructor-training/"&gt;instructor training course&lt;/a&gt; put on by Software Carpentry. I've been wanting to do this for over a year now, so I'm excited to have finally found the time to attend the workshop.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://carpentries.org/"&gt;The Carpentries&lt;/a&gt; is a really interesting non-profit organization. Their mission is to "teach foundational coding and data science skills to researchers worldwide" - but I've always thought of them as teaching software engineering fundamentals to scientists - things like version control!&lt;/p&gt;
&lt;p&gt;It turns out I've been &lt;a href="https://simonwillison.net/search/?q=carpentry"&gt;following the carpentries project&lt;/a&gt; for fifteen years now, ever since their founder Greg Wilson started writing about his efforts to bring software engineering to scientists &lt;a href="https://third-bit.com/archive/"&gt;on his blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As you would expect from an organization that specializes in workshop education, the workshop they put on teaching you how to run workshops is top notch. Their &lt;a href="https://datacarpentry.org/lessons/"&gt;curriculum materials&lt;/a&gt;, forged by a process of continuing tweaks over hundreds if not thousands of presentations, are superb. I aspire to produce educational documentation this good some day.&lt;/p&gt;
&lt;p&gt;An interesting aspect of Carpentries is that every workshop is presented using live coding - no slides! The instructor works through the same material as the learners, talking through each line of code as they run it. The kind of thing you would normally use slides for (diagrams etc) instead lives in the workshop handouts. Take a look through their &lt;a href="https://swcarpentry.github.io/sql-novice-survey/"&gt;Databases and SQL&lt;/a&gt; course to get an idea of how that works.&lt;/p&gt;
&lt;p&gt;I have to complete a couple more steps, but once I've done that I'll be a certified instructor for the program - which means I can volunteer to help run their workshops in the future.&lt;/p&gt;
&lt;h4 id="sqlite-modules"&gt;SQLite3 modules&lt;/h4&gt;
&lt;p&gt;I had two encounters with compiled SQLite modules this week.&lt;/p&gt;
&lt;p&gt;One of my favourite lesser-known features of PostgreSQL is &lt;a href="https://about.gitlab.com/blog/2016/03/18/fast-search-using-postgresql-trigram-indexes/"&gt;trigram indexes&lt;/a&gt;. The short version is: they make &lt;code&gt;where text like '%something%'&lt;/code&gt; queries run crazy-fast. Normal indexes just speed up &lt;code&gt;prefix%&lt;/code&gt; like searches, but trigrams work for strings in the middle of other strings as well.&lt;/p&gt;
&lt;p&gt;I started a thread on the official SQLite forum &lt;a href="https://sqlite.org/forum/forumpost/c230760fdf?t=h"&gt;asking about trigram index support&lt;/a&gt;, and proposed that maybe it could be achieveable using a custom SQLite FTS tokenizer. Core SQLite maintainer Dan Kennedy replied with &lt;a href="https://sqlite.org/forum/forumpost/ca90da691a?t=h"&gt;a complete, working implementation of exactly that&lt;/a&gt;, written in C!&lt;/p&gt;
&lt;p&gt;With Dan's permission I've published his code in a &lt;a href="https://github.com/simonw/sqlite-fts5-trigram/"&gt;sqlite-fts5-trigram&lt;/a&gt; GitHub repository. In doing so I figured out &lt;a href="https://github.com/simonw/sqlite-fts5-trigram/blob/main/build-macos.sh"&gt;how to build it&lt;/a&gt; for macOS, and then hooked that build script up to &lt;a href="https://github.com/simonw/sqlite-fts5-trigram/blob/main/.github/workflows/build-macos.yml"&gt;a GitHub Actions workflow&lt;/a&gt; that produces a compiled &lt;code&gt;ftstri.so&lt;/code&gt; module ready for anyone on macOS to run themselves.&lt;/p&gt;
&lt;p&gt;Just one problem: it turns out binary modules like that need to be signed for macOS before anyone can run them. That's a step beyond me at the moment, but I may revisit that in the future.&lt;/p&gt;
&lt;p&gt;The other complied module I learned to use this week is &lt;code&gt;spellfix.c&lt;/code&gt;, see my TIL &lt;a href="https://til.simonwillison.net/til/til/sqlite_compile-spellfix-osx.md"&gt;Compiling the SQLite spellfix.c module on macOS&lt;/a&gt;. I needed these because I've started expereminting with &lt;a href="https://www.plex.tv/"&gt;Plex&lt;/a&gt; as a home media server, and it turns out Plex runs on SQLite! The catch is that it uses the &lt;code&gt;spellfix&lt;/code&gt; module, which means you can't open the Plex database in Datasette without first compiling that module for use with &lt;code&gt;--load-extension&lt;/code&gt; - see the TIL for details.&lt;/p&gt;
&lt;h4 id="weeknotes-sqlite-utils"&gt;sqlite-utils&lt;/h4&gt;
&lt;p&gt;I shipped &lt;code&gt;sqlite-utils&lt;/code&gt; 2.20 and 2.21, and wrote about the big new features in two blog entries here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://simonwillison.net/2020/Sep/23/sqlite-utils-extract/"&gt;Refactoring databases with sqlite-utils extract&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://simonwillison.net/2020/Sep/23/sqlite-advanced-alter-table/"&gt;Executing advanced ALTER TABLE operations in SQLite&lt;/a&gt; using &lt;code&gt;sqlite-utils transform&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The extract operation in sqlite-utils 2.20 was taking 12 minutes to execute against a table with 680,000 rows. I had &lt;a href="https://github.com/simonw/sqlite-utils/issues/172 "&gt;a rethink of how it worked&lt;/a&gt; and got that down to just 4 seconds in sqlite-utils 2.21!&lt;/p&gt;
&lt;p&gt;I worked on these as part of my ongoing exploration of Datasette and &lt;code&gt;sqlite-utils&lt;/code&gt; as tools for cleaning up and refactoring data. They fill some key holes in the tooling I've built so far.&lt;/p&gt;
&lt;p&gt;I'm already using &lt;em&gt;transform&lt;/em&gt; to build out the next phase of my &lt;code&gt;datasette-edit-tables&lt;/code&gt; plugin. See &lt;a href="https://github.com/simonw/datasette-edit-tables/issues/11"&gt;issue #11&lt;/a&gt; for notes on work-in-progress support for editing table schemas directly in Datasette.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2020/wip-edit-tables.png" alt="Screenshot of datasette-edit-tables showing an interface for editing and re-ordering columns" style="max-width: 100%" /&gt;&lt;/p&gt;
&lt;h4&gt;TIL this week&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/til/til/jinja_autoescape-template.md"&gt;Turning on Jinja autoescaping when using Template() directly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/til/til/sqlite_compile-spellfix-osx.md"&gt;Compiling the SQLite spellfix.c module on macOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/til/til/python_click-option-names.md"&gt;Understanding option names in Click&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Releases this week&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonw/sqlite-utils/releases/tag/2.21"&gt;sqlite-utils 2.21&lt;/a&gt; - 2020-09-24&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonw/sqlite-utils/releases/tag/2.20"&gt;sqlite-utils 2.20&lt;/a&gt; - 2020-09-23&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dogsheep/dogsheep-beta/releases/tag/0.9a0"&gt;dogsheep-beta 0.9a0&lt;/a&gt; - 2020-09-20&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonw/sqlite-utils/releases/tag/2.19"&gt;sqlite-utils 2.19&lt;/a&gt; - 2020-09-20&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dogsheep/dogsheep-beta/releases/tag/0.8"&gt;dogsheep-beta 0.8&lt;/a&gt; - 2020-09-18&lt;/li&gt;
&lt;/ul&gt;
    
        &lt;p&gt;Tags: &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/teaching"&gt;teaching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/weeknotes"&gt;weeknotes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite-utils"&gt;sqlite-utils&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="projects"/><category term="sqlite"/><category term="teaching"/><category term="datasette"/><category term="weeknotes"/><category term="sqlite-utils"/></entry><entry><title>Weeknotes: Covid-19, First Python Notebook, more Dogsheep, Tailscale</title><link href="https://simonwillison.net/2020/Apr/1/weeknotes/#atom-tag" rel="alternate"/><published>2020-04-01T20:29:59+00:00</published><updated>2020-04-01T20:29:59+00:00</updated><id>https://simonwillison.net/2020/Apr/1/weeknotes/#atom-tag</id><summary type="html">
    &lt;p&gt;My &lt;a href="https://covid-19.datasettes.com/"&gt;covid-19.datasettes.com&lt;/a&gt; project publishes information on COVID-19 cases around the world. The project started out using data &lt;a href="https://github.com/CSSEGISandData/COVID-19"&gt;from Johns Hopkins CSSE&lt;/a&gt;, but last week the New York Times &lt;a href="https://www.nytimes.com/article/coronavirus-county-data-us.html"&gt;started publishing&lt;/a&gt; high quality USA county- and state-level daily numbers to their &lt;a href="https://github.com/nytimes/covid-19-data"&gt;own repository&lt;/a&gt;. Here's &lt;a href="https://github.com/simonw/covid-19-datasette/commit/56e1644390e5d01ff67c61d6c165749093675632"&gt;the change&lt;/a&gt; that added the NY Times data.&lt;/p&gt;

&lt;p&gt;It's very easy to use this data to accidentally build misleading things. I've been &lt;a href="https://github.com/simonw/covid-19-datasette/blob/master/README.md"&gt;updating the README&lt;/a&gt; with links about this - my current favourite is &lt;a href="https://fivethirtyeight.com/features/why-its-so-freaking-hard-to-make-a-good-covid-19-model/"&gt;Why It’s So Freaking Hard To Make A Good COVID-19 Model&lt;/a&gt; by  Maggie Koerth, Laura Bronner and Jasmine Mithani at FiveThirtyEight.&lt;/p&gt;

&lt;h3 id="weeknotes-first-python-notebook"&gt;First Python Notebook&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://twitter.com/palewire"&gt;Ben Welsh&lt;/a&gt; from the LA Times teaches a course called &lt;a href="https://www.firstpythonnotebook.org/"&gt;First Python Notebook&lt;/a&gt; at journalism conferences such as NICAR. He ran a free online version the course last weekend, and I offered to help out as a TA.&lt;/p&gt;

&lt;p&gt;Most of the help I provided came before the course: Ben asked attendees to confirm that they had working installations of Python 3 and pipenv, and if they didn't volunteers such as myself would step in to help. I had Zoom and email conversations with at least ten people to help them get their environments into shape.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://xkcd.com/1987/"&gt;This XKCD&lt;/a&gt; neatly summarizes the problem:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2020/python_environment_2x.png" alt="XKCD Python Environments" style="max-width: 100%" /&gt;&lt;/p&gt;

&lt;p&gt;One of the most common problems I had to debug was PATH issues: people had installed the software, but due to various environmental differences &lt;code&gt;python3&lt;/code&gt; and &lt;code&gt;pipenv&lt;/code&gt; weren't available on the PATH. Talking people through the obscurities of creating a &lt;code&gt;~/.bashrc&lt;/code&gt; file and using it to define a PATH over-ride really helps emphasize how arcane this kind of knowledge is.&lt;/p&gt;

&lt;p&gt;I enjoyed this comment:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;"Welcome to intro to Tennis. In the first two weeks, we'll discuss how to rig a net and resurface a court." - &lt;a href="https://twitter.com/ClausWilke/status/1234941405883138048"&gt;Claus Wilke&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Ben's course itself is hands down the best introduction to Python from a Data Journalism perspective I have ever seen. Within an hour of starting the students are using Pandas in a Jupyter notebook to find interesting discrepancies in California campaign finance data.&lt;/p&gt;

&lt;p&gt;If you want to check it out yourself, the entire four hour workshop &lt;a href="https://twitter.com/palewire/status/1244410903279177728"&gt;is now on YouTube&lt;/a&gt; and closely follows the material on &lt;a href="https://www.firstpythonnotebook.org/"&gt;firstpythonnotebook.org&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id="weeknotes-coronavirus-diary"&gt;Coronavirus Diary&lt;/h3&gt;

&lt;p&gt;We are clearly living through a notable and very painful period of history right now. On the 19th of March (just under two weeks ago, but time is moving both really fast and incredibly slowly right now) I started a personal diary - something I've never done before. It lives in an Apple Note and I'm adding around a dozen paragraphs to it every day. I think it's helping. I'm sure it will be interesting to look back on in a few years time.&lt;/p&gt;

&lt;h3 id="weeknotes-dogsheep"&gt;Dogsheep&lt;/h3&gt;

&lt;p&gt;Much of my development work this past week has gone into my &lt;a href="https://github.com/dogsheep"&gt;Dogsheep&lt;/a&gt; suite of tools for personal analytics.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;I upgraded the entire family of tools for compatibility with &lt;a href="https://sqlite-utils.readthedocs.io/en/stable/changelog.html#v2"&gt;sqlite-utils 2.x&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/dogsheep/pocket-to-sqlite"&gt;pocket-to-sqlite&lt;/a&gt; got a major upgrade: it now fetches items using Pocket's API pagination (previously it just tried to pull in 5,000 items in one go) and has the ability to only fetch new items. As a result I'm now running it from cron in my personal Dogsheep instance, so "Save to Pocket" is now my preferred Dogsheep-compatible way of bookmarking content.&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/dogsheep/twitter-to-sqlite"&gt;twitter-to-sqlite&lt;/a&gt; got a couple of important new features in &lt;a href="https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.20"&gt;release 0.20&lt;/a&gt;. I fixed &lt;a href="https://github.com/dogsheep/twitter-to-sqlite/issues/39"&gt;a nasty bug&lt;/a&gt; in the &lt;code&gt;--since&lt;/code&gt; flag where retweets from other accounts could cause new tweets from an account to be ignored. I also added a new &lt;code&gt;count_history&lt;/code&gt; table which automatically tracks changes to a Twitter user's friends, follower and listed counts over time (&lt;a href="https://github.com/dogsheep/twitter-to-sqlite/issues/40"&gt;#40&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;I'm also now using Dogsheep for some journalism! I'm working with the &lt;a href="https://biglocalnews.org/"&gt;Big Local News&lt;/a&gt; team at Stanford to help track and archive tweets by a number of different US politicians and health departments relating to the ongoing pandemic. This collaboration resulted in the above improvements to &lt;code&gt;twitter-to-sqlite&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id="weeknotes-tailscale"&gt;Tailscale&lt;/h3&gt;

&lt;p&gt;My personal Dogsheep is currently protected by &lt;a href="https://simonwillison.net/2019/Oct/5/client-side-certificate-authentication-nginx/"&gt;client certificates&lt;/a&gt;, so only my personal laptop and iPhone (with the right certificates installed) can connect to the web server it is running on.&lt;/p&gt;

&lt;p&gt;I spent a bit of time this week playing with &lt;a href="https://tailscale.com/"&gt;Tailscale&lt;/a&gt;, and I'm &lt;em&gt;really&lt;/em&gt; impressed by it.&lt;/p&gt;

&lt;p&gt;Tailscale is a commercial company built on top of &lt;a href="https://www.wireguard.com/"&gt;WireGuard&lt;/a&gt;, the new approach to VPN tunnels which just &lt;a href="https://arstechnica.com/gadgets/2020/03/wireguard-vpn-makes-it-to-1-0-0-and-into-the-next-linux-kernel/"&gt;got merged&lt;/a&gt; into the Linux 5.6 kernel. Tailscale first caught my attention in January when they &lt;a href="https://bradfitz.com/2020/01/30/joining-tailscale"&gt;hired Brad Fitzpatrick&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;WireGuard lets you form a private network by having individual hosts exchange public/private keys with each other. Tailscale provides software which manages those keys for you, making it trivial to set up a private network between different nodes.&lt;/p&gt;

&lt;p&gt;How trivial? It took me less than ten minutes to get a three-node private network running between my iPhone, laptop and a Linux server. I installed the &lt;a href="https://apps.apple.com/us/app/tailscale/id1470499037?ls=1"&gt;iPhone app&lt;/a&gt;, the &lt;a href="https://tailscale.com/kb/1037/install-ubuntu-1804"&gt;Ubuntu package&lt;/a&gt;, the &lt;a href="https://apps.apple.com/ca/app/tailscale/id1475387142?mt=12"&gt;OS X app&lt;/a&gt;, signed them all into my Google account and I was done.&lt;/p&gt;

&lt;p&gt;Each of those devices now has an additional IP address in the 100.x range which they can use to talk to each other. Tailscale guarantees that the IP address will stay constant for each of them.&lt;/p&gt;

&lt;p&gt;Since the network is public/private key encrypted between the nodes, Tailscale can't see any of my traffic - they're purely acting as a key management mechanism. And it's free: Tailscale charge for networks with multiple users, but a personal network like this is free of charge.&lt;/p&gt;

&lt;p&gt;I'm not running my own personal Dogsheep on it yet, but I'm tempted to switch over. I'd love other people to start running their own personal Dogsheep instances but I'm paranoid about encouraging this when securing them is so important. Tailscale looks like it might be a great solution for making secure personal infrastructure more easily and widely available.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/brad-fitzpatrick"&gt;brad-fitzpatrick&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/data-journalism"&gt;data-journalism&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/teaching"&gt;teaching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dogsheep"&gt;dogsheep&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/weeknotes"&gt;weeknotes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tailscale"&gt;tailscale&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/covid19"&gt;covid19&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ben-welsh"&gt;ben-welsh&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="brad-fitzpatrick"/><category term="data-journalism"/><category term="projects"/><category term="python"/><category term="teaching"/><category term="datasette"/><category term="dogsheep"/><category term="weeknotes"/><category term="tailscale"/><category term="covid19"/><category term="ben-welsh"/></entry><entry><title>Teaching Tech Together</title><link href="https://simonwillison.net/2018/Jul/17/teaching-tech-together/#atom-tag" rel="alternate"/><published>2018-07-17T18:18:14+00:00</published><updated>2018-07-17T18:18:14+00:00</updated><id>https://simonwillison.net/2018/Jul/17/teaching-tech-together/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://teachtogether.tech/en/index.html"&gt;Teaching Tech Together&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A new free book compiled by Greg Wilson about teaching programming, based on the instructor training program developed for the Software Carpentry course over the past six years. This is fantastic—it’s filling in a whole load of holes in my understanding of effective teaching theory.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/gvwilson/status/1018723660272529408"&gt;@gvwilson&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/greg-wilson"&gt;greg-wilson&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/teaching"&gt;teaching&lt;/a&gt;&lt;/p&gt;



</summary><category term="greg-wilson"/><category term="teaching"/></entry><entry><title>Quoting Scott Bedley</title><link href="https://simonwillison.net/2018/Feb/3/scott-bedley/#atom-tag" rel="alternate"/><published>2018-02-03T13:29:32+00:00</published><updated>2018-02-03T13:29:32+00:00</updated><id>https://simonwillison.net/2018/Feb/3/scott-bedley/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://www.vox.com/platform/amp/first-person/2017/3/29/15042692/fake-news-education-election"&gt;&lt;p&gt;Imagine a Simon Says style game where I present an article found on the web on a projector. Students research for two to three minutes, then respond by standing or staying seated to signal if they believe the article is true or fake. My students absolutely loved the game. Some refused to go to recess until I gave them another chance to figure out the next article I had queued.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://www.vox.com/platform/amp/first-person/2017/3/29/15042692/fake-news-education-election"&gt;Scott Bedley&lt;/a&gt;&lt;/p&gt;

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



</summary><category term="teaching"/></entry><entry><title>How to teach technical concepts with cartoons</title><link href="https://simonwillison.net/2017/Oct/28/julia-evans/#atom-tag" rel="alternate"/><published>2017-10-28T14:55:36+00:00</published><updated>2017-10-28T14:55:36+00:00</updated><id>https://simonwillison.net/2017/Oct/28/julia-evans/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://jvns.ca/teach-tech-with-cartoons/"&gt;How to teach technical concepts with cartoons&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Julia Evans: “This post is about a few patterns I use when illustrating ideas about computers. If you are interested in using drawings to teach people about your very favorite computer topics, hopefully this will help you!”


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/teaching"&gt;teaching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/julia-evans"&gt;julia-evans&lt;/a&gt;&lt;/p&gt;



</summary><category term="teaching"/><category term="julia-evans"/></entry><entry><title>Opera Web Standards Curriculum</title><link href="https://simonwillison.net/2008/Jul/8/opera/#atom-tag" rel="alternate"/><published>2008-07-08T14:22:17+00:00</published><updated>2008-07-08T14:22:17+00:00</updated><id>https://simonwillison.net/2008/Jul/8/opera/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.opera.com/wsc/"&gt;Opera Web Standards Curriculum&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Opera commissioned an impressive sequence of articles from a bunch of very talented people to help address the monstrous learning curve for modern client-side development.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/opera"&gt;opera&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/teaching"&gt;teaching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-standards"&gt;web-standards&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webstandardscurriculum"&gt;webstandardscurriculum&lt;/a&gt;&lt;/p&gt;



</summary><category term="opera"/><category term="teaching"/><category term="web-standards"/><category term="webstandardscurriculum"/></entry><entry><title>Python for teaching mathematics</title><link href="https://simonwillison.net/2003/Sep/13/pythonMaths/#atom-tag" rel="alternate"/><published>2003-09-13T12:00:57+00:00</published><updated>2003-09-13T12:00:57+00:00</updated><id>https://simonwillison.net/2003/Sep/13/pythonMaths/#atom-tag</id><summary type="html">
    &lt;p&gt;Kirby Urner provides some &lt;a href="http://wingide.com/pipermail/marketing-python/2003-September/005211.html" title="[marketing-python] Re: How popular is Python? What sort of things can we measure?"&gt;great examples&lt;/a&gt; of how Python can be used as an aid to understanding mathematics on the marketing-python mailing list. I particularly liked this demonstration of Pascal's triangle using Python generators:&lt;/p&gt;

&lt;blockquote cite="http://wingide.com/pipermail/marketing-python/2003-September/005211.html"&gt;&lt;pre&gt;
 &amp;gt;&amp;gt;&amp;gt; def pascal():
         row = [1]
         while True:
            yield row
            row = [i+j for (i,j) in zip([0] + row, row + [0])]


  &amp;gt;&amp;gt;&amp;gt; gen = pascal()
  &amp;gt;&amp;gt;&amp;gt; for i in range(10):
            print gen.next()


  [1]
  [1, 1]
  [1, 2, 1]
  [1, 3, 3, 1]
  [1, 4, 6, 4, 1]
  [1, 5, 10, 10, 5, 1]
  [1, 6, 15, 20, 15, 6, 1]
  [1, 7, 21, 35, 35, 21, 7, 1]
  [1, 8, 28, 56, 70, 56, 28, 8, 1]
  [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
&lt;/pre&gt;&lt;/blockquote&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/mathematics"&gt;mathematics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/teaching"&gt;teaching&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="mathematics"/><category term="python"/><category term="teaching"/></entry><entry><title>Partner as a case study</title><link href="https://simonwillison.net/2002/Nov/6/girlfriendAsCaseStudy/#atom-tag" rel="alternate"/><published>2002-11-06T00:33:01+00:00</published><updated>2002-11-06T00:33:01+00:00</updated><id>https://simonwillison.net/2002/Nov/6/girlfriendAsCaseStudy/#atom-tag</id><summary type="html">
    &lt;p&gt;I've been helping my partner Natalie Downe recreate &lt;a href="http://www.natbat.co.uk/" title="Natalie Downe"&gt;her site&lt;/a&gt; using &lt;acronym title="Cascading Style Sheets"&gt;CSS&lt;/acronym&gt; and structural markup. She's new to web design and has been taking to CSS like a duck to water - as a veteran of Microsoft Word globally defined styles come to her naturally and she took very little time to cotton on to the importance of seperating presentation from content. I've shown her tables as well but she isn't really interested as she sees CSS as a much better solution for general presentation. I'm hoping to help run an  HTML/XHTML/CSS training course at the University early next year with a heavy emphasis on structural markup, standards compliance and accessibility so it's great to have a guinea pig to play with :)&lt;/p&gt;

&lt;p&gt;I also got her started with &lt;acronym title="PHP: Hypertext Preprocessor"&gt;PHP&lt;/acronym&gt;, which she is relishing as a far more pleasant alternative to coding things in Java (the language used on our course at Uni). Her site already features a simple shoutbox system and random quotes engine (both written by her) and she has plans for a whole load of other features. Pretty good going for someone with less than 5 hours of overall PHP experience.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/natalie-downe"&gt;natalie-downe&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/php"&gt;php&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/teaching"&gt;teaching&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="css"/><category term="natalie-downe"/><category term="php"/><category term="teaching"/></entry></feed>