<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: jeff-triplett</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/jeff-triplett.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2024-11-02T15:17:07+00:00</updated><author><name>Simon Willison</name></author><entry><title>Please publish and share more</title><link href="https://simonwillison.net/2024/Nov/2/please-publish-and-share-more/#atom-tag" rel="alternate"/><published>2024-11-02T15:17:07+00:00</published><updated>2024-11-02T15:17:07+00:00</updated><id>https://simonwillison.net/2024/Nov/2/please-publish-and-share-more/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://micro.webology.dev/2024/11/02/please-publish-and.html"&gt;Please publish and share more&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
💯 to all of this by Jeff Triplett:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Friends, I encourage you to publish more, indirectly meaning you should write more and then share it. [...]&lt;/p&gt;
&lt;p&gt;You don’t have to change the world with every post. You might publish a quick thought or two that helps encourage someone else to try something new, listen to a new song, or binge-watch a new series.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeff shares my opinion on conclusions: giving myself permission to hit publish even when I haven't wrapped everything up neatly was a huge productivity boost for me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Our posts are done when you say they are. You do not have to fret about sticking to landing and having a perfect conclusion. Your posts, like this post, are done after we stop writing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And another 💯 to this footnote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PS: Write and publish before you write your own static site generator or perfect blogging platform. We have lost billions of good writers to this side quest because they spend all their time working on the platform instead of writing.&lt;/p&gt;
&lt;/blockquote&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/blogging"&gt;blogging&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jeff-triplett"&gt;jeff-triplett&lt;/a&gt;&lt;/p&gt;



</summary><category term="blogging"/><category term="jeff-triplett"/></entry><entry><title>jefftriplett/django-startproject</title><link href="https://simonwillison.net/2024/Oct/12/django-startproject/#atom-tag" rel="alternate"/><published>2024-10-12T23:19:01+00:00</published><updated>2024-10-12T23:19:01+00:00</updated><id>https://simonwillison.net/2024/Oct/12/django-startproject/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/jefftriplett/django-startproject"&gt;jefftriplett/django-startproject&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Django's &lt;code&gt;django-admin startproject&lt;/code&gt; and &lt;code&gt;startapp&lt;/code&gt; commands include &lt;a href="https://docs.djangoproject.com/en/5.1/ref/django-admin/#cmdoption-startapp-template"&gt;a --template option&lt;/a&gt; which can be used to specify an alternative template for generating the initial code.&lt;/p&gt;
&lt;p&gt;Jeff Triplett actively maintains his own template for new projects, which includes the pattern that I personally prefer of keeping settings and URLs in a &lt;a href="https://github.com/jefftriplett/django-startproject/tree/main/config"&gt;config/ folder&lt;/a&gt;. It also configures the development environment to run using Docker Compose.&lt;/p&gt;
&lt;p&gt;The latest update adds support for Python 3.13, Django 5.1 and uv. It's neat how you can get started without even installing Django using &lt;code&gt;uv run&lt;/code&gt; like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv run --with=django django-admin startproject \
  --extension=ini,py,toml,yaml,yml \
  --template=https://github.com/jefftriplett/django-startproject/archive/main.zip \
  example_project
&lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://mastodon.social/@webology/113296450222943336"&gt;@webology&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/docker"&gt;docker&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jeff-triplett"&gt;jeff-triplett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/uv"&gt;uv&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="python"/><category term="docker"/><category term="jeff-triplett"/><category term="uv"/></entry><entry><title>UV with GitHub Actions to run an RSS to README project</title><link href="https://simonwillison.net/2024/Oct/5/uv-with-github-actions-to-run-an-rss-to-readme-project/#atom-tag" rel="alternate"/><published>2024-10-05T23:39:47+00:00</published><updated>2024-10-05T23:39:47+00:00</updated><id>https://simonwillison.net/2024/Oct/5/uv-with-github-actions-to-run-an-rss-to-readme-project/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://micro.webology.dev/2024/10/05/uv-with-github.html"&gt;UV with GitHub Actions to run an RSS to README project&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Jeff Triplett demonstrates a very neat pattern for using &lt;a href="https://docs.astral.sh/uv/"&gt;uv&lt;/a&gt; to run Python scripts with their dependencies inside of GitHub Actions. First, add &lt;code&gt;uv&lt;/code&gt; to the workflow using the &lt;a href="https://github.com/astral-sh/setup-uv"&gt;setup-uv action&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- uses: astral-sh/setup-uv@v3
  with:
    enable-cache: true
    cache-dependency-glob: "*.py"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This enables the caching feature, which stores uv's own cache of downloads from PyPI between runs. The &lt;code&gt;cache-dependency-glob&lt;/code&gt; key ensures that this cache will be invalidated if any &lt;code&gt;.py&lt;/code&gt; file in the repository is updated.&lt;/p&gt;
