MixedMath - explorations in math and programinghttps://davidlowryduda.comDavid's personal blog.en-usCopyright David Lowry-Duda (2022) - All Rights Reserved.admin@davidlowryduda.comadmin@davidlowryduda.comWed, 05 Jun 2024 20:48:39 +0000Wed, 05 Jun 2024 20:48:39 +0000mixedmathapp/generate_rss.py v0.1https://cyber.harvard.edu/rss/rss.htmlhttps://davidlowryduda.com/static/images/favicon-32x32.pngMixedMathhttps://davidlowryduda.comMaass forms in the LMFDBhttps://davidlowryduda.com/maass-forms-now-in-lmfdbDavid Lowry-Duda<p>Rigorous Maass forms are now in the $L$-functions and modular forms database
<a href="https://www.lmfdb.org/">LMFDB</a>.
This is something I've been working on for a while, and it's nice to actually
make the data available.<span class="aside"> This naturally follows certain talks I've
given before, include <a href="/talk-on-computing-maass-forms">this one</a> and <a href="/talk-computing-and-verifying-maass-forms">this
one</a>, as well as various chalk talks
over the last couple fo years.</span></p>
<p>The computations of the actual Maass forms uses work of Kieran Child,
Andrei Seymour-Howell, and me. A variety of underlying techniques are used,
including rigorous implementations of the Selberg trace formula, rigorous
Hejhal's algorithm, and certification strategies.<sup>1</sup>
<span class="aside"><sup>1</sup>See <a href="https://arxiv.org/abs/2204.11761"><em>Certification of Maass cuso forms of arbitrary level and character</em></a> by Child
and <em>Dimensions of the spaces of cusp forms and newforms on $\Gamma_0(N)$ and
$\Gamma_1(N)$</em> by Booker, Strömbergsson, and Venkatesh. I haven't talked much
about these before.</span>
And this all builds on the earlier heuristic
approaches of Hejhal, later refined significantly by Strömberg, Lemurell, and
Then. (And all data for $\mathrm{GL}(3)$ or $\mathrm{GL}(4)$ forms comes from
completely different techniques of Farmer, Lemurell, and others).</p>
<p>For now, the Maass forms are <a href="https://beta.lmfdb.org/ModularForm/GL2/Q/Maass/">on the LMFDB Beta</a>.
If nothing breaks (and I hope it won't), then they'll soon be on the main LMFDB
too.</p>
<p>For the rest of this note, I want to describe a couple interesting facets of
the newly available database.</p>
<h1>Consecutive Maass Forms</h1>
<p>One of our promises in the LMFDB is to not miss any Maass forms.
For any given level, we have <em>every</em> Maass form with spectral parameter $0 < r
< R$ for some $R$ (that currently depends strongly on the level).
This guarantee comes largely from the trace formula: we can guarantee that we
haven't missed any forms.<sup>2</sup>
<span class="aside"><sup>2</sup>Or rather, any missing forms come from an
implementation mistake, not a theoretical mistake.</span></p>
<p>Thus when you look at all Maass forms in some data range, we know that they are
all there.
This should be a big help with experimentation.</p>
<h1>Labels</h1>
<p>One advantage of having consecutive Maass forms is that we can <em>label</em> Maass
forms in a systematic way.
For a (cuspidal, Hecke, new) Maass form on $M_k(\Gamma_0(N), \chi)$, we assign
it the label <code>N.k.a.m.d</code>, where</p>
<ul>
<li>$N$ is the level,</li>
<li>$k$ is the weight,</li>
<li>$N.a$ is the Conrey label of the Dirichlet character $\chi$,</li>
<li>$m$ is the <strong>spectral index</strong>, and</li>
<li>$d$ is a disambiguation index if multiple Maass forms share the same earlier
data. (This currently never happens).</li>
</ul>
<p>The <strong>spectral index</strong> is the index of the spectral parameter $R$ in the list
of all spectral parameters for a given weight, level, and character, starting
from $1$ if $R > 0$.
The special case when the spectral index $m = 0$ is reserved for Maass forms
induced from Hecke characters.
These are not currently in the LMFDB, but they will be at some point in the
future.</p>
<p>In addition, if $k = 0$, $a = 1$, and $d = 1$, (which accounts for every Maass
form currently in the LMFDB), then we assign the <em>short label</em> <code>N.m</code>.</p>
<h2>Labels in the LMFDB</h2>
<p>Labels can be a big deal in the LMFDB. We don't like changing labels, ever.
Once we give a form a name, we want that name to never change.
This means that there can be big label discussions.</p>
<p>This time I tried designing what I thought was a robust label format,
implementing it, and then asking for confirmation. This worked well! David Roe
had the idea of adding the <em>short label</em>, which makes things look nicer.</p>
<h1>Plots of Maass Forms</h1>
<p>With new objects in the LMFDB, there comes new portraits.</p>
<figure class="center">
<img src="/wp-content/uploads/2024/06/sample_maass_plot.png" />
</figure>
<p>These are similar to the portraits we made for classical modular forms.
But the Maass forms we currently have are all real-valued, and thus only take
on two separate hues.
(And unlike the classical modular forms, we included hints at contours to
indicate a bit more).</p>
<p>I overengineered portrait creation.
I actually have <em>a lot</em> to say about it, and I'll write that down another time.</p>
<h1>Check out the Maass Forms</h1>
<p>So go forth and check them out!
Right now they're on beta. If you manage to break anything, let me know and
I'll fix it.</p>
<p>Happy mathing!</p>https://davidlowryduda.com/maass-forms-now-in-lmfdbWed, 05 Jun 2024 03:14:15 +0000Another year, another TeXLive reinstallationhttps://davidlowryduda.com/another-year-another-texliveDavid Lowry-Duda<p>Every year, <a href="https://www.tug.org/texlive/">TeX Live</a> updates in a breaking way.
This year it was on 13 March 2024.</p>
<p>I don't notice until I need to do something somewhat uncommon with my TeX
distribution, such as compiling a new template or style file.
Today, I'm writing a funding proposal and was (re)compiling a similar proposal
I wrote a couple of years ago.
It happens to use the <code>extdash</code> package, which I don't have installed.
But trying to install it now (via <code>tlmgr</code>) throws an error saying that my
distribution is 2023, and now it's 2024, so it's time to upgrade.</p>
<p>LaTeX distributions come in two forms: the main binaries and packages.
Packages are updated continually and can be updated throughout the year.
The main binaries are updated once each year.
But once a binary is updated, the package manager (associated to a previous
binary) will no longer allow package updates.</p>
<p>The effect is that a new texlive installation is required each year.
There are some update scripts, but these are unsupported and still essentially
require downloading as much material as a full install.</p>
<p>I haven't heard a compelling reason why this behavior is tolerated (let alone
desirable).
Further, following instructions typically leads with several side-by-side
installations of tex (although each installation is HUGE and this is also
unacceptable).</p>
<p>The only benefit of this is that keeping older versions allows snapshot
recompilation of older documents, or snapshot recompilation using packages with
backwards incompatible updates (such as moderncv, which breaks <em>all the time</em>).
But I don't like having that bloat, so I end up completely removing old
versions and installing a fresh texlive each year.</p>
<p>I sometimes want bleeding-edge latex things and don't use my linux
distribution's package manager for this.
Instead, I do it myself through the texlive package manager <code>tlmgr</code>.
These are my notes on updating texlive from year to year.</p>
<p>(In particular, these are the steps that I went through just now so that I can
compile what I really wanted to compile).</p>
<h2>Remove the previous installation</h2>
<p>I keep the texlive source in <code>$HOME/src/texlive</code>.<sup>1</sup>
<span class="aside"><sup>1</sup>You can probably guess
where I keep source files for other things that I build and manage
myself).</span>
Looking now, I see that I have 598832 bytes of <em>stuff</em> there, meaning that the
complete size of my texlive distribution for all latex that I've compiled in
the last year is approximately 585MB.
This is about 1/10th the size of the standard <code>TeXLive Full</code> installation on
Ubuntu, which is one of the reasons why I prefer to manage the installation
myself.<sup>2</sup>
<span class="aside"><sup>2</sup>I began to use tlmgr to manage texlive when I was using a
chromebook as my main driver, and I needed to be able to fit texlive on my tiny
harddrive. I learned a lot about resource constraints then.</span></p>
<p>I note for interest that 261MB of my texlive is dedicated to documentation for
installed packages. Another 96MB is for fonts.</p>
<p>Regardless, I remove the entirety of my <code>$HOME/src/texlive</code> at once.</p>
<h2>Acquire and run the new installer</h2>
<p>Go to <a href="https://tug.org/texlive/acquire.html">tug.org</a> and download the
<a href="https://tug.org/texlive/acquire-netinstall.html">texlive internet installer</a>.
This year, this is a 5.5MB file <code>install-tl-unx.tar.gz</code> .</p>
<p>Move it to a freshly created <code>$HOME/src/texlive</code> and unpack it.</p>
<p><code>cd</code> into the new directory and run the installer (which is a little perl
script).</p>
<blockquote>
<p>I now customize <em>many</em> of the options. For people who read this that aren't
me, I emphasize that my usecase might not be the same as your usecase. Now is
an obvious time to deviate from my procedure.</p>
</blockquote>
<ol>
<li>Verify that it detects the correct platform, <code>GNU/Linux on x86_64</code> for me.</li>
<li>Change the <code>installation scheme</code> from <code>scheme-full</code> (which takes 8.253GB this year) to <code>custom</code> .</li>
<li>Go into the <code>Collections</code> submenu. I default to having too little and then
install things later with tlmgr as necessary later. Thus I first <code>deselect
all</code>, and then I install exactly three collections: <strong>Essential programs and
files</strong>, <strong>LaTeX fundamental packages</strong>, and <strong>XeTeX and packages</strong>.</li>
<li>Set the installation directories. I use <code>$HOME/src/texlive</code> and <em>I do not
separate by year.</em> I also set <code>TEXMFHOME</code> to <code>~/.texmf</code> (i.e. I change it to
be a hidden file instead of polluting my home directory visibly).</li>
<li>I set tex to <strong>use letter size instead of A4 by default</strong>, because I live in
the US. I note that I <strong>keep the "install font/macro doc tree" option</strong>,
which downloads documentation and which ultimately doubles the size of my
installation. I actually read the documentation sometimes. I think this is
unusual.</li>
<li>Set the installation to proceed.</li>
</ol>
<p>This year, this apparently uses 557MB of disk space.</p>
<p>This led to texlive installing 181 packages (and their commented source and
documentation) and took less than 10 minutes.</p>
<p>Afterwards, the installer will display a <strong>very important message</strong> about
setting MANPATH, INFOPATH, and PATH. In principle I would alter these in my
<code>.bashrc</code>, but in practice my previous <code>.bashrc</code> points to these new spots
since I'm overwriting where my texlive installation directory.</p>
<h2>Remove texlive installer</h2>
<p>TeXLive is now installed, so I can remove <code>$HOME/src/texlive/<texliveinstaller></code>.
The exact name is different, depending on the date.</p>
<h2>Install utility packages</h2>
<p>I use various utilities frequently. I install these with</p>
<div class="codehilite"><pre><span></span><code>which tlmgr <span class="c1"># to make sure that new tlmgr is detected</span>
tlmgr install latexmk lacheck chktex latexdiff pdfcrop <span class="se">\</span>
pdfjam texdiff texdoc
</code></pre></div>
<p>These are utility packages that are less common. I use <code>lacheck</code> and <code>chktex</code>
for latex linting. I use <code>texdoc</code> to see documentation for packages. I use
<code>latexmk</code> to handle recompilation. I use the others for various scripts I've
written. All of these are tiny.</p>
<p>Installation took 31 seconds.</p>
<h2>Install specific packages I use</h2>
<p>I have four fundamental types of papers that I often compile.</p>
<ul>
<li>A generic research paper that I might post to the arxiv.</li>
<li>Personal notes</li>
<li>Public notes</li>
<li>Beamer presentations</li>
</ul>
<p>I have different templates and packages that I use for each of these. I know
that I'll make all four again this year and I know exactly which packages they
need. I install those now.</p>
<div class="codehilite"><pre><span></span><code>tlmgr install setspace mathtools booktabs wrapfig changebar <span class="se">\</span>
xcolor lipsum tocloft fancyvrb enumitem threeparttable <span class="se">\</span>
beamer beamertheme-metropolis adjustbox pgfopts <span class="se">\</span>
xkeyval collectbox <span class="nb">times</span> minted ragged2e multirow
</code></pre></div>
<p>I made this list a couple of years ago by checking what was necessary to
compile a couple specific documents.</p>
<p>I install any other package as necessary throughout the year. Right now, my
installation uses 706MB.<sup>3</sup>
<span class="aside"><sup>3</sup>Wow, that's 150 MB more than my entire
distribution last year, including various packages installed throughout the
year for ad hoc reasons! I wonder what changed so much. I see that 334MB, which is 73MB more than before.</span></p>https://davidlowryduda.com/another-year-another-texliveMon, 15 Apr 2024 03:14:15 +0000FLT3 at LftCM2024https://davidlowryduda.com/flt3-at-lftcm2024David Lowry-DudaThis post is larger than 10000 bytes, which is above the limit for this RSS feed. Perhaps it is long or has embedded images or code. Please view it directly at the url.https://davidlowryduda.com/flt3-at-lftcm2024Sat, 30 Mar 2024 03:14:15 +0000Quanta on Murmurationshttps://davidlowryduda.com/quanta-on-murmurationsDavid Lowry-Duda<p>Quanta wrote an article <strong>Elliptic Curve 'Murmurations' Found With AI Take
Flight</strong> (<a href="https://www.quantamagazine.org/elliptic-curve-murmurations-found-with-ai-take-flight-20240305/">link to article</a>).</p>
<p>The article describes some of the story behind the recent <em>murmurations in
number theory</em> phenomena that I've been giving talks about. I think it's a
pretty well-written article that gives a reasonable overview. Check it out!</p>
<p>It touches on <a href="/paper-modular-murmurations/">my recent work</a> with Bober,
Booker, and Lee.<span class="aside">If they'd waited a couple of weeks, then they might
have been able to include forthcoming work with Booker, Lee, Seymour-Howell,
and Zubrilina! But we're a couple of weeks away for that, I think.</span></p>
<p>And as far as I see, Quanta is the only outlet (in English) that covers recent
research developments in math for a non-specialist audience (<em>pop-math</em>).
It's certainly the case that mathematicians aren't doing a particularly job
covering our own work in an accessible way.</p>https://davidlowryduda.com/quanta-on-murmurationsTue, 05 Mar 2024 03:14:15 +0000Not quite 3 and a half yearshttps://davidlowryduda.com/three-years-countingDavid Lowry-Duda<h1>Publishing Record</h1>
<p>I submitted a paper on 2 September 2020. It was accepted this week, on 17
February 2024.</p>
<p><span class="aside">I'm continuing to include more of the tiny evaluations I do <em>all
the time</em> with my computing environments. These may be easy manual calculations
— but I've been known to make simple mistakes.</span></p>
<div class="codehilite"><pre><span></span><code><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">date</span>
<span class="kn">from</span> <span class="nn">dateutil.relativedelta</span> <span class="kn">import</span> <span class="n">relativedelta</span>
<span class="n">submitted</span> <span class="o">=</span> <span class="n">date</span><span class="p">(</span><span class="mi">2020</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">accepted</span> <span class="o">=</span> <span class="n">date</span><span class="p">(</span><span class="mi">2024</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">17</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">accepted</span> <span class="o">-</span> <span class="n">submitted</span><span class="p">)</span>
<span class="c1"># >> datetime.timedelta(days=1263)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">relativedelta</span><span class="p">(</span><span class="n">accepted</span><span class="p">,</span> <span class="n">submitted</span><span class="p">))</span>
<span class="c1"># >> relativedelta(years=+3, months=+5, days=+15)</span>
</code></pre></div>
<p>That was 1263 days, or 3 years, 5 months, and 15 days. It wasn't quite long
enough to include a leapday — it missed by two weeks.</p>
<p>This beats my previous record (of 2 years and 3 months). I too am guilty:
during the same time, I took a year to review a paper.</p>
<p>This is an annoying aspect of academia and publishing.<sup>1</sup>
<span class="aside"><sup>1</sup>At least this isn't
one of those stoires where years pass and then the paper is <strong>rejected</strong>. I
haven't had that happen, and I haven't done this as a reviewer. But it <em>does</em>
happen too.</span></p>
<p>I don't think I kept enough records to track my average time from submission to
publication. Perhaps I should keep better track and report this on my
<a href="/research/">Research</a> page too.</p>https://davidlowryduda.com/three-years-countingWed, 21 Feb 2024 03:14:15 +0000Examining Excess in the Schmidt Boundhttps://davidlowryduda.com/schmidt-experimentDavid Lowry-DudaThis post is larger than 10000 bytes, which is above the limit for this RSS feed. Perhaps it is long or has embedded images or code. Please view it directly at the url.https://davidlowryduda.com/schmidt-experimentTue, 13 Feb 2024 03:14:15 +0000Bounds on partial sums from functional equationshttps://davidlowryduda.com/bounds-on-partial-sums-from-feDavid Lowry-DudaThis post is larger than 10000 bytes, which is above the limit for this RSS feed. Perhaps it is long or has embedded images or code. Please view it directly at the url.https://davidlowryduda.com/bounds-on-partial-sums-from-feTue, 16 Jan 2024 03:14:15 +0000Paper: Towards a Classification of Isolated $j$-invariantshttps://davidlowryduda.com/paper-isolated-j-invariantsDavid Lowry-Duda<p>I'm happy to announce that a new paper, "Towards a classification of isolated
$j$-invariants", now appears <a href="https://arxiv.org/abs/2311.07740">on the arxiv</a>.
This was done with my collaborators Abbey Bourdon, Sachi Hashimoto, Timo
Keller, Zev Klagsbrun, Travis Morrison, Filip Najman, and Himanshu Shukla.</p>
<p>There are many collaborators because this was borne out of a workshop at CIRM
from earlier this year, and we all attacked this problem together. This is the
first time I have collaborated with any of these collaborators (though several
of us are now involved in another project that will eventually appear).</p>
<p>The modular curve $X_1(N)$ is moduli space and an algebraic curve (defined over
$\mathbb{Q}$ for us) whose points parametrize elliptic curves with a point of
order $N$. We study <em>isolated</em> points, which are morally points on $X_1(N)$
that don't come from infinite families.</p>
<p>Perhaps the simplest form of infinite families comes come from a rational map
$f: X_1(N) \longrightarrow \mathbb{P}^1$ of degree $d$. By Hilbert's
irreducibility theorem, $f^{-1}(\mathbb{P}^1(\mathbb{Q}))$ contains infinitely
many closed points of degree $d$.</p>
<p>Similarly, to any closed point $x$ of degree $d$ one can associate the rational
divisor $P_1 + \cdots + P_d$, where $P_j$ are the points in the Galois orbit
associated to $x$. This gives a natural map $\Phi_d: X_1(N)^{(d)}
\longrightarrow \mathrm{Jac}(X_1(N))$. If $\Phi_d(x) = \Phi_d(y)$ for some
point $y$, one can show that there exists a nonconstant function $f : X_1(N)
\longrightarrow \mathbb{P}^1$ of degree $d$ again. Thus positive rank abelian
subvarieties of the Jacobian also give infinite families of points.</p>
<p>Roughly, we say that a closed point $x$ is <strong>isolated</strong> if it doesn't come from
either of the two constructions ($\mathbb{P}^1$, which we call $\mathbb{P}^1$
isolated — and abelian subvariety, which we call AV-isolated) above.
Further, a closed point $x$ of degree $d$ is called <strong>sporadic</strong> if there are
only finitely many closed points of degree at most $d$.</p>
<p>If $x \in X_1(N)$ is an isolated point, we say $j(x) \in X_1(1) \cong
\mathbb{P}^1$ is an <strong>isolated $j$-invariant</strong>. In this paper, we seek to
answer a question of Bourdon, Ejder, Liu, Odumodo, and Viray.</p>
<blockquote>
<p>Question: Can one explicitly identify the (likely finite) set of isolated
$j$-invariants in $\mathbb{Q}$?</p>
</blockquote>
<p>Our main result is decision algorithm. Given a $j$-invariant, our algorithm
produces a finite list of potential (level, degree) pairs such that one only
needs to verify that degree $\mathrm{degree}$ points on $X_1(\mathrm{level})$
are not isolated.</p>
<p>Stated differently, our algorithm has one-sided error. It either reports that
an element is not isolated, or it reports that it <em>might</em> be isolated and gives
a list of places containing the data where isolated points must come from.</p>
<p>In principle, this sounds like it might be insufficient. But we ran our
algorithm on every elliptic curve in the LMFDB and the outputs of our algorithm
are always the empty set — except for $4$ exceptions where we know the
$j$-invariants are isolated.</p>
<p>Concretely, we know that for any non-CM elliptic curve over $\mathbb{Q}$ with
an isolated $j(E) \in \mathbb{Q}$ and with</p>
<ul>
<li>conductor up to $500000$,</li>
<li>or with conductor that is $7$-smooth,</li>
<li>or of prime conductor $p < 3 \cdot 10^8$,</li>
</ul>
<p>then $j(E) \in \{ -140625/8, -9317, 351/4, -162677523113838677 \}$. These
latter correspond to $\mathbb{P}^1$ isolated points on $X_1(21), X_1(37),
X_1(28)$, and $X_1(37)$ (respectively).<sup>1</sup>
<span class="aside"><sup>1</sup>An appendix to our paper by
Derickx and Mark van Hoeij shows that the last $j$-invariant is actually
isolated, not merely sporadic.</span></p>
<p>More generally, we are led to conjecture that these (and the CM $j$-invariants)
are all of the isolated points on $X_1(N)$.</p>
<p>Broadly, our algorithm works by first considering the Galois image of elliptic
curves (thanks to the code of David Zywina and the efforts of David Roe and
others for making this broadly accessible). An earlier result of Bourdon and
her collaborators<sup>2</sup>
<span class="aside"><sup>2</sup>Abbey proposed this problem at the workshop based on the
observation that her result might make things tenable. She was right!</span></p>
<p>allows one to radically narrow the focus of the Galois image to a minimal set
of points of interest. We do this narrowing. We also show that no elliptic
curve with adelic image of genus $0$ gives an isolated point, which allows us
to ignore many potential leafs of computation.</p>
<p>The details are interesting and we try to be as explicit as possible. The code
for this project is also available, and can be found on my github at
<a href="https://github.com/davidlowryduda/isolated_points">github.com/davidlowryduda/isolated_points</a>.</p>https://davidlowryduda.com/paper-isolated-j-invariantsWed, 15 Nov 2023 03:14:15 +0000Paper: Congruent number triangles with the same hypotenusehttps://davidlowryduda.com/paper-congruent-triangles-same-hypotenuseDavid Lowry-DudaThis post is larger than 10000 bytes, which is above the limit for this RSS feed. Perhaps it is long or has embedded images or code. Please view it directly at the url.https://davidlowryduda.com/paper-congruent-triangles-same-hypotenuseTue, 14 Nov 2023 03:14:15 +0000Bringing back the blogrollhttps://davidlowryduda.com/bringing-back-the-blogrollDavid Lowry-Duda<p>It used to be <em>very</em> common for sites to have a page that said "blogroll" at
the top and it linked to a bunch of blogs and sites that the author liked.
People used to find other sites like this, and these sorts of links powered
early search engines.</p>
<p>I stopped having a blogroll after I switched away from Wordpress and didn't
think too much about it.</p>
<p>But things changed. RSS worked<sup>1</sup>
<span class="aside"><sup>1</sup>RIP Google Reader, 2013. It died so that
Google+ could... also die a quiet death.</span>
and google search/Twitter were
semi-reliable ways to find new things.</p>
<p>Now Twitter is dead, email newsletters are awful<sup>2</sup>
<span class="aside"><sup>2</sup>though almost all of them
were almost always awful. The medium is inferior to RSS in almost every way
except a very important one: it's easier to monetize.</span>
, and Google search
has lost its utility to the combination of earnest actors paying top dollar to
appear at the top and SEO optimzer spam flooding the web.<sup>3</sup>
<span class="aside"><sup>3</sup>And <a href="https://en.wikipedia.org/wiki/Goodhart%27s_law">Goodhart's
Law</a> strikes again!</span></p>
<p>The web is full of walled gardens, hiding the beautiful things within behind
large, bland, stone walls.</p>
<p>The fundamental problem of internet content discovery is hard again!
It's now rather hard to find places with consistently good content.
I love longform media. It requires thought and intention. And it requires time.</p>
<p>So I'm bringing back my blogroll (and more generally, a list of sites, links,
resources, and books that I find interesting). It is at the <a href="/blogroll">top of every
page</a>. Check it out!</p>
<p>If you have a site, bring out your blogroll. Help the small web flourish.</p>https://davidlowryduda.com/bringing-back-the-blogrollMon, 13 Nov 2023 03:14:15 +0000