&lt;p&gt;Now you can run Python scripts using steps that look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- run: uv run fetch-rss.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If that Python script begins with some dependency definitions (&lt;a href="https://peps.python.org/pep-0723/"&gt;PEP 723&lt;/a&gt;) they will be automatically installed by &lt;code&gt;uv run&lt;/code&gt; on the first run and reused from the cache in the future. From the start of &lt;a href="https://github.com/django-news/.github/blob/0c2fa0284257e11dc5c149ef411469737dac2c41/fetch-rss.py#L1-L7"&gt;fetch-rss.py&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# /// script
# requires-python = "&amp;gt;=3.11"
# dependencies = [
#     "feedparser",
#     "typer",
# ]
# ///
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; will download the required Python version and cache that as well.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github-actions"&gt;github-actions&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jeff-triplett"&gt;jeff-triplett&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/uv"&gt;uv&lt;/a&gt;&lt;/p&gt;



</summary><category term="python"/><category term="github-actions"/><category term="jeff-triplett"/><category term="uv"/></entry><entry><title>DjangoTV</title><link href="https://simonwillison.net/2024/Sep/28/djangotv/#atom-tag" rel="alternate"/><published>2024-09-28T04:48:04+00:00</published><updated>2024-09-28T04:48:04+00:00</updated><id>https://simonwillison.net/2024/Sep/28/djangotv/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://djangotv.com/"&gt;DjangoTV&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Brand new site by Jeff Triplett gathering together videos from Django conferences around the world. Here's &lt;a href="https://micro.webology.dev/2024/09/27/announcing-djangotv.html"&gt;Jeff's blog post&lt;/a&gt; introducing the project.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://mastodon.social/@webology/113211787119021118"&gt;@webology&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jeff-triplett"&gt;jeff-triplett&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="jeff-triplett"/></entry><entry><title>Python Development on macOS Notes: pyenv and pyenv-virtualenvwrapper</title><link href="https://simonwillison.net/2024/Feb/11/pyenv-and-pyenv-virtualenvwrap/#atom-tag" rel="alternate"/><published>2024-02-11T04:41:57+00:00</published><updated>2024-02-11T04:41:57+00:00</updated><id>https://simonwillison.net/2024/Feb/11/pyenv-and-pyenv-virtualenvwrap/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://micro.webology.dev/2024/02/10/python-development-on.html"&gt;Python Development on macOS Notes: pyenv and pyenv-virtualenvwrapper&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Jeff Triplett shares the recipe he uses for working with pyenv (initially installed via Homebrew) on macOS.&lt;/p&gt;

&lt;p&gt;I really need to start habitually using this. The benefit of pyenv over Homebrew’s default Python is that pyenv managed Python versions are forever—your projects won’t suddenly stop working in the future when Homebrew changes its default Python version.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://mastodon.social/@webology/111910393723844038"&gt;@webology&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/macos"&gt;macos&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jeff-triplett"&gt;jeff-triplett&lt;/a&gt;&lt;/p&gt;



</summary><category term="macos"/><category term="python"/><category term="jeff-triplett"/></entry><entry><title>Django Release Cycle</title><link href="https://simonwillison.net/2020/Apr/3/django-release-cycle/#atom-tag" rel="alternate"/><published>2020-04-03T16:56:11+00:00</published><updated>2020-04-03T16:56:11+00:00</updated><id>https://simonwillison.net/2020/Apr/3/django-release-cycle/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://jefftriplett.com/django-release-cycle/"&gt;Django Release Cycle&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Really nice visual representation of Django’s release cycle, built by Jeff Triplett as a remix of the Python release cycle by Dustin Ingram.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://jefftriplett.com/2020/announcing-django-release-cycle/"&gt;jefftriplett.com&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jeff-triplett"&gt;jeff-triplett&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="jeff-triplett"/></entry><entry><title>How I moderated the State of Django panel at DjangoCon US.</title><link href="https://simonwillison.net/2018/Oct/22/moderating-the-state-of-django/#atom-tag" rel="alternate"/><published>2018-10-22T19:48:53+00:00</published><updated>2018-10-22T19:48:53+00:00</updated><id>https://simonwillison.net/2018/Oct/22/moderating-the-state-of-django/#atom-tag</id><summary type="html">
    &lt;p&gt;On Wednesday last week I moderated the &lt;a href="https://2018.djangocon.us/talk/state-of-django-panel/"&gt;State of Django panel&lt;/a&gt; as the closing session for &lt;a href="https://2018.djangocon.us/"&gt;DjangoCon US 2018&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I think it went well, so I’m writing some notes on exactly how we did it. In my experience it’s worth doing this for things like public speaking: in six months time I might moderate another panel and I’ll be desperately trying to remember what went right last time.&lt;/p&gt;
&lt;p&gt;Panels are hard. Bad panels are way too common, to the point that some good conferences actively avoid having panels at all.&lt;/p&gt;
&lt;p&gt;In my opinion, a good panel has a number of important attributes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The panel needs a coherent theme. It shouldn’t just be several independent speakers that happen to be sharing the same time slot.&lt;/li&gt;
&lt;li&gt;Panels need to be balanced. Having just one or two of the speakers monopolize the conversation is bad for the audience and bad for the panelists themselves.&lt;/li&gt;
&lt;li&gt;The moderator is there to facilitate the conversation, not to be the center of attention. I love public speaking so I feel the need to be particularly cautious here.&lt;/li&gt;
&lt;li&gt;Panelists need to have diverse perspectives on the topics under discussion. A panel where everyone agrees with each other and makes the same points is a very boring panel indeed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I originally pitched the panel to the DjangoCon US organizing committee as a “State of Django” conversation where core maintainers would talk about the current state of the project.&lt;/p&gt;
&lt;p&gt;They countered with a much better idea: a panel that encompassed both the state of the Django framework and the community and ecosystem that it exists within. Since DjangoCon is primarily about bringing that community together this was a much better fit for the conference, and would make for a much more interesting and relevant discussion.&lt;/p&gt;
&lt;p&gt;I worked together with the conference organizers to find our panelists. Nicholle James in particular was the driving force behind assembling the panelists and ensuring everything was in place for the panel to succeed.&lt;/p&gt;
&lt;p&gt;We ended up with a panel representing a comprehensive cross-section of the organizations that make the Django community work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Andrew Godwin, representing Django Core&lt;/li&gt;
&lt;li&gt;Anna Makarudze, representing the &lt;a href="https://www.djangoproject.com/foundation/" title="Django Software Foundation"&gt;DSF&lt;/a&gt;, &lt;a href="https://djangogirls.org/"&gt;Django Girls&lt;/a&gt; and &lt;a href="https://africa.python.org/en/"&gt;Python Africa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Frank Wiles, President of the &lt;a href="https://www.djangoproject.com/foundation/" title="Django Software Foundation"&gt;DSF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Jeff Triplett, President of &lt;a href="https://www.defna.org/" title="Django Events Foundation North America"&gt;DEFNA&lt;/a&gt;, member of the Board of Directors for the &lt;a href="https://www.python.org/psf/" title="Python Software Foundation"&gt;PSF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Josue Balandrano Coronel, representing &lt;a href="https://www.defna.org/" title="Django Events Foundation North America"&gt;DEFNA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Katherine Michel, representing &lt;a href="https://www.defna.org/" title="Django Events Foundation North America"&gt;DEFNA&lt;/a&gt; and DjangoCon US Website Chair&lt;/li&gt;
&lt;li&gt;Kojo Idrissa, &lt;a href="https://www.defna.org/" title="Django Events Foundation North America"&gt;DEFNA&lt;/a&gt; North American Ambassador&lt;/li&gt;
&lt;li&gt;Rachell Calhoun, representing &lt;a href="https://djangogirls.org/"&gt;Django Girls&lt;/a&gt; and &lt;a href="https://www.pyladies.com/"&gt;PyLadies&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As it was the closing session for the conference, I wanted the panel to both celebrate the progress of the community and project and to explore what we need to do next: what should we be working on to improve Django and it’s community in the future?&lt;/p&gt;
&lt;p&gt;I had some initial thoughts on topics, but since the panel was scheduled for the last session of the conference I decided to spend the conference itself firming up the topics that would be discussed. This was a really good call: we got to create an agenda for the panel that was almost entirely informed by the other conference sessions combined with hot topics from the halfway track. We also asked conference attendees for their suggestions via an online form, and used those suggestions to further inform the topics that were discussed.&lt;/p&gt;
&lt;p&gt;I made sure to have a 10-15 minute conversation one-on-one with each of the panelists during the conference. We then got together for an hour at lunch before the panel to sync up with the topics and themes we would be discussing.&lt;/p&gt;
&lt;h3&gt;&lt;a id="Topic_and_themes_38"&gt;&lt;/a&gt;Topic and themes&lt;/h3&gt;
&lt;p&gt;Our pre-panel conversations highlighted a powerful theme for the panel itself, which I ended up summarizing as “What can the Django project learn from the Django community?” This formed the framework for the other themes of the panel.&lt;/p&gt;
&lt;p&gt;The themes themselves were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Diversity and education - inspired by the work of &lt;a href="https://djangogirls.org/"&gt;Django Girls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Events and international focus, lead by &lt;a href="https://www.defna.org/" title="Django Events Foundation North America"&gt;DEFNA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Django governance: In particular James Bennett’s &lt;a href="https://github.com/django/deps/blob/89712df93daeea9fdf7a993342e7087164620eea/draft/XXXX-dissolve-core.rst"&gt;proposal to split up core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Big feature ideas for Django (guided by Andrew Godwin’s proposed &lt;a href="https://www.aeracode.org/2018/06/04/django-async-roadmap/"&gt;Django async roadmap&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Money: who has it, and who needs it - understanding the role of &lt;a href="https://www.djangoproject.com/foundation/"&gt;the DSF&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One of the hardest parts for me was figuring out the order in which we would tackle these themes. I ended up settling on the above order about half an hour before the panel started.&lt;/p&gt;
&lt;h3&gt;&lt;a id="Opening_and_closing_52"&gt;&lt;/a&gt;Opening and closing&lt;/h3&gt;
&lt;p&gt;With eight panelists, ensuring that introductions didn’t drag on too long was particularly important. I asked each panelist to introduce themselves with a couple of sentences that highlighted the organizations they were affiliated with that were relevant to the panel. For our chosen group of panelists this was definitely the right framing.&lt;/p&gt;
&lt;p&gt;I then asked each panelist to be prepared to close the panel with a call to action: something an audience member could actively do that would support the community going forward. This worked really well: it provided a great, actionable note to end both the panel and the conference.&lt;/p&gt;
&lt;h3&gt;&lt;a id="Preparing_and_running_the_panel_58"&gt;&lt;/a&gt;Preparing and running the panel&lt;/h3&gt;
&lt;p&gt;We used our panel lunch together to check that no one would have calls to action that overlapped too much, and to provide a rough indication of who had things to say about each topic we planned to discuss.&lt;/p&gt;
&lt;p&gt;This turned out to be essential: I’ve been on smaller panels where the panelists have been able to riff easily on each other’s points, but with eight panelists it turned out not everyone could even see each other, so as panel moderator it fell on me to direct questions to individuals and then prompt others for follow-ups. Thankfully the panel lunch combined with the one-to-one conversations gave me the information I needed for this.&lt;/p&gt;
&lt;p&gt;I had written down a selection of questions for each of the themes. Having a selection turned out to be crucial: a few times the panelists talked about material that I had planned to cover in a later section, so I had to adapt as we went along. In the future I’ll spend more time on this: these written ideas were a crucial component in keeping the panel flowing in the right direction.&lt;/p&gt;
&lt;p&gt;With everything in place the panel itself was a case of concentrating on what everyone was saying and using the selection of the next questions (plus careful ad-libbing) to guide the conversation along the preselected themes. I also tried to keep mental track of who had done the most speaking so I could ensure the conversation stayed as balanced as possible by inviting other panelists into the conversation.&lt;/p&gt;
&lt;p&gt;The video of the panel should be out in around three weeks time, at which point you can evaluate for yourself if we managed to do a good job of it. I’m really happy with the feedback we got after the panel, and I plan to use a similar process for panels I’m involved with in the future.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/andrew-godwin"&gt;andrew-godwin&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/djangocon"&gt;djangocon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/frank-wiles"&gt;frank-wiles&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/panels"&gt;panels&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/speaking"&gt;speaking&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/jeff-triplett"&gt;jeff-triplett&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="andrew-godwin"/><category term="django"/><category term="djangocon"/><category term="frank-wiles"/><category term="panels"/><category term="speaking"/><category term="my-talks"/><category term="jeff-triplett"/></entry></feed>