<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.1">Jekyll</generator><link href="https://scown.space/feed.xml" rel="self" type="application/atom+xml" /><link href="https://scown.space/" rel="alternate" type="text/html" /><updated>2026-08-01T17:28:55+01:00</updated><id>https://scown.space/feed.xml</id><title type="html">ScownSpace</title><subtitle>The occasional ramblings of Alex Scown</subtitle><author><name>Alex Scown</name></author><entry><title type="html">Orange Blossom for Violet</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/orange-blossom-for-violet" rel="alternate" type="text/html" title="Orange Blossom for Violet" /><published>2026-08-01T17:19:00+01:00</published><updated>2026-08-01T17:19:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/orange-blossom-for-violet</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/orange-blossom-for-violet"><![CDATA[<p>In which Violet is to marry Fred, but Harry would rather have her for himself. Shot in live action using monkeys and dogs. One of the monkeys appears to be in blackface. I guess that passed for entertainment back in the day.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Violet is to marry Fred, but Harry would rather have her for himself. Shot in live action using monkeys and dogs. One of the monkeys appears to be in blackface. I guess that passed for entertainment back in the day.]]></summary></entry><entry><title type="html">So Much For So Little</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/so-much-for-so-little" rel="alternate" type="text/html" title="So Much For So Little" /><published>2026-08-01T17:16:00+01:00</published><updated>2026-08-01T17:16:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/so-much-for-so-little</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/so-much-for-so-little"><![CDATA[<p>In which a public health officer extols the virtues of a public health department, costing each citizen 3¢ a week. Should be required viewing ∀ American politicians, but little entertainment value.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a public health officer extols the virtues of a public health department, costing each citizen 3¢ a week. Should be required viewing ∀ American politicians, but little entertainment value.]]></summary></entry><entry><title type="html">You Ought to Be in Pictures</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/you-ought-to-be-in-pictures" rel="alternate" type="text/html" title="You Ought to Be in Pictures" /><published>2026-08-01T17:12:00+01:00</published><updated>2026-08-01T17:12:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/you-ought-to-be-in-pictures</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/you-ought-to-be-in-pictures"><![CDATA[<p>In which Daffy convinces Porky to quit his cartoon contract and pursue a career in features. Features live action footage, though most of the effects have dated badly.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Daffy convinces Porky to quit his cartoon contract and pursue a career in features. Features live action footage, though most of the effects have dated badly.]]></summary></entry><entry><title type="html">What’s Opera Doc</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/whats-opera-doc" rel="alternate" type="text/html" title="What’s Opera Doc" /><published>2026-08-01T17:08:00+01:00</published><updated>2026-08-01T17:08:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/whats-opera-doc</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/whats-opera-doc"><![CDATA[<p>In which Bugs and Elmer re-enact Wagner’s <cite>Ring Cycle</cite>, and <cite>Ride of the Valkyries</cite> becomes <cite>Kill the Wabbit</cite>. Widely regarded as the greatest short cartoon ever made.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs and Elmer re-enact Wagner’s Ring Cycle, and Ride of the Valkyries becomes Kill the Wabbit. Widely regarded as the greatest short cartoon ever made.]]></summary></entry><entry><title type="html">Stage Door Cartoon</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/stage-door-cartoon" rel="alternate" type="text/html" title="Stage Door Cartoon" /><published>2026-08-01T17:04:00+01:00</published><updated>2026-08-01T17:04:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/stage-door-cartoon</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/stage-door-cartoon"><![CDATA[<p>In which Bugs hides from Elmer Fudd in a vaudeville theatre. Hilarity ensues. Features a recursive meta joke at the end.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs hides from Elmer Fudd in a vaudeville theatre. Hilarity ensues. Features a recursive meta joke at the end.]]></summary></entry><entry><title type="html">Show Biz Bugs</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/show-biz-bugs" rel="alternate" type="text/html" title="Show Biz Bugs" /><published>2026-08-01T17:03:00+01:00</published><updated>2026-08-01T17:03:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/show-biz-bugs</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/show-biz-bugs"><![CDATA[<p>In which Daffy, furious that Bugs has greater billing than him, tries desperately to upstage him.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Daffy, furious that Bugs has greater billing than him, tries desperately to upstage him.]]></summary></entry><entry><title type="html">Rhapsody Rabbit</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/rhapsody-rabbit" rel="alternate" type="text/html" title="Rhapsody Rabbit" /><published>2026-08-01T16:59:00+01:00</published><updated>2026-08-01T16:59:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/rhapsody-rabbit</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/rhapsody-rabbit"><![CDATA[<p>In which Bugs is a concert pianist who must play Liszt’s <cite>2nd Hungarian Rhapsody</cite>, while dealing with a mouse that lives in the piano. Saw this many years ago, then recalled a line from it an iPodded it.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs is a concert pianist who must play Liszt’s 2nd Hungarian Rhapsody, while dealing with a mouse that lives in the piano. Saw this many years ago, then recalled a line from it an iPodded it.]]></summary></entry><entry><title type="html">One Froggy Evening</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/one-froggy-evening" rel="alternate" type="text/html" title="One Froggy Evening" /><published>2026-08-01T16:54:00+01:00</published><updated>2026-08-01T16:54:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/one-froggy-evening</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/one-froggy-evening"><![CDATA[<p>In which a man finds a singing frog. Unfortunately it only sings to him. In the end he hides the frog in the corner of a building and it is retrieved in the future. I’m sure I’ve seen this as part of <cite>1001 Rabbit Tales</cite> <em>many</em> years ago, but most of it seems to have fuzzed out (in my head the frog only had one song in his repertoire).</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a man finds a singing frog. Unfortunately it only sings to him. In the end he hides the frog in the corner of a building and it is retrieved in the future. I’m sure I’ve seen this as part of 1001 Rabbit Tales many years ago, but most of it seems to have fuzzed out (in my head the frog only had one song in his repertoire).]]></summary></entry><entry><title type="html">The Three Little Bops</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/the-three-little-bops" rel="alternate" type="text/html" title="The Three Little Bops" /><published>2026-08-01T16:51:00+01:00</published><updated>2026-08-01T16:51:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/the-three-little-bops</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/the-three-little-bops"><![CDATA[<p>A blues/jazz version of <cite>The Three Little Pigs</cite>. The animation style is unlike most of the other cartoons. It works really well.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[A blues/jazz version of The Three Little Pigs. The animation style is unlike most of the other cartoons. It works really well.]]></summary></entry><entry><title type="html">The Hep Cat</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/the-hep-cat" rel="alternate" type="text/html" title="The Hep Cat" /><published>2026-08-01T16:48:00+01:00</published><updated>2026-08-01T16:48:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/the-hep-cat</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/the-hep-cat"><![CDATA[<p>In which a black cat who fancies himself as something of a ladies’ man ends up with a glove puppet.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a black cat who fancies himself as something of a ladies’ man ends up with a glove puppet.]]></summary></entry><entry><title type="html">Katnip Kollege</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/katnip-kollege" rel="alternate" type="text/html" title="Katnip Kollege" /><published>2026-08-01T16:42:00+01:00</published><updated>2026-08-01T16:42:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/katnip-kollege</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/katnip-kollege"><![CDATA[<p>In which cats learn to sing. Pretty tedious.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which cats learn to sing. Pretty tedious.]]></summary></entry><entry><title type="html">I Love to Singa</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/i-love-to-singa" rel="alternate" type="text/html" title="I Love to Singa" /><published>2026-08-01T16:42:00+01:00</published><updated>2026-08-01T16:42:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/i-love-to-singa</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/i-love-to-singa"><![CDATA[<p>In which a young owl struggles to find acceptance as a jazz singer. Parodied in the opening episode of <cite>South Park</cite>. At this time the standard theme music had not yet come into being.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a young owl struggles to find acceptance as a jazz singer. Parodied in the opening episode of South Park. At this time the standard theme music had not yet come into being.]]></summary></entry><entry><title type="html">Hollywood Steps Out</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/hollywood-steps-out" rel="alternate" type="text/html" title="Hollywood Steps Out" /><published>2026-08-01T16:36:00+01:00</published><updated>2026-08-01T16:36:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/hollywood-steps-out</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/hollywood-steps-out"><![CDATA[<p>In which we have a cartoon of two halves. In part A, Porky is hunting Bugs to the tune of a Strauss waltz. In the second, a vulture steals ducklings from a mother duck to the tune of the Blue Danube Waltz. The entire thing is silent.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which we have a cartoon of two halves. In part A, Porky is hunting Bugs to the tune of a Strauss waltz. In the second, a vulture steals ducklings from a mother duck to the tune of the Blue Danube Waltz. The entire thing is silent.]]></summary></entry><entry><title type="html">Have You Got Any Castles</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/have-you-got-any-castles" rel="alternate" type="text/html" title="Have You Got Any Castles" /><published>2026-08-01T16:35:00+01:00</published><updated>2026-08-01T16:35:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/have-you-got-any-castles</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/have-you-got-any-castles"><![CDATA[<p>In which book characters come to life to dance and sing. Features some terrible black stereotyping.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which book characters come to life to dance and sing. Features some terrible black stereotyping.]]></summary></entry><entry><title type="html">A Corny Concerto</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/a-corny-concerto" rel="alternate" type="text/html" title="A Corny Concerto" /><published>2026-08-01T16:32:00+01:00</published><updated>2026-08-01T16:32:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/a-corny-concerto</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/a-corny-concerto"><![CDATA[<p>In which we have a cartoon of two halves. In part A, Porky is hunting Bugs to the tune of a Strauss waltz. In the second, a vulture steals ducklings from a mother duck to the tune of the Blue Danube Waltz. The entire thing is silent.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which we have a cartoon of two halves. In part A, Porky is hunting Bugs to the tune of a Strauss waltz. In the second, a vulture steals ducklings from a mother duck to the tune of the Blue Danube Waltz. The entire thing is silent.]]></summary></entry><entry><title type="html">Back Alley Oproar</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/book-revue" rel="alternate" type="text/html" title="Back Alley Oproar" /><published>2026-08-01T16:29:00+01:00</published><updated>2026-08-01T16:29:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/book-revue</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/book-revue"><![CDATA[<p>In which book covers come to life at midnight. Features singing and dancing, and Daffy Duck on a comic cover.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which book covers come to life at midnight. Features singing and dancing, and Daffy Duck on a comic cover.]]></summary></entry><entry><title type="html">Back Alley Oproar</title><link href="https://scown.space/warner-bros-cartoons/2026/08/01/back-alley-oproar" rel="alternate" type="text/html" title="Back Alley Oproar" /><published>2026-08-01T16:25:00+01:00</published><updated>2026-08-01T16:25:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/08/01/back-alley-oproar</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/08/01/back-alley-oproar"><![CDATA[<p>In which Elmer Fudd wishes to sleep, but Sylvester sings songs outside his window. Eventually Elmer goes too far.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Elmer Fudd wishes to sleep, but Sylvester sings songs outside his window. Eventually Elmer goes too far.]]></summary></entry><entry><title type="html">Daffy Duck for President</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/daffy-duck-for-president" rel="alternate" type="text/html" title="Daffy Duck for President" /><published>2026-07-11T16:58:00+01:00</published><updated>2026-07-11T16:58:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/daffy-duck-for-president</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/daffy-duck-for-president"><![CDATA[<p>In which Daffy learns about the Constitution. More tedious pro-America bullshit.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Daffy learns about the Constitution. More tedious pro-America bullshit.]]></summary></entry><entry><title type="html">Porky in Wackyland</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/porky-in-wackyland" rel="alternate" type="text/html" title="Porky in Wackyland" /><published>2026-07-11T16:56:00+01:00</published><updated>2026-07-11T16:56:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/porky-in-wackyland</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/porky-in-wackyland"><![CDATA[<p>In which Porky heads to Wackyland in order to hunt the last Do-Do. Later remade as <cite>Dough for the Do-Do</cite>. This one is better.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Porky heads to Wackyland in order to hunt the last Do-Do. Later remade as Dough for the Do-Do. This one is better.]]></summary></entry><entry><title type="html">Duck Soup to Nuts</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/duck-soup-to-nuts" rel="alternate" type="text/html" title="Duck Soup to Nuts" /><published>2026-07-11T16:54:00+01:00</published><updated>2026-07-11T16:54:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/duck-soup-to-nuts</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/duck-soup-to-nuts"><![CDATA[<p>In which Porky hunts Daffy, who comes up with a number of ways to save his own skin.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Porky hunts Daffy, who comes up with a number of ways to save his own skin.]]></summary></entry><entry><title type="html">The Great Piggy Bank Robbery</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/the-great-piggy-bank-robbery" rel="alternate" type="text/html" title="The Great Piggy Bank Robbery" /><published>2026-07-11T16:52:00+01:00</published><updated>2026-07-11T16:52:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/the-great-piggy-bank-robbery</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/the-great-piggy-bank-robbery"><![CDATA[<p>In which Daffy gets so excited about his Dick Tracy comic he knocks himself out, and dreams he is Duck Twacy.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Daffy gets so excited about his Dick Tracy comic he knocks himself out, and dreams he is Duck Twacy.]]></summary></entry><entry><title type="html">Old Glory</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/old-glory" rel="alternate" type="text/html" title="Old Glory" /><published>2026-07-11T16:51:00+01:00</published><updated>2026-07-11T16:51:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/old-glory</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/old-glory"><![CDATA[<p>In which a baby faced Porky can’t be bothered to learn the Pledge of Allegiance, but is shown the error of his ways in a dream by Uncle Sam. Tedious pro-America bullshit.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a baby faced Porky can’t be bothered to learn the Pledge of Allegiance, but is shown the error of his ways in a dream by Uncle Sam. Tedious pro-America bullshit.]]></summary></entry><entry><title type="html">Baby Bottleneck</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/baby-bottleneck" rel="alternate" type="text/html" title="Baby Bottleneck" /><published>2026-07-11T16:49:00+01:00</published><updated>2026-07-11T16:49:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/baby-bottleneck</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/baby-bottleneck"><![CDATA[<p>In which there is extra demand for babies, so the Stork company is overworked. Porky and Daffy are called in to fix it. It doesn’t end well.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which there is extra demand for babies, so the Stork company is overworked. Porky and Daffy are called in to fix it. It doesn’t end well.]]></summary></entry><entry><title type="html">Kitty Kornered</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/kitty-kornered" rel="alternate" type="text/html" title="Kitty Kornered" /><published>2026-07-11T16:47:00+01:00</published><updated>2026-07-11T16:47:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/kitty-kornered</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/kitty-kornered"><![CDATA[<p>In which Porky has difficulty putting his cats (a collection of proto-Sylvesters especially their leader) out.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Porky has difficulty putting his cats (a collection of proto-Sylvesters especially their leader) out.]]></summary></entry><entry><title type="html">Tweetie Pie</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/tweetie-pie" rel="alternate" type="text/html" title="Tweetie Pie" /><published>2026-07-11T16:45:00+01:00</published><updated>2026-07-11T16:45:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/tweetie-pie</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/tweetie-pie"><![CDATA[<p>In which a slightly proto Sylvester called Thomas tries to eat proto-Tweety.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a slightly proto Sylvester called Thomas tries to eat proto-Tweety.]]></summary></entry><entry><title type="html">Snow Business</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/snow-business" rel="alternate" type="text/html" title="Snow Business" /><published>2026-07-11T16:43:00+01:00</published><updated>2026-07-11T16:43:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/snow-business</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/snow-business"><![CDATA[<p>In which Sylvester and Tweety are trapped by snow in a remote cabin. With no sources of food, Sylvester must eat Tweety while avoiding being eaten by an insane mouse.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Sylvester and Tweety are trapped by snow in a remote cabin. With no sources of food, Sylvester must eat Tweety while avoiding being eaten by an insane mouse.]]></summary></entry><entry><title type="html">A Bird in a Guilty Cage</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/a-bird-in-a-guilty-cage" rel="alternate" type="text/html" title="A Bird in a Guilty Cage" /><published>2026-07-11T16:41:00+01:00</published><updated>2026-07-11T16:41:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/a-bird-in-a-guilty-cage</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/a-bird-in-a-guilty-cage"><![CDATA[<p>In which Sylvester tries to eat Tweety in a department store. After ogling the manikins and trying on hats he succeeds, but it turns out he ate some TNT.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Sylvester tries to eat Tweety in a department store. After ogling the manikins and trying on hats he succeeds, but it turns out he ate some TNT.]]></summary></entry><entry><title type="html">Ain’t She Tweet</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/aint-she-tweet" rel="alternate" type="text/html" title="Ain’t She Tweet" /><published>2026-07-11T16:39:00+01:00</published><updated>2026-07-11T16:39:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/aint-she-tweet</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/aint-she-tweet"><![CDATA[<p>In which Sylvester spies a tasty looking bird in the window, but unfortunately it is bought by Granny, who has an army of dogs.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Sylvester spies a tasty looking bird in the window, but unfortunately it is bought by Granny, who has an army of dogs.]]></summary></entry><entry><title type="html">Gift Wrapped</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/gift-wrapped" rel="alternate" type="text/html" title="Gift Wrapped" /><published>2026-07-11T16:37:00+01:00</published><updated>2026-07-11T16:37:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/gift-wrapped</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/gift-wrapped"><![CDATA[<p>In which Sylvester tries to eat Tweety at Christmas, while not being eaten by a big grey dog. Contains much arse smacking by Granny (it’s funnier than it sounds).</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Sylvester tries to eat Tweety at Christmas, while not being eaten by a big grey dog. Contains much arse smacking by Granny (it’s funnier than it sounds).]]></summary></entry><entry><title type="html">Bad Ol’ Putty Tat</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/tweet-tweet-tweety" rel="alternate" type="text/html" title="Bad Ol’ Putty Tat" /><published>2026-07-11T16:36:00+01:00</published><updated>2026-07-11T16:36:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/tweet-tweet-tweety</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/tweet-tweet-tweety"><![CDATA[<p>In which Sylvester tries to eat Tweety on holiday in the woods.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Sylvester tries to eat Tweety on holiday in the woods.]]></summary></entry><entry><title type="html">Bad Ol’ Putty Tat</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/room-and-bird" rel="alternate" type="text/html" title="Bad Ol’ Putty Tat" /><published>2026-07-11T16:35:00+01:00</published><updated>2026-07-11T16:35:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/room-and-bird</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/room-and-bird"><![CDATA[<p>In which Tweety and Sylvester are smuggled into a block of flats. Sylvester must hunt Tweety while avoiding the manager.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Tweety and Sylvester are smuggled into a block of flats. Sylvester must hunt Tweety while avoiding the manager.]]></summary></entry><entry><title type="html">All Abir-r-r-d</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/all-abir-r-r-d" rel="alternate" type="text/html" title="All Abir-r-r-d" /><published>2026-07-11T16:33:00+01:00</published><updated>2026-07-11T16:33:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/all-abir-r-r-d</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/all-abir-r-r-d"><![CDATA[<p>In which Sylvester tries to eat Tweety on a train, while avoiding a vicious dog.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Sylvester tries to eat Tweety on a train, while avoiding a vicious dog.]]></summary></entry><entry><title type="html">Bad Ol’ Putty Tat</title><link href="https://scown.space/warner-bros-cartoons/2026/07/11/bad-ol-putty-tat" rel="alternate" type="text/html" title="Bad Ol’ Putty Tat" /><published>2026-07-11T16:31:00+01:00</published><updated>2026-07-11T16:31:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/07/11/bad-ol-putty-tat</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/07/11/bad-ol-putty-tat"><![CDATA[<p>In which Sylvester tries to catch Tweety in his garden home.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Sylvester tries to catch Tweety in his garden home.]]></summary></entry><entry><title type="html">Linguine o Tagliolini al Prezzemolo</title><link href="https://scown.space/pasta-codex/2026/07/11/linguine-parsley" rel="alternate" type="text/html" title="Linguine o Tagliolini al Prezzemolo" /><published>2026-07-11T16:04:00+01:00</published><updated>2026-07-11T16:04:00+01:00</updated><id>https://scown.space/pasta-codex/2026/07/11/linguine-parsley</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/07/11/linguine-parsley"><![CDATA[<p>Pasta in a parsley and onion/milk sauce.</p>

<p>Slightly tricky to time correctly, in that the milk needs not to go in too early or it will overcook before the pasta is ready.</p>

<p>Made here with Bucatini.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta in a parsley and onion/milk sauce.]]></summary></entry><entry><title type="html">Spaghetti alla Savonese</title><link href="https://scown.space/pasta-codex/2026/07/11/savona-spaghetti" rel="alternate" type="text/html" title="Spaghetti alla Savonese" /><published>2026-07-11T15:51:00+01:00</published><updated>2026-07-11T15:51:00+01:00</updated><id>https://scown.space/pasta-codex/2026/07/11/savona-spaghetti</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/07/11/savona-spaghetti"><![CDATA[<p>Pasta with garlic, butter and herbs.</p>

<p>Quite garlicky, but I think that’s probably the point.</p>

<p>Made here with Bucatini.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with garlic, butter and herbs.]]></summary></entry><entry><title type="html">Bucatini al Brandy</title><link href="https://scown.space/pasta-codex/2026/06/27/bucatini-brandy" rel="alternate" type="text/html" title="Bucatini al Brandy" /><published>2026-06-27T17:17:00+01:00</published><updated>2026-06-27T17:17:00+01:00</updated><id>https://scown.space/pasta-codex/2026/06/27/bucatini-brandy</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/06/27/bucatini-brandy"><![CDATA[<p>Pasta with tomatoes, onion, celery, and carrot, with a small amount of brandy.</p>

<p>You can smell the brandy when cooking but it’s barely perceptible in the final dish.</p>

<p>Photograph missing for this one.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with tomatoes, onion, celery, and carrot, with a small amount of brandy.]]></summary></entry><entry><title type="html">Pasta al Burro e Pomodoro – IV Ricetta</title><link href="https://scown.space/pasta-codex/2026/06/27/pasta-butter-tomatoes-iv" rel="alternate" type="text/html" title="Pasta al Burro e Pomodoro – IV Ricetta" /><published>2026-06-27T17:11:00+01:00</published><updated>2026-06-27T17:11:00+01:00</updated><id>https://scown.space/pasta-codex/2026/06/27/pasta-butter-tomatoes-iv</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/06/27/pasta-butter-tomatoes-iv"><![CDATA[<p>Pasta with tomatoes, onion and garlic, all fried in butter.</p>

<p>Doesn’t really seem to become a sauce, or at least not on a reasonable timescale.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with tomatoes, onion and garlic, all fried in butter.]]></summary></entry><entry><title type="html">A Bear for Punishment</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/a-bear-for-punishment" rel="alternate" type="text/html" title="A Bear for Punishment" /><published>2026-06-13T17:15:00+01:00</published><updated>2026-06-13T17:15:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/a-bear-for-punishment</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/a-bear-for-punishment"><![CDATA[<p>In which Pa Bear must endure well-meaning abuse from his wife and son, because it is Fathers’ Day.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Pa Bear must endure well-meaning abuse from his wife and son, because it is Fathers’ Day.]]></summary></entry><entry><title type="html">Mouse Wreckers</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/mouse-wreckers" rel="alternate" type="text/html" title="Mouse Wreckers" /><published>2026-06-13T17:13:00+01:00</published><updated>2026-06-13T17:13:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/mouse-wreckers</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/mouse-wreckers"><![CDATA[<p>In which Hubie and Bertie try to drive Claude Cat out of his house so they can move in.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Hubie and Bertie try to drive Claude Cat out of his house so they can move in.]]></summary></entry><entry><title type="html">The Dover Boys</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/the-dover-boys" rel="alternate" type="text/html" title="The Dover Boys" /><published>2026-06-13T17:10:00+01:00</published><updated>2026-06-13T17:10:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/the-dover-boys</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/the-dover-boys"><![CDATA[<p>In which the Dover Boys (Tom, Dick, and Larry) of Pimento University must save their sweetheart Doris Standpipe from their nemesis Don Backslide.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the Dover Boys (Tom, Dick, and Larry) of Pimento University must save their sweetheart Doris Standpipe from their nemesis Don Backslide.]]></summary></entry><entry><title type="html">Cheese Chasers</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/cheese-chasers" rel="alternate" type="text/html" title="Cheese Chasers" /><published>2026-06-13T17:08:00+01:00</published><updated>2026-06-13T17:08:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/cheese-chasers</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/cheese-chasers"><![CDATA[<p>In which Hubie and Bertie forgo cheese and try to be eaten by Claude cat, who in turn tries to get attacked by a dog (Marc Antony?).</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Hubie and Bertie forgo cheese and try to be eaten by Claude cat, who in turn tries to get attacked by a dog (Marc Antony?).]]></summary></entry><entry><title type="html">Whoa Be Gone</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/whoa-be-gone" rel="alternate" type="text/html" title="Whoa Be Gone" /><published>2026-06-13T17:05:00+01:00</published><updated>2026-06-13T17:05:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/whoa-be-gone</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/whoa-be-gone"><![CDATA[<p>In which the Coyote falls off cliffs while trying to catch the Roadrunner with TNT and tornado seeds.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the Coyote falls off cliffs while trying to catch the Roadrunner with TNT and tornado seeds.]]></summary></entry><entry><title type="html">Zoom and Bored</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/zoom-and-bored" rel="alternate" type="text/html" title="Zoom and Bored" /><published>2026-06-13T17:03:00+01:00</published><updated>2026-06-13T17:03:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/zoom-and-bored</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/zoom-and-bored"><![CDATA[<p>In which the Coyote tries to catch the Roadrunner with bees, boulders, and a one sided wall.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the Coyote tries to catch the Roadrunner with bees, boulders, and a one sided wall.]]></summary></entry><entry><title type="html">Scrambled Aches</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/scrambled-aches" rel="alternate" type="text/html" title="Scrambled Aches" /><published>2026-06-13T17:01:00+01:00</published><updated>2026-06-13T17:01:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/scrambled-aches</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/scrambled-aches"><![CDATA[<p>In which the Coyote tries to catch the Roadrunner with an anvil on a balloon, TNT on a lassoo, and a steamroller.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the Coyote tries to catch the Roadrunner with an anvil on a balloon, TNT on a lassoo, and a steamroller.]]></summary></entry><entry><title type="html">There They Go Go Go</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/there-they-go-go-go" rel="alternate" type="text/html" title="There They Go Go Go" /><published>2026-06-13T16:59:00+01:00</published><updated>2026-06-13T16:59:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/there-they-go-go-go</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/there-they-go-go-go"><![CDATA[<p>In which the Coyote tries to catch the Roadrunner with a broken ladder, and a TNT Catherine wheel. Closes with a fourth wall gag.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the Coyote tries to catch the Roadrunner with a broken ladder, and a TNT Catherine wheel. Closes with a fourth wall gag.]]></summary></entry><entry><title type="html">Gee Whiz-z-z</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/gee-whiz-z-z" rel="alternate" type="text/html" title="Gee Whiz-z-z" /><published>2026-06-13T16:57:00+01:00</published><updated>2026-06-13T16:57:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/gee-whiz-z-z</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/gee-whiz-z-z"><![CDATA[<p>In which the Coyote tries to catch the Roadrunner with TNT, an anvil, and ACME handlebars. Features an unusual title sequence and a variation on the tunnel gag.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the Coyote tries to catch the Roadrunner with TNT, an anvil, and ACME handlebars. Features an unusual title sequence and a variation on the tunnel gag.]]></summary></entry><entry><title type="html">Guided Muscle</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/guided-muscle" rel="alternate" type="text/html" title="Guided Muscle" /><published>2026-06-13T16:55:00+01:00</published><updated>2026-06-13T16:55:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/guided-muscle</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/guided-muscle"><![CDATA[<p>In which the Coyote tries to catch the Roadrunner, having tired of eating tin cans, with TNT on a fishing rod, and a tar and feathering machine.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the Coyote tries to catch the Roadrunner, having tired of eating tin cans, with TNT on a fishing rod, and a tar and feathering machine.]]></summary></entry><entry><title type="html">Ready, Set, Zoom!</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/ready-set-zoom" rel="alternate" type="text/html" title="Ready, Set, Zoom!" /><published>2026-06-13T16:51:00+01:00</published><updated>2026-06-13T16:51:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/ready-set-zoom</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/ready-set-zoom"><![CDATA[<p>In which the Coyote tries to catch the Roadrunner with Acme glue, false signage and a female roadrunner costume.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the Coyote tries to catch the Roadrunner with Acme glue, false signage and a female roadrunner costume.]]></summary></entry><entry><title type="html">Stop! Look! and Hasten!</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/stop-look-and-hasten" rel="alternate" type="text/html" title="Stop! Look! and Hasten!" /><published>2026-06-13T16:49:00+01:00</published><updated>2026-06-13T16:49:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/stop-look-and-hasten</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/stop-look-and-hasten"><![CDATA[<p>In which the Coyote tries to catch the Roadrunner with a metal gate and a Burnese Tiger (Surprisibus! Surprisibus!) trap. In the process he has a run in with a train.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the Coyote tries to catch the Roadrunner with a metal gate and a Burnese Tiger (Surprisibus! Surprisibus!) trap. In the process he has a run in with a train.]]></summary></entry><entry><title type="html">Zipping Along</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/zipping-along" rel="alternate" type="text/html" title="Zipping Along" /><published>2026-06-13T16:47:00+01:00</published><updated>2026-06-13T16:47:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/zipping-along</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/zipping-along"><![CDATA[<p>In which the Coyote tries to catch the Roadrunner with a kite, steel shot and TNT.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the Coyote tries to catch the Roadrunner with a kite, steel shot and TNT.]]></summary></entry><entry><title type="html">Going! Going! Gosh!</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/going-going-gosh" rel="alternate" type="text/html" title="Going! Going! Gosh!" /><published>2026-06-13T16:45:00+01:00</published><updated>2026-06-13T16:45:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/going-going-gosh</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/going-going-gosh"><![CDATA[<p>In which the Coyote tries to catch the Roadrunner by painting fake road onto a board and by using a balloon. Features a long gag involving rolling a boulder down a hill.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the Coyote tries to catch the Roadrunner by painting fake road onto a board and by using a balloon. Features a long gag involving rolling a boulder down a hill.]]></summary></entry><entry><title type="html">Beep Beep</title><link href="https://scown.space/warner-bros-cartoons/2026/06/13/beep-beep" rel="alternate" type="text/html" title="Beep Beep" /><published>2026-06-13T16:39:00+01:00</published><updated>2026-06-13T16:39:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/13/beep-beep</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/13/beep-beep"><![CDATA[<p>In which Wile E. Coyote tries to catch Roadrunner with anvils, TNT, and rocket powered skates. Features an excellent sequence in a mine.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Wile E. Coyote tries to catch Roadrunner with anvils, TNT, and rocket powered skates. Features an excellent sequence in a mine.]]></summary></entry><entry><title type="html">Pasta al Burro e Pomodoro – III Ricetta</title><link href="https://scown.space/pasta-codex/2026/06/13/butter-tomatoes-iii" rel="alternate" type="text/html" title="Pasta al Burro e Pomodoro – III Ricetta" /><published>2026-06-13T16:28:00+01:00</published><updated>2026-06-13T16:28:00+01:00</updated><id>https://scown.space/pasta-codex/2026/06/13/butter-tomatoes-iii</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/06/13/butter-tomatoes-iii"><![CDATA[<p>Pasta with butter, spring onions and tomatoes.</p>

<p>Spring onions turn out to be another ingredient that means something different in America – they would call these Scallions. The intended ingredient is probably closer to a Continental Salad Onion. Alas, I only realised this at the point of cooking, so here we are.</p>

<p>It’s fine but I’m not sure the spring onions improve it.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with butter, spring onions and tomatoes.]]></summary></entry><entry><title type="html">Hyde and Hare</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/hyde-and-hare" rel="alternate" type="text/html" title="Hyde and Hare" /><published>2026-06-06T17:49:00+01:00</published><updated>2026-06-06T17:49:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/hyde-and-hare</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/hyde-and-hare"><![CDATA[<p>In which Bugs Bunny is adopted by Dr. Jekyll. Saw this once on TV some years back (Y10?) and subsequently downloaded it. My memory of it was fairly complete.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs Bunny is adopted by Dr. Jekyll. Saw this once on TV some years back (Y10?) and subsequently downloaded it. My memory of it was fairly complete.]]></summary></entry><entry><title type="html">Baby Buggy Bunny</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/baby-buggy-bunny" rel="alternate" type="text/html" title="Baby Buggy Bunny" /><published>2026-06-06T17:46:00+01:00</published><updated>2026-06-06T17:46:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/baby-buggy-bunny</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/baby-buggy-bunny"><![CDATA[<p>In which a criminal who looks like a baby (perhaps he has a rare disease) robs a bank, but then loses the money to Bugs Bunny. He attempts to recover his ill-gotten fortune.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a criminal who looks like a baby (perhaps he has a rare disease) robs a bank, but then loses the money to Bugs Bunny. He attempts to recover his ill-gotten fortune.]]></summary></entry><entry><title type="html">Slick Hare</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/slick-hare" rel="alternate" type="text/html" title="Slick Hare" /><published>2026-06-06T17:45:00+01:00</published><updated>2026-06-06T17:45:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/slick-hare</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/slick-hare"><![CDATA[<p>In which Elmer Fudd must deliver Humphrey Bogart a rabbit for dinner. Again a large number of visual gags.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Elmer Fudd must deliver Humphrey Bogart a rabbit for dinner. Again a large number of visual gags.]]></summary></entry><entry><title type="html">Rabbit Transit</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/rabbit-transit" rel="alternate" type="text/html" title="Rabbit Transit" /><published>2026-06-06T17:40:00+01:00</published><updated>2026-06-06T17:40:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/rabbit-transit</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/rabbit-transit"><![CDATA[<p>In which Bugs and Cecil have a final showdown (though discontinuous from both previous cartoons). Lots of visual gags, including an early version of the Roadrunner tunnel.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs and Cecil have a final showdown (though discontinuous from both previous cartoons). Lots of visual gags, including an early version of the Roadrunner tunnel.]]></summary></entry><entry><title type="html">Tortoise Beats Hare</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/tortoise-beats-hare" rel="alternate" type="text/html" title="Tortoise Beats Hare" /><published>2026-06-06T17:37:00+01:00</published><updated>2026-06-06T17:37:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/tortoise-beats-hare</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/tortoise-beats-hare"><![CDATA[<p>In which Bugs is beaten in a race by Cecil Turtle, who has his family helping him out.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs is beaten in a race by Cecil Turtle, who has his family helping him out.]]></summary></entry><entry><title type="html">Little Red Riding Rabbit</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/little-red-riding-rabbit" rel="alternate" type="text/html" title="Little Red Riding Rabbit" /><published>2026-06-06T17:34:00+01:00</published><updated>2026-06-06T17:34:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/little-red-riding-rabbit</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/little-red-riding-rabbit"><![CDATA[<p>In which Bugs is the rabbit Little Red Riding Hood is taking to Grandma for dinner. Grandma is out, but the wolf takes her place anyway.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs is the rabbit Little Red Riding Hood is taking to Grandma for dinner. Grandma is out, but the wolf takes her place anyway.]]></summary></entry><entry><title type="html">The Heckling Hare</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/the-heckling-hare" rel="alternate" type="text/html" title="The Heckling Hare" /><published>2026-06-06T17:32:00+01:00</published><updated>2026-06-06T17:32:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/the-heckling-hare</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/the-heckling-hare"><![CDATA[<p>In which Bugs torments a stupid dog that is out to get him. Features a long cliff gag at its conclusion, which lead to Tex Avery leaving the studio.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs torments a stupid dog that is out to get him. Features a long cliff gag at its conclusion, which lead to Tex Avery leaving the studio.]]></summary></entry><entry><title type="html">Hare Conditioned</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/hare-conditioned" rel="alternate" type="text/html" title="Hare Conditioned" /><published>2026-06-06T17:26:00+01:00</published><updated>2026-06-06T17:26:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/hare-conditioned</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/hare-conditioned"><![CDATA[<p>In which Bugs is on display in the outdoor section of a department store. He is then moved to the Taxidermy department, and must escape from a vengeful manager. Features an excellent lift scene.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs is on display in the outdoor section of a department store. He is then moved to the Taxidermy department, and must escape from a vengeful manager. Features an excellent lift scene.]]></summary></entry><entry><title type="html">The Hare-Brained Hypnotist</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/the-hare-brained-hypnotist" rel="alternate" type="text/html" title="The Hare-Brained Hypnotist" /><published>2026-06-06T17:24:00+01:00</published><updated>2026-06-06T17:24:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/the-hare-brained-hypnotist</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/the-hare-brained-hypnotist"><![CDATA[<p>In which Elmer Fudd becomes a hypnotist to try and tame wild animals. After successfully hypnotising a bear he tries his luck on Bugs Bunny, who makes Elmer think he’s a rabbit.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Elmer Fudd becomes a hypnotist to try and tame wild animals. After successfully hypnotising a bear he tries his luck on Bugs Bunny, who makes Elmer think he’s a rabbit.]]></summary></entry><entry><title type="html">Gorilla My Dreams</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/gorilla-my-dreams" rel="alternate" type="text/html" title="Gorilla My Dreams" /><published>2026-06-06T17:19:00+01:00</published><updated>2026-06-06T17:19:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/gorilla-my-dreams</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/gorilla-my-dreams"><![CDATA[<p>In which Bugs is adopted by a Gorilla who wants a baby, and then fights with his “Dad”. I was expecting this to be the one from <cite>1001 Rabbit Tales</cite>, but was disappointed.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs is adopted by a Gorilla who wants a baby, and then fights with his “Dad”. I was expecting this to be the one from 1001 Rabbit Tales, but was disappointed.]]></summary></entry><entry><title type="html">French Rarebit</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/french-rarebit" rel="alternate" type="text/html" title="French Rarebit" /><published>2026-06-06T17:16:00+01:00</published><updated>2026-06-06T17:16:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/french-rarebit</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/french-rarebit"><![CDATA[<p>In which Bugs Bunny arrives in France, where two French chefs compete to put him in a stew.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs Bunny arrives in France, where two French chefs compete to put him in a stew.]]></summary></entry><entry><title type="html">Bunny Hugged</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/bunny-hugged" rel="alternate" type="text/html" title="Bunny Hugged" /><published>2026-06-06T17:14:00+01:00</published><updated>2026-06-06T17:14:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/bunny-hugged</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/bunny-hugged"><![CDATA[<p>In which Bugs fills in for Ravishing Ronno, his master, in a boxing match against the aptly named Crusher. Eventually Bugs tricks his opponent out of the title.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs fills in for Ravishing Ronno, his master, in a boxing match against the aptly named Crusher. Eventually Bugs tricks his opponent out of the title.]]></summary></entry><entry><title type="html">Bugs Bunny Rides Again</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/bugs-bunny-rides-again" rel="alternate" type="text/html" title="Bugs Bunny Rides Again" /><published>2026-06-06T17:10:00+01:00</published><updated>2026-06-06T17:10:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/bugs-bunny-rides-again</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/bugs-bunny-rides-again"><![CDATA[<p>In which Yosemite Sam decides Rising Gorge ain’t big enough for him and Bugs Bunny. After resorting to duelling and cards, Bugs eventually leaves of his own free will.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Yosemite Sam decides Rising Gorge ain’t big enough for him and Bugs Bunny. After resorting to duelling and cards, Bugs eventually leaves of his own free will.]]></summary></entry><entry><title type="html">Broomstick Bunny</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/broomstick-bunny" rel="alternate" type="text/html" title="Broomstick Bunny" /><published>2026-06-06T17:08:00+01:00</published><updated>2026-06-06T17:08:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/broomstick-bunny</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/broomstick-bunny"><![CDATA[<p>In which a trick-or-treating Bugs encounters Witch Hazel. The backgrounds are decidedly odd.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a trick-or-treating Bugs encounters Witch Hazel. The backgrounds are decidedly odd.]]></summary></entry><entry><title type="html">The Big Snooze</title><link href="https://scown.space/warner-bros-cartoons/2026/06/06/the-big-snooze" rel="alternate" type="text/html" title="The Big Snooze" /><published>2026-06-06T17:05:00+01:00</published><updated>2026-06-06T17:05:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/06/06/the-big-snooze</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/06/06/the-big-snooze"><![CDATA[<p>In which Elmer Fudd tears up his contract with Jack Warner and retreats for “west and wewaxation”. Bugs invades his dreams and scares him into coming back. A surreal oddity.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Elmer Fudd tears up his contract with Jack Warner and retreats for “west and wewaxation”. Bugs invades his dreams and scares him into coming back. A surreal oddity.]]></summary></entry><entry><title type="html">Pasta al Burro e Pomodoro – II Ricetta</title><link href="https://scown.space/pasta-codex/2026/06/06/pasta-butter-tomatoes-ii" rel="alternate" type="text/html" title="Pasta al Burro e Pomodoro – II Ricetta" /><published>2026-06-06T16:33:00+01:00</published><updated>2026-06-06T16:33:00+01:00</updated><id>https://scown.space/pasta-codex/2026/06/06/pasta-butter-tomatoes-ii</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/06/06/pasta-butter-tomatoes-ii"><![CDATA[<p>Pasta tossed with a tomato, butter and cheese sauce.</p>

<p>Very similar to the previous recipe but with more butter and the cheese integrated into the sauce. This is a better treatment but the high fat content means you’d want to eat it sparingly.</p>

<p>Again, I used tinned peeled plum tomatoes.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta tossed with a tomato, butter and cheese sauce.]]></summary></entry><entry><title type="html">Pasta al Burro e Pomodoro – I Ricetta</title><link href="https://scown.space/pasta-codex/2026/06/06/pasta-butter-tomatoes-i" rel="alternate" type="text/html" title="Pasta al Burro e Pomodoro – I Ricetta" /><published>2026-06-06T16:19:00+01:00</published><updated>2026-06-06T16:19:00+01:00</updated><id>https://scown.space/pasta-codex/2026/06/06/pasta-butter-tomatoes-i</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/06/06/pasta-butter-tomatoes-i"><![CDATA[<p>Pasta topped with a tomato and butter sauce.</p>

<p>I used tinned peeled plum tomatoes to save having to cook some tomatoes in their own juices for 45 minutes.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta topped with a tomato and butter sauce.]]></summary></entry><entry><title type="html">Spaghetti alla Salsa di Pomodoro col Latte</title><link href="https://scown.space/pasta-codex/2026/06/06/spaghetti-tomatoes-milk" rel="alternate" type="text/html" title="Spaghetti alla Salsa di Pomodoro col Latte" /><published>2026-06-06T16:17:00+01:00</published><updated>2026-06-06T16:17:00+01:00</updated><id>https://scown.space/pasta-codex/2026/06/06/spaghetti-tomatoes-milk</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/06/06/spaghetti-tomatoes-milk"><![CDATA[<p>Pasta with a tomato sauce, with some milk added.</p>

<p>You can taste that the milk is there, but it doesn’t really add much to the dish.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with a tomato sauce, with some milk added.]]></summary></entry><entry><title type="html">Bosko the Talk-Ink Kid</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/bosko-the-talk-ink-kid" rel="alternate" type="text/html" title="Bosko the Talk-Ink Kid" /><published>2026-05-30T15:54:00+01:00</published><updated>2026-05-30T15:54:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/bosko-the-talk-ink-kid</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/bosko-the-talk-ink-kid"><![CDATA[<p>In which a small negro child is drawn, and sings and dances (but doesn’t play the ukulele). The quality is poor, and the content has faintly racist implications. For historical use only.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a small negro child is drawn, and sings and dances (but doesn’t play the ukulele). The quality is poor, and the content has faintly racist implications. For historical use only.]]></summary></entry><entry><title type="html">Devil May Hare</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/devil-may-hare" rel="alternate" type="text/html" title="Devil May Hare" /><published>2026-05-30T15:52:00+01:00</published><updated>2026-05-30T15:52:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/devil-may-hare</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/devil-may-hare"><![CDATA[<p>In which Bugs is paid a visit by the Tasmanian Devil, before getting rid of him by marrying him off to another devil.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs is paid a visit by the Tasmanian Devil, before getting rid of him by marrying him off to another devil.]]></summary></entry><entry><title type="html">Broken Leghorn</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/broken-leghorn" rel="alternate" type="text/html" title="Broken Leghorn" /><published>2026-05-30T15:51:00+01:00</published><updated>2026-05-30T15:51:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/broken-leghorn</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/broken-leghorn"><![CDATA[<p>In which Foghorn finds his position as farm rooster under threat from a new arrival.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Foghorn finds his position as farm rooster under threat from a new arrival.]]></summary></entry><entry><title type="html">Early to Bet</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/early-to-bet" rel="alternate" type="text/html" title="Early to Bet" /><published>2026-05-30T15:47:00+01:00</published><updated>2026-05-30T15:47:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/early-to-bet</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/early-to-bet"><![CDATA[<p>In which the Gambling Bug (whose bite causes Gambling Fever) inflicts himself upon a cat who ends up playing Gin Rummy with a dog.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the Gambling Bug (whose bite causes Gambling Fever) inflicts himself upon a cat who ends up playing Gin Rummy with a dog.]]></summary></entry><entry><title type="html">Daffy Duck Hunt</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/daffy-duck-hunt" rel="alternate" type="text/html" title="Daffy Duck Hunt" /><published>2026-05-30T15:32:00+01:00</published><updated>2026-05-30T15:32:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/daffy-duck-hunt</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/daffy-duck-hunt"><![CDATA[<p>In which Daffy [illegible] the dog’s oven for Porky’s freezer.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Daffy [illegible] the dog’s oven for Porky’s freezer.]]></summary></entry><entry><title type="html">The Foghorn Leghorn</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/the-foghorn-leghorn" rel="alternate" type="text/html" title="The Foghorn Leghorn" /><published>2026-05-30T15:29:00+01:00</published><updated>2026-05-30T15:29:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/the-foghorn-leghorn</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/the-foghorn-leghorn"><![CDATA[<p>In which Henery Hawk goes out to bag a chicken, and comes across a slightly proto Foghorn Leghorn, whom he believes is just a loudmouthed shnook.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Henery Hawk goes out to bag a chicken, and comes across a slightly proto Foghorn Leghorn, whom he believes is just a loudmouthed shnook.]]></summary></entry><entry><title type="html">Tweety’s S.O.S.</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/tweetys-sos" rel="alternate" type="text/html" title="Tweety’s S.O.S." /><published>2026-05-30T15:27:00+01:00</published><updated>2026-05-30T15:27:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/tweetys-sos</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/tweetys-sos"><![CDATA[<p>In which Sylvester follows Tweety and Granny onto a ship in an attempt to get a meal.Seasickness ensues.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Sylvester follows Tweety and Granny onto a ship in an attempt to get a meal.Seasickness ensues.]]></summary></entry><entry><title type="html">Speedy Gonzales</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/speedy-gonzales" rel="alternate" type="text/html" title="Speedy Gonzales" /><published>2026-05-30T15:24:00+01:00</published><updated>2026-05-30T15:24:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/speedy-gonzales</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/speedy-gonzales"><![CDATA[<p>In which Speedy Gonzales must rob the cheese factory across the American border, which is being guarded by Sylvester.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Speedy Gonzales must rob the cheese factory across the American border, which is being guarded by Sylvester.]]></summary></entry><entry><title type="html">Lumber Jerks</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/lumber-jerks" rel="alternate" type="text/html" title="Lumber Jerks" /><published>2026-05-30T15:22:00+01:00</published><updated>2026-05-30T15:22:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/lumber-jerks</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/lumber-jerks"><![CDATA[<p>In which the Goofy Gophers must go on a quest to reclaim their tree, which has been cut down to be turned into furniture. The gophers remind me just a little of Terence and Philip.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the Goofy Gophers must go on a quest to reclaim their tree, which has been cut down to be turned into furniture. The gophers remind me just a little of Terence and Philip.]]></summary></entry><entry><title type="html">Canned Feud</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/canned-feud" rel="alternate" type="text/html" title="Canned Feud" /><published>2026-05-30T15:20:00+01:00</published><updated>2026-05-30T15:20:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/canned-feud</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/canned-feud"><![CDATA[<p>In which Sylvester is left behind when his owners go to California. There is plenty of food in the cupboard, but first he must recover the can opener from a mouse.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Sylvester is left behind when his owners go to California. There is plenty of food in the cupboard, but first he must recover the can opener from a mouse.]]></summary></entry><entry><title type="html">Bugs and Thugs</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/bugs-and-thugs" rel="alternate" type="text/html" title="Bugs and Thugs" /><published>2026-05-30T15:19:00+01:00</published><updated>2026-05-30T15:19:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/bugs-and-thugs</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/bugs-and-thugs"><![CDATA[<p>In which Bugs gets caught up in a bank robbery and taken away with the robbers, who soon decide that prison is the better bet.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs gets caught up in a bank robbery and taken away with the robbers, who soon decide that prison is the better bet.]]></summary></entry><entry><title type="html">Putty Tat Trouble</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/putty-tat-trouble" rel="alternate" type="text/html" title="Putty Tat Trouble" /><published>2026-05-30T15:17:00+01:00</published><updated>2026-05-30T15:17:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/putty-tat-trouble</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/putty-tat-trouble"><![CDATA[<p>In which Sylvester and an unnamed ginger cat go after Tweety in the dead of winter. There are some gags involving a drinking bird.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Sylvester and an unnamed ginger cat go after Tweety in the dead of winter. There are some gags involving a drinking bird.]]></summary></entry><entry><title type="html">Kit for Cat</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/kit-for-kat" rel="alternate" type="text/html" title="Kit for Cat" /><published>2026-05-30T15:14:00+01:00</published><updated>2026-05-30T15:14:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/kit-for-kat</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/kit-for-kat"><![CDATA[<p>In which a stray Sylvester and an unnamed kitten vie for the affections of Elmer Fudd. Sylvester misjudges the situation which allows the kitten to gain the upper hand.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a stray Sylvester and an unnamed kitten vie for the affections of Elmer Fudd. Sylvester misjudges the situation which allows the kitten to gain the upper hand.]]></summary></entry><entry><title type="html">Canary Row</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/bunker-hill-bunny" rel="alternate" type="text/html" title="Canary Row" /><published>2026-05-30T15:11:00+01:00</published><updated>2026-05-30T15:11:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/bunker-hill-bunny</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/bunker-hill-bunny"><![CDATA[<p>In which Bugs (We) must defend his fort from Sam (They) in 1776. Sam representing the British is soundly beaten.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs (We) must defend his fort from Sam (They) in 1776. Sam representing the British is soundly beaten.]]></summary></entry><entry><title type="html">Canary Row</title><link href="https://scown.space/warner-bros-cartoons/2026/05/30/canary-row" rel="alternate" type="text/html" title="Canary Row" /><published>2026-05-30T15:07:00+01:00</published><updated>2026-05-30T15:07:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/30/canary-row</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/30/canary-row"><![CDATA[<p>In which Sylvester tries to eat Tweety Pie in a San Francisco hotel. Granny seems to have the measure of Sylvester here.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Sylvester tries to eat Tweety Pie in a San Francisco hotel. Granny seems to have the measure of Sylvester here.]]></summary></entry><entry><title type="html">Drafty, Isn’t It</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/drafty-isnt-it" rel="alternate" type="text/html" title="Drafty, Isn’t It" /><published>2026-05-09T16:45:00+01:00</published><updated>2026-05-09T16:45:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/drafty-isnt-it</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/drafty-isnt-it"><![CDATA[<p>In which one realises the benefits of being drafted.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which one realises the benefits of being drafted.]]></summary></entry><entry><title type="html">So Much for So Little</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/so-much-for-so-little" rel="alternate" type="text/html" title="So Much for So Little" /><published>2026-05-09T16:34:00+01:00</published><updated>2026-05-09T16:34:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/so-much-for-so-little</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/so-much-for-so-little"><![CDATA[<p>In which the government persuades you to pay 3¢ a week to the health department. This being America, paying for it out of taxation would be out of the question.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the government persuades you to pay 3¢ a week to the health department. This being America, paying for it out of taxation would be out of the question.]]></summary></entry><entry><title type="html">The Return of Mr. Hook</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/the-return-of-mr-hook" rel="alternate" type="text/html" title="The Return of Mr. Hook" /><published>2026-05-09T16:28:00+01:00</published><updated>2026-05-09T16:28:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/the-return-of-mr-hook</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/the-return-of-mr-hook"><![CDATA[<p>In which a sailor returns home from the war.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a sailor returns home from the war.]]></summary></entry><entry><title type="html">Spies</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/spies" rel="alternate" type="text/html" title="Spies" /><published>2026-05-09T16:25:00+01:00</published><updated>2026-05-09T16:25:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/spies</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/spies"><![CDATA[<p>In which Private Snafu is unable to keep his war orders secret. Written by Dr. Seuss.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Private Snafu is unable to keep his war orders secret. Written by Dr. Seuss.]]></summary></entry><entry><title type="html">Any Bonds Today</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/any-bonds-today" rel="alternate" type="text/html" title="Any Bonds Today" /><published>2026-05-09T16:19:00+01:00</published><updated>2026-05-09T16:19:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/any-bonds-today</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/any-bonds-today"><![CDATA[<p>In which Bugs Bunny sells war bonds.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs Bunny sells war bonds.]]></summary></entry><entry><title type="html">Lady, Play Your Mandolin</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/lady-play-your-mandolin" rel="alternate" type="text/html" title="Lady, Play Your Mandolin" /><published>2026-05-09T16:18:00+01:00</published><updated>2026-05-09T16:18:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/lady-play-your-mandolin</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/lady-play-your-mandolin"><![CDATA[<p>In which cartoon animals get drunk and dance to the tune of <cite>Lady, Play Your Mandolin</cite>. All it needs is a ukelele.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which cartoon animals get drunk and dance to the tune of Lady, Play Your Mandolin. All it needs is a ukelele.]]></summary></entry><entry><title type="html">Bosko the Talk Ink Kid</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/bosko-the-talk-ink-kid" rel="alternate" type="text/html" title="Bosko the Talk Ink Kid" /><published>2026-05-09T16:12:00+01:00</published><updated>2026-05-09T16:12:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/bosko-the-talk-ink-kid</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/bosko-the-talk-ink-kid"><![CDATA[<p>In which a crudely animated negro child does stuff. Full version elsewhere, perhaps.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a crudely animated negro child does stuff. Full version elsewhere, perhaps.]]></summary></entry><entry><title type="html">Tortoise Wins by a Hare</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/tortoise-wins-by-a-hare" rel="alternate" type="text/html" title="Tortoise Wins by a Hare" /><published>2026-05-09T15:58:00+01:00</published><updated>2026-05-09T15:58:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/tortoise-wins-by-a-hare</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/tortoise-wins-by-a-hare"><![CDATA[<p>In which Cecil Tortoise beats Bugs in a race for the second time, despite (or perhaps because of) the best efforts of the mob.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Cecil Tortoise beats Bugs in a race for the second time, despite (or perhaps because of) the best efforts of the mob.]]></summary></entry><entry><title type="html">Bugs Bunny Gets the Boid</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/bugs-bunny-gets-the-boid" rel="alternate" type="text/html" title="Bugs Bunny Gets the Boid" /><published>2026-05-09T15:56:00+01:00</published><updated>2026-05-09T15:56:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/bugs-bunny-gets-the-boid</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/bugs-bunny-gets-the-boid"><![CDATA[<p>In which a very stupid buzzard is tasked to bring home a rabbit. Features a scene in which Bugs and the buzzard believe they are dead.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a very stupid buzzard is tasked to bring home a rabbit. Features a scene in which Bugs and the buzzard believe they are dead.]]></summary></entry><entry><title type="html">Don’t Give Up the Sheep</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/dont-give-up-the-sheep" rel="alternate" type="text/html" title="Don’t Give Up the Sheep" /><published>2026-05-09T15:54:00+01:00</published><updated>2026-05-09T15:54:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/dont-give-up-the-sheep</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/dont-give-up-the-sheep"><![CDATA[<p>In which Ralph Wolf attempts to steal sheep from Sam Sheepdog. This series is underrated. The cliff gag is particularly good.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Ralph Wolf attempts to steal sheep from Sam Sheepdog. This series is underrated. The cliff gag is particularly good.]]></summary></entry><entry><title type="html">Feed the Kitty</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/feed-the-kitty" rel="alternate" type="text/html" title="Feed the Kitty" /><published>2026-05-09T15:52:00+01:00</published><updated>2026-05-09T15:52:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/feed-the-kitty</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/feed-the-kitty"><![CDATA[<p>In which Marc Anthony the dog looks after a kitten he found near his house. It is surprisingly heartwarming.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Marc Anthony the dog looks after a kitten he found near his house. It is surprisingly heartwarming.]]></summary></entry><entry><title type="html">Baton Bunny</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/baton-bunny" rel="alternate" type="text/html" title="Baton Bunny" /><published>2026-05-09T15:49:00+01:00</published><updated>2026-05-09T15:49:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/baton-bunny</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/baton-bunny"><![CDATA[<p>In which Bugs conducts an orchestra playing <cite>Morning, Noon and Night in Vienna</cite>. <cite>Rhapsody Rabbit</cite> is better.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs conducts an orchestra playing Morning, Noon and Night in Vienna. Rhapsody Rabbit is better.]]></summary></entry><entry><title type="html">The Hypo-Chondri-Cat</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/hypo-chondri-cat" rel="alternate" type="text/html" title="The Hypo-Chondri-Cat" /><published>2026-05-09T15:47:00+01:00</published><updated>2026-05-09T15:47:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/hypo-chondri-cat</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/hypo-chondri-cat"><![CDATA[<p>In which two mice torment a hypochondriac cat named Claude. Includes a trippy dream sequence in the middle.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which two mice torment a hypochondriac cat named Claude. Includes a trippy dream sequence in the middle.]]></summary></entry><entry><title type="html">Frigid Hare</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/frigid-hare" rel="alternate" type="text/html" title="Frigid Hare" /><published>2026-05-09T15:43:00+01:00</published><updated>2026-05-09T15:43:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/frigid-hare</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/frigid-hare"><![CDATA[<p>In which Bugs visits a cold climate with both an Inuit and a penguin.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs visits a cold climate with both an Inuit and a penguin.]]></summary></entry><entry><title type="html">For Scent-imental Reasons</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/for-scent-imental-reasons" rel="alternate" type="text/html" title="For Scent-imental Reasons" /><published>2026-05-09T15:41:00+01:00</published><updated>2026-05-09T15:41:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/for-scent-imental-reasons</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/for-scent-imental-reasons"><![CDATA[<p>In which Pepé Le Pew, a skunk who believes himself to be God’s gift, pursues a cat who is having none of it.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Pepé Le Pew, a skunk who believes himself to be God’s gift, pursues a cat who is having none of it.]]></summary></entry><entry><title type="html">Haredevil Hare</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/haredevil-hare" rel="alternate" type="text/html" title="Haredevil Hare" /><published>2026-05-09T15:38:00+01:00</published><updated>2026-05-09T15:38:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/haredevil-hare</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/haredevil-hare"><![CDATA[<p>In which Bugs is sent to Mars, where he must prevent Marvin the Martian from blowing up the Earth. Marvin is seen here without his distinctive voice.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs is sent to Mars, where he must prevent Marvin the Martian from blowing up the Earth. Marvin is seen here without his distinctive voice.]]></summary></entry><entry><title type="html">The Awful Orphan</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/the-awful-orphan" rel="alternate" type="text/html" title="The Awful Orphan" /><published>2026-05-09T15:30:00+01:00</published><updated>2026-05-09T15:30:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/the-awful-orphan</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/the-awful-orphan"><![CDATA[<p>In which Porky has trouble with a dog that wants to live with him. Eventually, after throwing himself out of the window onto a pile of mattresses, and getting Porky in trouble with his upstairs neighbour, the dog decides to leave, leading to a role reversal.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Porky has trouble with a dog that wants to live with him. Eventually, after throwing himself out of the window onto a pile of mattresses, and getting Porky in trouble with his upstairs neighbour, the dog decides to leave, leading to a role reversal.]]></summary></entry><entry><title type="html">Hair-Raising Hare</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/hair-raising-hare" rel="alternate" type="text/html" title="Hair-Raising Hare" /><published>2026-05-09T15:27:00+01:00</published><updated>2026-05-09T15:27:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/hair-raising-hare</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/hair-raising-hare"><![CDATA[<p>In which Bugs is lured to the castle of an evil scientist with a mechanical rabbit as food for Gossamer. Breaks the fourth wall on two separate occasions.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs is lured to the castle of an evil scientist with a mechanical rabbit as food for Gossamer. Breaks the fourth wall on two separate occasions.]]></summary></entry><entry><title type="html">Fast and Furry-ous</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/fast-and-furry-ous" rel="alternate" type="text/html" title="Fast and Furry-ous" /><published>2026-05-09T15:25:00+01:00</published><updated>2026-05-09T15:25:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/fast-and-furry-ous</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/fast-and-furry-ous"><![CDATA[<p>The first Roadrunner cartoon. Includes the iconic tunnel gag. It really is just and endless series of jokes.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[The first Roadrunner cartoon. Includes the iconic tunnel gag. It really is just and endless series of jokes.]]></summary></entry><entry><title type="html">Bugs Bunny and the Three Bears</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/bugs-bunny-three-bears" rel="alternate" type="text/html" title="Bugs Bunny and the Three Bears" /><published>2026-05-09T15:22:00+01:00</published><updated>2026-05-09T15:22:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/bugs-bunny-three-bears</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/bugs-bunny-three-bears"><![CDATA[<p>In which Bugs takes the role of Goldilocks in the story of the 3 bears. Hilarity ensues.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs takes the role of Goldilocks in the story of the 3 bears. Hilarity ensues.]]></summary></entry><entry><title type="html">Elmer’s Candid Camera</title><link href="https://scown.space/warner-bros-cartoons/2026/05/09/elmers-candid-camera" rel="alternate" type="text/html" title="Elmer’s Candid Camera" /><published>2026-05-09T15:18:00+01:00</published><updated>2026-05-09T15:18:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/05/09/elmers-candid-camera</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/05/09/elmers-candid-camera"><![CDATA[<p>In which Proto-Elmer wants to shoot proto-Bugs (complete with terrible voice and Woody Woodpecker laugh) with a camera. A curiosity, though not an especially funny one.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Proto-Elmer wants to shoot proto-Bugs (complete with terrible voice and Woody Woodpecker laugh) with a camera. A curiosity, though not an especially funny one.]]></summary></entry><entry><title type="html">Maccheroni al Gratin con Salsa Aurore</title><link href="https://scown.space/pasta-codex/2026/05/09/sauce-aurore" rel="alternate" type="text/html" title="Maccheroni al Gratin con Salsa Aurore" /><published>2026-05-09T15:07:00+01:00</published><updated>2026-05-09T15:07:00+01:00</updated><id>https://scown.space/pasta-codex/2026/05/09/sauce-aurore</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/05/09/sauce-aurore"><![CDATA[<p>Baked pasta with a tomato béchemel sauce.</p>

<p>Reasonably tasty (the tomato stops the béchemel from being bland).</p>

<p>The recipe calls for tomato purée; I used what the book would usually call tomato paste, because the quantity involved is so small.</p>

<p>Again, I struggled to brown this at a moderate heat (although in this case I didn’t even manage to melt the cheese). Either using a fan oven is the issue or the temperature needs to be higher.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Baked pasta with a tomato béchemel sauce.]]></summary></entry><entry><title type="html">Duck Dodgers in the 24½ Century</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/duck-dodgers" rel="alternate" type="text/html" title="Duck Dodgers in the 24½ Century" /><published>2026-04-25T17:06:00+01:00</published><updated>2026-04-25T17:06:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/duck-dodgers</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/duck-dodgers"><![CDATA[<p>In which Duck Dodgers (Daffy) goes to war with Marvin the Martian over Planet X.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Duck Dodgers (Daffy) goes to war with Marvin the Martian over Planet X.]]></summary></entry><entry><title type="html">Rabbit Fire</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/rabbit-fire" rel="alternate" type="text/html" title="Rabbit Fire" /><published>2026-04-25T17:04:00+01:00</published><updated>2026-04-25T17:04:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/rabbit-fire</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/rabbit-fire"><![CDATA[<p>In which Bugs and Daffy vie to get the other shot by Elmer Fudd. A classic, and better than <cite>Rabbit Seasoning</cite>.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs and Daffy vie to get the other shot by Elmer Fudd. A classic, and better than Rabbit Seasoning.]]></summary></entry><entry><title type="html">Golden Yeggs</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/golden-yeggs" rel="alternate" type="text/html" title="Golden Yeggs" /><published>2026-04-25T17:02:00+01:00</published><updated>2026-04-25T17:02:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/golden-yeggs</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/golden-yeggs"><![CDATA[<p>In which the goose that laid the golden egg tricks Porky into giving Daffy to the mob, as they believe him to be the aforementioned.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which the goose that laid the golden egg tricks Porky into giving Daffy to the mob, as they believe him to be the aforementioned.]]></summary></entry><entry><title type="html">Boobs in the Woods</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/boobs-in-the-woods" rel="alternate" type="text/html" title="Boobs in the Woods" /><published>2026-04-25T16:59:00+01:00</published><updated>2026-04-25T16:59:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/boobs-in-the-woods</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/boobs-in-the-woods"><![CDATA[<p>In which Daffy harasses Porky, who is on his holiday. Features some excellent jokes about permits, and opens with Daffy adding words to the Looney Tunes theme.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Daffy harasses Porky, who is on his holiday. Features some excellent jokes about permits, and opens with Daffy adding words to the Looney Tunes theme.]]></summary></entry><entry><title type="html">Deduce, You Say</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/deduce-you-say" rel="alternate" type="text/html" title="Deduce, You Say" /><published>2026-04-25T16:57:00+01:00</published><updated>2026-04-25T16:57:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/deduce-you-say</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/deduce-you-say"><![CDATA[<p>In which Daffy plays Dorlock Holmes and Porky Dr. Watson in the case of the Shropshire Slasher. Dorlock is a bumbling idiot more interested in ‘deducting’ from his tax bill.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Daffy plays Dorlock Holmes and Porky Dr. Watson in the case of the Shropshire Slasher. Dorlock is a bumbling idiot more interested in ‘deducting’ from his tax bill.]]></summary></entry><entry><title type="html">Wearing of the Grin</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/wearing-of-the-grin" rel="alternate" type="text/html" title="Wearing of the Grin" /><published>2026-04-25T16:54:00+01:00</published><updated>2026-04-25T16:54:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/wearing-of-the-grin</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/wearing-of-the-grin"><![CDATA[<p>In which Porky stays in a castle run by leprechauns. May be a dream.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Porky stays in a castle run by leprechauns. May be a dream.]]></summary></entry><entry><title type="html">Porky Chops</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/porky-chops" rel="alternate" type="text/html" title="Porky Chops" /><published>2026-04-25T16:53:00+01:00</published><updated>2026-04-25T16:53:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/porky-chops</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/porky-chops"><![CDATA[<p>In which a Bugs Bunny esque res squirrel duels with Porky the lumberjack, who is trying to cut down his home. Directed by Arthur Davis, which makes it unusual.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which a Bugs Bunny esque res squirrel duels with Porky the lumberjack, who is trying to cut down his home. Directed by Arthur Davis, which makes it unusual.]]></summary></entry><entry><title type="html">Yankee Doodle Daffy</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/yankee-doodle-daffy" rel="alternate" type="text/html" title="Yankee Doodle Daffy" /><published>2026-04-25T16:50:00+01:00</published><updated>2026-04-25T16:50:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/yankee-doodle-daffy</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/yankee-doodle-daffy"><![CDATA[<p>In which Daffy tries to sell the services of another duck to Porky, but Porky is having none of it.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Daffy tries to sell the services of another duck to Porky, but Porky is having none of it.]]></summary></entry><entry><title type="html">The Scarlet Pumpernickel</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/the-scarlet-pumpernickel" rel="alternate" type="text/html" title="The Scarlet Pumpernickel" /><published>2026-04-25T16:47:00+01:00</published><updated>2026-04-25T16:47:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/the-scarlet-pumpernickel</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/the-scarlet-pumpernickel"><![CDATA[<p>In which Daffy must sell a film script based on the Scarlet Pimpernel to Jack Warner. Another old favourite, with the plot becoming ever more ludicrous.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Daffy must sell a film script based on the Scarlet Pimpernel to Jack Warner. Another old favourite, with the plot becoming ever more ludicrous.]]></summary></entry><entry><title type="html">The Ducksters</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/the-ducksters" rel="alternate" type="text/html" title="The Ducksters" /><published>2026-04-25T16:42:00+01:00</published><updated>2026-04-25T16:42:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/the-ducksters</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/the-ducksters"><![CDATA[<p>In which Daffy Duck is the host of a gameshow and Porky Pig is his contestant. It involves answering questions and being subjected to cartoon violence. It shows its age in two ways: it is a radio show, and at one point Porky is asked to name the <em>48</em> states.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Daffy Duck is the host of a gameshow and Porky Pig is his contestant. It involves answering questions and being subjected to cartoon violence. It shows its age in two ways: it is a radio show, and at one point Porky is asked to name the 48 states.]]></summary></entry><entry><title type="html">Scaredy Cat</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/scaredy-cat" rel="alternate" type="text/html" title="Scaredy Cat" /><published>2026-04-25T16:38:00+01:00</published><updated>2026-04-25T16:38:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/scaredy-cat</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/scaredy-cat"><![CDATA[<p>In which Sylvester and Porky move into a ‘haunted’ house. After being blamed, Sylvester must save Porky. Plot heavy.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Sylvester and Porky move into a ‘haunted’ house. After being blamed, Sylvester must save Porky. Plot heavy.]]></summary></entry><entry><title type="html">Drip-Along Daffy</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/drip-along-daffy" rel="alternate" type="text/html" title="Drip-Along Daffy" /><published>2026-04-25T16:36:00+01:00</published><updated>2026-04-25T16:36:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/drip-along-daffy</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/drip-along-daffy"><![CDATA[<p>In which Daffy attempts to clean up a one horse lawless western town, both figuratively and literally. He has a horse named Tin Foil.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Daffy attempts to clean up a one horse lawless western town, both figuratively and literally. He has a horse named Tin Foil.]]></summary></entry><entry><title type="html">Dough for the Do-Do</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/dough-for-the-dodo" rel="alternate" type="text/html" title="Dough for the Do-Do" /><published>2026-04-25T16:33:00+01:00</published><updated>2026-04-25T16:33:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/dough-for-the-dodo</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/dough-for-the-dodo"><![CDATA[<p>In which Porky Pig hunts the last Do-do in a bizarre surrealist landscape where nothing makes sense. Very different to everything I have seen thus far.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Porky Pig hunts the last Do-do in a bizarre surrealist landscape where nothing makes sense. Very different to everything I have seen thus far.]]></summary></entry><entry><title type="html">Duck Amuck</title><link href="https://scown.space/warner-bros-cartoons/2026/04/25/duck-amuck" rel="alternate" type="text/html" title="Duck Amuck" /><published>2026-04-25T16:29:00+01:00</published><updated>2026-04-25T16:29:00+01:00</updated><id>https://scown.space/warner-bros-cartoons/2026/04/25/duck-amuck</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/04/25/duck-amuck"><![CDATA[<p>In which Daffy Duck finds himself at the mercy of his animator. A classic.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Daffy Duck finds himself at the mercy of his animator. A classic.]]></summary></entry><entry><title type="html">Vermicelli Aglio, Olio, e Besciamella</title><link href="https://scown.space/pasta-codex/2026/04/25/garlic-bechemel" rel="alternate" type="text/html" title="Vermicelli Aglio, Olio, e Besciamella" /><published>2026-04-25T16:07:00+01:00</published><updated>2026-04-25T16:07:00+01:00</updated><id>https://scown.space/pasta-codex/2026/04/25/garlic-bechemel</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/04/25/garlic-bechemel"><![CDATA[<p>Pasta with béchamel sauce and what’s essentially an aioli.</p>

<p>Be sure to start the garlic first, otherwise it’s difficult to keep the sauce consistency correct while waiting for the garlic to soften. If the garlic is insufficiently softened then it won’t blend well.</p>

<p>Made here with spaghetti.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with béchamel sauce and what’s essentially an aioli.]]></summary></entry><entry><title type="html">Blooper Bunny</title><link href="https://scown.space/warner-bros-cartoons/2026/03/28/blooper-bunny" rel="alternate" type="text/html" title="Blooper Bunny" /><published>2026-03-28T17:19:00+00:00</published><updated>2026-03-28T17:19:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/28/blooper-bunny</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/28/blooper-bunny"><![CDATA[<p>A gag reel featuring “outtakes”. Made after the death of Mel Blanc so the voices are a little off. Some inside jokes are amusing.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[A gag reel featuring “outtakes”. Made after the death of Mel Blanc so the voices are a little off. Some inside jokes are amusing.]]></summary></entry><entry><title type="html">The Rabbit of Seville</title><link href="https://scown.space/warner-bros-cartoons/2026/03/28/the-rabbit-of-seville" rel="alternate" type="text/html" title="The Rabbit of Seville" /><published>2026-03-28T16:35:00+00:00</published><updated>2026-03-28T16:35:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/28/the-rabbit-of-seville</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/28/the-rabbit-of-seville"><![CDATA[<p>Brilliant. The Overture of The Barber of Seville, in cartoon form. The timing and the soundtrack are excellent.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[Brilliant. The Overture of The Barber of Seville, in cartoon form. The timing and the soundtrack are excellent.]]></summary></entry><entry><title type="html">Ballot Box Bunny</title><link href="https://scown.space/warner-bros-cartoons/2026/03/28/ballot-box-bunny" rel="alternate" type="text/html" title="Ballot Box Bunny" /><published>2026-03-28T16:33:00+00:00</published><updated>2026-03-28T16:33:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/28/ballot-box-bunny</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/28/ballot-box-bunny"><![CDATA[<p>In which Bugs must prevent Sam from winning an election, which he does with a large quantity of TNT.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs must prevent Sam from winning an election, which he does with a large quantity of TNT.]]></summary></entry><entry><title type="html">Wabbit Trouble</title><link href="https://scown.space/warner-bros-cartoons/2026/03/28/wabbit-trouble" rel="alternate" type="text/html" title="Wabbit Trouble" /><published>2026-03-28T16:31:00+00:00</published><updated>2026-03-28T16:31:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/28/wabbit-trouble</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/28/wabbit-trouble"><![CDATA[<p>In which an older (or should that be younger) Bugs torments the fat Elmer Fudd on his camping trip. Some unusual background design and an excellent sequence set to the William Tell Overture.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which an older (or should that be younger) Bugs torments the fat Elmer Fudd on his camping trip. Some unusual background design and an excellent sequence set to the William Tell Overture.]]></summary></entry><entry><title type="html">Big Top Bunny</title><link href="https://scown.space/warner-bros-cartoons/2026/03/28/my-bunny-lies-over-the-sea" rel="alternate" type="text/html" title="Big Top Bunny" /><published>2026-03-28T16:28:00+00:00</published><updated>2026-03-28T16:28:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/28/my-bunny-lies-over-the-sea</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/28/my-bunny-lies-over-the-sea"><![CDATA[<p>In which Bugs must play golf with an angry Scotsman. Possibly very different to an American.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs must play golf with an angry Scotsman. Possibly very different to an American.]]></summary></entry><entry><title type="html">Big Top Bunny</title><link href="https://scown.space/warner-bros-cartoons/2026/03/28/big-top-bunny" rel="alternate" type="text/html" title="Big Top Bunny" /><published>2026-03-28T16:26:00+00:00</published><updated>2026-03-28T16:26:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/28/big-top-bunny</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/28/big-top-bunny"><![CDATA[<p>In which Bugs must outwit a Russian bear in a circus act. The bear brings it on himself.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs must outwit a Russian bear in a circus act. The bear brings it on himself.]]></summary></entry><entry><title type="html">Big House Bunny</title><link href="https://scown.space/warner-bros-cartoons/2026/03/28/big-house-bunny" rel="alternate" type="text/html" title="Big House Bunny" /><published>2026-03-28T16:20:00+00:00</published><updated>2026-03-28T16:20:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/28/big-house-bunny</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/28/big-house-bunny"><![CDATA[<p>In which Bugs ends up in a prison with Yosemite Sam. Features an ‘Ajax Escape Kit’, but the significance of the name isn’t clear.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs ends up in a prison with Yosemite Sam. Features an ‘Ajax Escape Kit’, but the significance of the name isn’t clear.]]></summary></entry><entry><title type="html">Water, Water Every Hare</title><link href="https://scown.space/warner-bros-cartoons/2026/03/28/water-water-every-hare" rel="alternate" type="text/html" title="Water, Water Every Hare" /><published>2026-03-28T16:17:00+00:00</published><updated>2026-03-28T16:17:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/28/water-water-every-hare</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/28/water-water-every-hare"><![CDATA[<p>In which Bugs must escape from the castle of an evil scientist (Boo). Features an appearance by Gossamer, but is mostly plot driven.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs must escape from the castle of an evil scientist (Boo). Features an appearance by Gossamer, but is mostly plot driven.]]></summary></entry><entry><title type="html">Rabbit’s Kin</title><link href="https://scown.space/warner-bros-cartoons/2026/03/28/rabbit's-kin" rel="alternate" type="text/html" title="Rabbit’s Kin" /><published>2026-03-28T16:14:00+00:00</published><updated>2026-03-28T16:14:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/28/rabbit's-kin</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/28/rabbit's-kin"><![CDATA[<p>In which Bugs saves a small rabbit from an impressively stupid Puma. At one point he has the Puma hitting himself on the head with a mallet.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs saves a small rabbit from an impressively stupid Puma. At one point he has the Puma hitting himself on the head with a mallet.]]></summary></entry><entry><title type="html">What’s Up Doc</title><link href="https://scown.space/warner-bros-cartoons/2026/03/28/what's-up-doc" rel="alternate" type="text/html" title="What’s Up Doc" /><published>2026-03-28T16:11:00+00:00</published><updated>2026-03-28T16:11:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/28/what's-up-doc</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/28/what's-up-doc"><![CDATA[<p>In which Bugs has a showbiz career in a Vaudeville act with Elmer Fudd. Contains some caricatures which I am far too young to understand, but some of the jokes still work.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs has a showbiz career in a Vaudeville act with Elmer Fudd. Contains some caricatures which I am far too young to understand, but some of the jokes still work.]]></summary></entry><entry><title type="html">Maccheroni al Gratin con Salsa Besciamella</title><link href="https://scown.space/pasta-codex/2026/03/28/b%C3%A9chamel" rel="alternate" type="text/html" title="Maccheroni al Gratin con Salsa Besciamella" /><published>2026-03-28T15:58:00+00:00</published><updated>2026-03-28T15:58:00+00:00</updated><id>https://scown.space/pasta-codex/2026/03/28/b%C3%A9chamel</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/03/28/b%C3%A9chamel"><![CDATA[<p>Baked pasta with béchamel sauce.</p>

<p>I only allowed minimal browning as I ran out of patience – it takes ages.</p>

<p>Doesn’t reheat well but it pretty good when fresh.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Baked pasta with béchamel sauce.]]></summary></entry><entry><title type="html">Tagliolini al Burro Crema e Parmigiano, Gratinati</title><link href="https://scown.space/pasta-codex/2026/03/28/tagliolini-butter-cream" rel="alternate" type="text/html" title="Tagliolini al Burro Crema e Parmigiano, Gratinati" /><published>2026-03-28T15:48:00+00:00</published><updated>2026-03-28T15:48:00+00:00</updated><id>https://scown.space/pasta-codex/2026/03/28/tagliolini-butter-cream</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/03/28/tagliolini-butter-cream"><![CDATA[<p>Long pasta tossed with butter and cheese, then topped with cream and baked.</p>

<p>Quite nice.</p>

<p>A smaller baking dish would have been sufficient.</p>

<p>Made here with spaghetti.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Long pasta tossed with butter and cheese, then topped with cream and baked.]]></summary></entry><entry><title type="html">Bully for Bugs</title><link href="https://scown.space/warner-bros-cartoons/2026/03/14/bully-for-bugs" rel="alternate" type="text/html" title="Bully for Bugs" /><published>2026-03-14T16:29:00+00:00</published><updated>2026-03-14T16:29:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/14/bully-for-bugs</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/14/bully-for-bugs"><![CDATA[<p>In which Bugs becomes a bullfighter. The score is excellent, as is the final over the top gag.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs becomes a bullfighter. The score is excellent, as is the final over the top gag.]]></summary></entry><entry><title type="html">High Diving Hare</title><link href="https://scown.space/warner-bros-cartoons/2026/03/14/high-diving-hare" rel="alternate" type="text/html" title="High Diving Hare" /><published>2026-03-14T16:22:00+00:00</published><updated>2026-03-14T16:22:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/14/high-diving-hare</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/14/high-diving-hare"><![CDATA[<p>In which Bugs manages to make Yosemite Sam fall off a diving board innumerable times. Brilliant.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs manages to make Yosemite Sam fall off a diving board innumerable times. Brilliant.]]></summary></entry><entry><title type="html">Long-Haired Hare</title><link href="https://scown.space/warner-bros-cartoons/2026/03/14/long-haired-hare" rel="alternate" type="text/html" title="Long-Haired Hare" /><published>2026-03-14T16:18:00+00:00</published><updated>2026-03-14T16:18:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/14/long-haired-hare</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/14/long-haired-hare"><![CDATA[<p>In which Bugs Bunny wages war on an opera singer, culminating in the destruction of the opera house.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs Bunny wages war on an opera singer, culminating in the destruction of the opera house.]]></summary></entry><entry><title type="html">Rabbit Seasoning</title><link href="https://scown.space/warner-bros-cartoons/2026/03/14/rabbit-seasoning" rel="alternate" type="text/html" title="Rabbit Seasoning" /><published>2026-03-14T16:12:00+00:00</published><updated>2026-03-14T16:12:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/14/rabbit-seasoning</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/14/rabbit-seasoning"><![CDATA[<p>An old favourite. The deadpan delivery near the start is excellent. Daffy Duck brings it on himself.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[An old favourite. The deadpan delivery near the start is excellent. Daffy Duck brings it on himself.]]></summary></entry><entry><title type="html">Baseball Bugs</title><link href="https://scown.space/warner-bros-cartoons/2026/03/14/baseball-bugs" rel="alternate" type="text/html" title="Baseball Bugs" /><published>2026-03-14T14:40:00+00:00</published><updated>2026-03-14T14:40:00+00:00</updated><id>https://scown.space/warner-bros-cartoons/2026/03/14/baseball-bugs</id><content type="html" xml:base="https://scown.space/warner-bros-cartoons/2026/03/14/baseball-bugs"><![CDATA[<p>In which Bugs Bunny single-handedly defeats a baseball team, the Gorillas. Some good visual gags, and an early version of Bugs switching a conversation.</p>]]></content><author><name>Alex Scown</name></author><category term="warner-bros-cartoons" /><summary type="html"><![CDATA[In which Bugs Bunny single-handedly defeats a baseball team, the Gorillas. Some good visual gags, and an early version of Bugs switching a conversation.]]></summary></entry><entry><title type="html">Pasta alla Panna Acida</title><link href="https://scown.space/pasta-codex/2026/02/28/spaghetti-sour-cream" rel="alternate" type="text/html" title="Pasta alla Panna Acida" /><published>2026-02-28T17:45:00+00:00</published><updated>2026-02-28T17:45:00+00:00</updated><id>https://scown.space/pasta-codex/2026/02/28/spaghetti-sour-cream</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/02/28/spaghetti-sour-cream"><![CDATA[<p>Pasta with sour cream, paprika and cheese.</p>

<p>The sour cream gives it a bit more of an edge.</p>

<p>Again, probably needed more paprika.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with sour cream, paprika and cheese.]]></summary></entry><entry><title type="html">Pasta con Salsa alla Crema di Latte – II Ricetta</title><link href="https://scown.space/pasta-codex/2026/02/21/pasta-cream-ii" rel="alternate" type="text/html" title="Pasta con Salsa alla Crema di Latte – II Ricetta" /><published>2026-02-21T15:41:00+00:00</published><updated>2026-02-21T15:41:00+00:00</updated><id>https://scown.space/pasta-codex/2026/02/21/pasta-cream-ii</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/02/21/pasta-cream-ii"><![CDATA[<p>Pasta in a thick and creamy cheese sauce.</p>

<p>The sauce could probably have done with less flour (there is no quantity specified).</p>

<p>Possibly needed more paprika as well, it got lost.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta in a thick and creamy cheese sauce.]]></summary></entry><entry><title type="html">Pasta con Salsa alla Crema di Latte – I Ricetta</title><link href="https://scown.space/pasta-codex/2026/02/21/pasta-cream-i" rel="alternate" type="text/html" title="Pasta con Salsa alla Crema di Latte – I Ricetta" /><published>2026-02-21T15:30:00+00:00</published><updated>2026-02-21T15:30:00+00:00</updated><id>https://scown.space/pasta-codex/2026/02/21/pasta-cream-i</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/02/21/pasta-cream-i"><![CDATA[<p>Pasta in a creamy onion sauce, topped with grated cheese.</p>

<p>Again, whisking the single portion is a bit fiddly.</p>

<p>Works well enough.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta in a creamy onion sauce, topped with grated cheese.]]></summary></entry><entry><title type="html">Capellini al Burro, Crema e Parmigiano</title><link href="https://scown.space/pasta-codex/2026/02/21/capellini-butter-cream" rel="alternate" type="text/html" title="Capellini al Burro, Crema e Parmigiano" /><published>2026-02-21T15:27:00+00:00</published><updated>2026-02-21T15:27:00+00:00</updated><id>https://scown.space/pasta-codex/2026/02/21/capellini-butter-cream</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/02/21/capellini-butter-cream"><![CDATA[<p>Pasta with butter, cheese and cream. More of the same really.</p>

<p>Managed not to photograph this one.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with butter, cheese and cream. More of the same really.]]></summary></entry><entry><title type="html">Gnocchetti della Val Camonica</title><link href="https://scown.space/pasta-codex/2026/01/31/dumplings-butter-parmigiano" rel="alternate" type="text/html" title="Gnocchetti della Val Camonica" /><published>2026-01-31T16:26:00+00:00</published><updated>2026-01-31T16:26:00+00:00</updated><id>https://scown.space/pasta-codex/2026/01/31/dumplings-butter-parmigiano</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/01/31/dumplings-butter-parmigiano"><![CDATA[<p>Flour and water dumplings, topped with a butter and cheese sauce.</p>

<p>Tasty enough, but the sauce is difficult to whisk when scaled down to a single portion.</p>

<p>In contrast to 122, this probably needed more cheese.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Flour and water dumplings, topped with a butter and cheese sauce.]]></summary></entry><entry><title type="html">Pasta al Burro Fuso</title><link href="https://scown.space/pasta-codex/2026/01/31/spaghetti-melted-butter" rel="alternate" type="text/html" title="Pasta al Burro Fuso" /><published>2026-01-31T16:22:00+00:00</published><updated>2026-01-31T16:22:00+00:00</updated><id>https://scown.space/pasta-codex/2026/01/31/spaghetti-melted-butter</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/01/31/spaghetti-melted-butter"><![CDATA[<p>Pasta with a mixture of melted butter and cheese, with a different preparation.</p>

<p>In this case the pasta is tossed in the butter and the cheese is served separately.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with a mixture of melted butter and cheese, with a different preparation.]]></summary></entry><entry><title type="html">Pasta al Burro Caldo e Parmigiano</title><link href="https://scown.space/pasta-codex/2026/01/31/melted-butter-parmigiano" rel="alternate" type="text/html" title="Pasta al Burro Caldo e Parmigiano" /><published>2026-01-31T16:16:00+00:00</published><updated>2026-01-31T16:16:00+00:00</updated><id>https://scown.space/pasta-codex/2026/01/31/melted-butter-parmigiano</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/01/31/melted-butter-parmigiano"><![CDATA[<p>Pasta with a mixture of melted butter and cheese.</p>

<p>The advice to melt the butter by placing it next to the heat probably works fine with a gas hob, but is terrible with a ceramic one.</p>

<p>Seems to have too much cheese (or my conversion into grams is bad).</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with a mixture of melted butter and cheese.]]></summary></entry><entry><title type="html">Pasta al Burro e Parmigiano (all’Inglese)</title><link href="https://scown.space/pasta-codex/2026/01/10/butter-parmigiano" rel="alternate" type="text/html" title="Pasta al Burro e Parmigiano (all’Inglese)" /><published>2026-01-10T15:36:00+00:00</published><updated>2026-01-10T15:36:00+00:00</updated><id>https://scown.space/pasta-codex/2026/01/10/butter-parmigiano</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/01/10/butter-parmigiano"><![CDATA[<p>Short pasta tossed with butter and Parmigiano Reggiano.</p>

<p>Works well.</p>

<p>Pictured here with some shells I needed to use up.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Short pasta tossed with butter and Parmigiano Reggiano.]]></summary></entry><entry><title type="html">Capellini alla Crema di Latte</title><link href="https://scown.space/pasta-codex/2026/01/10/capellini-cream" rel="alternate" type="text/html" title="Capellini alla Crema di Latte" /><published>2026-01-10T15:32:00+00:00</published><updated>2026-01-10T15:32:00+00:00</updated><id>https://scown.space/pasta-codex/2026/01/10/capellini-cream</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/01/10/capellini-cream"><![CDATA[<p>At last, we’ve made it to Vegetables and Dairy.</p>

<p>A simple dish of pasta mixed with cream and cheese. Quite tasty.</p>

<p>Pictured here with spaghetti.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[At last, we’ve made it to Vegetables and Dairy.]]></summary></entry><entry><title type="html">Conchiglie con l’Ananas</title><link href="https://scown.space/pasta-codex/2026/01/10/shells-pineapple" rel="alternate" type="text/html" title="Conchiglie con l’Ananas" /><published>2026-01-10T15:27:00+00:00</published><updated>2026-01-10T15:27:00+00:00</updated><id>https://scown.space/pasta-codex/2026/01/10/shells-pineapple</id><content type="html" xml:base="https://scown.space/pasta-codex/2026/01/10/shells-pineapple"><![CDATA[<p>Pasta with pineapple chunks, and a small amount of rum.</p>

<p>It’s fine, and probably better if you like pineapple more than I do.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with pineapple chunks, and a small amount of rum.]]></summary></entry><entry><title type="html">Pastina con le Prugne</title><link href="https://scown.space/pasta-codex/2025/12/07/pasta-prunes" rel="alternate" type="text/html" title="Pastina con le Prugne" /><published>2025-12-07T17:28:00+00:00</published><updated>2025-12-07T17:28:00+00:00</updated><id>https://scown.space/pasta-codex/2025/12/07/pasta-prunes</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/12/07/pasta-prunes"><![CDATA[<p>Pasta with chopped prunes.</p>

<p>The prunes were chopped mechanically, and possibly slightly over chopped.</p>

<p>Benefits from a generous sprinkling of sugar.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with chopped prunes.]]></summary></entry><entry><title type="html">Spaghettini con l’Uvetta</title><link href="https://scown.space/pasta-codex/2025/12/07/spaghettini-raisins" rel="alternate" type="text/html" title="Spaghettini con l’Uvetta" /><published>2025-12-07T17:20:00+00:00</published><updated>2025-12-07T17:20:00+00:00</updated><id>https://scown.space/pasta-codex/2025/12/07/spaghettini-raisins</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/12/07/spaghettini-raisins"><![CDATA[<p>Pasta tossed with raisins and pine nuts before being shoved under the grill. It probably would have taken another few minutes but I ran out of time.</p>

<p>The grill helps the raisins, but I’m not sure it improves the pasta.</p>

<p>Made here with Tagliatelle.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta tossed with raisins and pine nuts before being shoved under the grill. It probably would have taken another few minutes but I ran out of time.]]></summary></entry><entry><title type="html">Maccheroni con Salsa di Mandorle (Ricetta del Trecento)</title><link href="https://scown.space/pasta-codex/2025/12/07/almonds" rel="alternate" type="text/html" title="Maccheroni con Salsa di Mandorle (Ricetta del Trecento)" /><published>2025-12-07T17:15:00+00:00</published><updated>2025-12-07T17:15:00+00:00</updated><id>https://scown.space/pasta-codex/2025/12/07/almonds</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/12/07/almonds"><![CDATA[<p>Pasta with walnut, jam and bread sauce, with spices.</p>

<p>I used a blackcurrant conserve because I didn’t fancy buying an entire jar of cherry/apple jam just for this one recipe.</p>

<p>The quantity of jam required was unclear, so I don’t know if this is the correct consistency.</p>

<p>Shown here unstrained, as it was clear straining it would be a fool’s errand with the sieve I had.</p>

<p>Flavours aren’t bad.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with walnut, jam and bread sauce, with spices.]]></summary></entry><entry><title type="html">Taglitelle con Salsa di Noci e Canditi</title><link href="https://scown.space/pasta-codex/2025/12/07/walnuts-candied-fruit" rel="alternate" type="text/html" title="Taglitelle con Salsa di Noci e Canditi" /><published>2025-12-07T17:10:00+00:00</published><updated>2025-12-07T17:10:00+00:00</updated><id>https://scown.space/pasta-codex/2025/12/07/walnuts-candied-fruit</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/12/07/walnuts-candied-fruit"><![CDATA[<p>Walnuts with candied peel, sugar, raisins and nutmeg.</p>

<p>Tastes like Christmas, but again, far too sweet.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Walnuts with candied peel, sugar, raisins and nutmeg.]]></summary></entry><entry><title type="html">Bucatini o Tagliatelle con Salsa di Noci alla Veneta</title><link href="https://scown.space/pasta-codex/2025/11/08/tagliatelle-walnuts-sugar" rel="alternate" type="text/html" title="Bucatini o Tagliatelle con Salsa di Noci alla Veneta" /><published>2025-11-08T17:13:00+00:00</published><updated>2025-11-08T17:13:00+00:00</updated><id>https://scown.space/pasta-codex/2025/11/08/tagliatelle-walnuts-sugar</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/11/08/tagliatelle-walnuts-sugar"><![CDATA[<p>A weird one. A mixture of breadcrumbs, pounded walnuts and sugar.</p>

<p>Smells like popcorn when cooking, but easy to overdo (crushing the walnuts finer may help it mix better).</p>

<p>Far too sweet for me, with 1 ounce of sugar per portion.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[A weird one. A mixture of breadcrumbs, pounded walnuts and sugar.]]></summary></entry><entry><title type="html">Gnocchi o Conchiglie con Melazane e Noci</title><link href="https://scown.space/pasta-codex/2025/11/08/conchiglie-eggplant-walnuts" rel="alternate" type="text/html" title="Gnocchi o Conchiglie con Melazane e Noci" /><published>2025-11-08T17:07:00+00:00</published><updated>2025-11-08T17:07:00+00:00</updated><id>https://scown.space/pasta-codex/2025/11/08/conchiglie-eggplant-walnuts</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/11/08/conchiglie-eggplant-walnuts"><![CDATA[<p>Conchiglie pasta bake with a walnut and diced aubergine tomato sauce.</p>

<p>There didn’t seem to be much sauce with this – some of that might be due to using
the same pan for frying the aubergines and making the sauce, with the tomato drying
out when it hit the pan.</p>

<p>There’s also slightly too much pasta, which didn’t help.</p>

<p>Despite all that, quite tasty.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Conchiglie pasta bake with a walnut and diced aubergine tomato sauce.]]></summary></entry><entry><title type="html">Bucatini con Salsa di Noci – II Ricetta</title><link href="https://scown.space/pasta-codex/2025/10/18/bucatini-walnuts-ii" rel="alternate" type="text/html" title="Bucatini con Salsa di Noci – II Ricetta" /><published>2025-10-18T16:13:00+01:00</published><updated>2025-10-18T16:13:00+01:00</updated><id>https://scown.space/pasta-codex/2025/10/18/bucatini-walnuts-ii</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/10/18/bucatini-walnuts-ii"><![CDATA[<p>This is an odd one. Bucatini with a walnut, bread and olive oil sauce.</p>

<p>The proportions here may be way off base – the recipe calls for a 2-3 inch piece of bread interior and it’s not entirely clear what that means. This is compounded by scaling the recipe down into a single portion.</p>

<p>I suspect there should be more bread and more olive oil, but the walnuts get lost in here as it is.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[This is an odd one. Bucatini with a walnut, bread and olive oil sauce.]]></summary></entry><entry><title type="html">Bucatini con Salsa di Noci – I Ricetta</title><link href="https://scown.space/pasta-codex/2025/10/18/bucatini-walnuts-i" rel="alternate" type="text/html" title="Bucatini con Salsa di Noci – I Ricetta" /><published>2025-10-18T16:09:00+01:00</published><updated>2025-10-18T16:09:00+01:00</updated><id>https://scown.space/pasta-codex/2025/10/18/bucatini-walnuts-i</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/10/18/bucatini-walnuts-i"><![CDATA[<p>Bucatini with fried walnuts.</p>

<p>The walnuts pictured here are slightly burnt (they cooked more quickly than expected).</p>

<p>Simple but reasonably effective.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Bucatini with fried walnuts.]]></summary></entry><entry><title type="html">Maccheroncini con Salsa Falstaff</title><link href="https://scown.space/pasta-codex/2025/10/18/falstaff-sauce" rel="alternate" type="text/html" title="Maccheroncini con Salsa Falstaff" /><published>2025-10-18T16:01:00+01:00</published><updated>2025-10-18T16:01:00+01:00</updated><id>https://scown.space/pasta-codex/2025/10/18/falstaff-sauce</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/10/18/falstaff-sauce"><![CDATA[<p>Another difficult one. Fresh horseradish is difficult to buy at the best of times, and then there’s the oil preserved mushrooms <strong>and</strong> the pickled mushrooms as well.</p>

<p>A shame, I would have liked to try this.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Another difficult one. Fresh horseradish is difficult to buy at the best of times, and then there’s the oil preserved mushrooms and the pickled mushrooms as well.]]></summary></entry><entry><title type="html">Bucatini alla Boscaiola</title><link href="https://scown.space/pasta-codex/2025/09/28/bucatini-mushrooms-eggplant" rel="alternate" type="text/html" title="Bucatini alla Boscaiola" /><published>2025-09-28T16:10:00+01:00</published><updated>2025-09-28T16:10:00+01:00</updated><id>https://scown.space/pasta-codex/2025/09/28/bucatini-mushrooms-eggplant</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/09/28/bucatini-mushrooms-eggplant"><![CDATA[<p>Bucatini with mushrooms, aubergine, and tomatoes.</p>

<p>This actually works quite well, and the small amount of tomato sauce really lifts it.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Bucatini with mushrooms, aubergine, and tomatoes.]]></summary></entry><entry><title type="html">Insalata di Conchiglie con Funghi sott’Olio, alla Francese</title><link href="https://scown.space/pasta-codex/2025/09/28/oil-preserved-mushrooms" rel="alternate" type="text/html" title="Insalata di Conchiglie con Funghi sott’Olio, alla Francese" /><published>2025-09-28T16:05:00+01:00</published><updated>2025-09-28T16:05:00+01:00</updated><id>https://scown.space/pasta-codex/2025/09/28/oil-preserved-mushrooms</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/09/28/oil-preserved-mushrooms"><![CDATA[<p>Skipped this as I couldn’t find any oil preserved mushrooms.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Skipped this as I couldn’t find any oil preserved mushrooms.]]></summary></entry><entry><title type="html">“Ciceri e Trii” alla Salentina</title><link href="https://scown.space/pasta-codex/2025/09/28/salento-style" rel="alternate" type="text/html" title="“Ciceri e Trii” alla Salentina" /><published>2025-09-28T15:54:00+01:00</published><updated>2025-09-28T15:54:00+01:00</updated><id>https://scown.space/pasta-codex/2025/09/28/salento-style</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/09/28/salento-style"><![CDATA[<p>More pasta with chickpeas (posted slightly out of sequence due to time constraints).</p>

<p>Drier than the previous recipes, possibly because I wasn’t paying attention and let it dry out a bit. This may also be why the tomatoes got lost.</p>

<p>Made here with dried egg noodles.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[More pasta with chickpeas (posted slightly out of sequence due to time constraints).]]></summary></entry><entry><title type="html">Bucatini con i Funghi alla Maniera del Gargano</title><link href="https://scown.space/pasta-codex/2025/08/30/bucatini-mushrooms-tomatoes" rel="alternate" type="text/html" title="Bucatini con i Funghi alla Maniera del Gargano" /><published>2025-08-30T16:55:00+01:00</published><updated>2025-08-30T16:55:00+01:00</updated><id>https://scown.space/pasta-codex/2025/08/30/bucatini-mushrooms-tomatoes</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/08/30/bucatini-mushrooms-tomatoes"><![CDATA[<p>Bucatini with fried mushrooms, garlic, parsley, and cherry tomatoes.</p>

<p>As ever, the tomatoes make this much better.</p>

<p>Made with super chestnut mushrooms.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Bucatini with fried mushrooms, garlic, parsley, and cherry tomatoes.]]></summary></entry><entry><title type="html">Bucatini con i Funghi</title><link href="https://scown.space/pasta-codex/2025/08/30/bucatini-mushrooms" rel="alternate" type="text/html" title="Bucatini con i Funghi" /><published>2025-08-30T16:46:00+01:00</published><updated>2025-08-30T16:46:00+01:00</updated><id>https://scown.space/pasta-codex/2025/08/30/bucatini-mushrooms</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/08/30/bucatini-mushrooms"><![CDATA[<p>Bucatini with fried mushrooms, garlic, and parsley.</p>

<p>It’s fine.</p>

<p>I used white button mushrooms instead of Chiodini for availability reasons.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Bucatini with fried mushrooms, garlic, and parsley.]]></summary></entry><entry><title type="html">Cece e Laganelle “Lampe e Tuone” – II Ricetta</title><link href="https://scown.space/pasta-codex/2025/08/30/thunder-lightning-chickpeas-ii" rel="alternate" type="text/html" title="Cece e Laganelle “Lampe e Tuone” – II Ricetta" /><published>2025-08-30T16:42:00+01:00</published><updated>2025-08-30T16:42:00+01:00</updated><id>https://scown.space/pasta-codex/2025/08/30/thunder-lightning-chickpeas-ii</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/08/30/thunder-lightning-chickpeas-ii"><![CDATA[<p>Basically the same as the previous recipe, but with parsley and slightly less water.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Basically the same as the previous recipe, but with parsley and slightly less water.]]></summary></entry><entry><title type="html">Cece (o Fagioli) e Laganelle “Lampe e Tuone” – I Ricetta</title><link href="https://scown.space/pasta-codex/2025/08/30/thunder-lightning-chickpeas-i" rel="alternate" type="text/html" title="Cece (o Fagioli) e Laganelle “Lampe e Tuone” – I Ricetta" /><published>2025-08-30T16:34:00+01:00</published><updated>2025-08-30T16:34:00+01:00</updated><id>https://scown.space/pasta-codex/2025/08/30/thunder-lightning-chickpeas-i</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/08/30/thunder-lightning-chickpeas-i"><![CDATA[<p>Pasta with chickpeas.</p>

<p>More of a soup than a sauce (getting the quantity of water right is tricky). I used fresh tagliatelle as a substitute for laganelle (though it seems slightly odd that we’re having egg noodles in Pasta with Vegetables).</p>

<p>Reasonably tasty but having to soak the chickpeas is a bit of a faff.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with chickpeas.]]></summary></entry><entry><title type="html">Pasta e Lenticchie – II Ricetta</title><link href="https://scown.space/pasta-codex/2025/07/26/pasta-lentils-ii" rel="alternate" type="text/html" title="Pasta e Lenticchie – II Ricetta" /><published>2025-07-26T14:52:00+01:00</published><updated>2025-07-26T14:52:00+01:00</updated><id>https://scown.space/pasta-codex/2025/07/26/pasta-lentils-ii</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/07/26/pasta-lentils-ii"><![CDATA[<p>Pasta with lentil soup and tomatoes.</p>

<p>I’ve used passata for the tomato purée called for in the recipe (because what we call tomato purée is the book’s tomato paste).</p>

<p>Again, red lentils don’t work so well.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with lentil soup and tomatoes.]]></summary></entry><entry><title type="html">Pasta e Lenticchie – I Ricetta</title><link href="https://scown.space/pasta-codex/2025/07/26/pasta-lentils-i" rel="alternate" type="text/html" title="Pasta e Lenticchie – I Ricetta" /><published>2025-07-26T14:48:00+01:00</published><updated>2025-07-26T14:48:00+01:00</updated><id>https://scown.space/pasta-codex/2025/07/26/pasta-lentils-i</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/07/26/pasta-lentils-i"><![CDATA[<p>Pasta with lentil soup.</p>

<p>The tricky bit seems to be getting the “generous” quantity of water right. Too much, and the mixture doesn’t come out thick and soupy. Too little, and there won’t be sufficient water to cook the pasta in at the end.</p>

<p>I’ve tried these with green lentils, red lentils and what Waitrose simply calls “lentils”. Red lentils don’t really work here.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with lentil soup.]]></summary></entry><entry><title type="html">Pasta e Fagioli alla Veneta</title><link href="https://scown.space/pasta-codex/2025/07/26/veneto-pasta-beans" rel="alternate" type="text/html" title="Pasta e Fagioli alla Veneta" /><published>2025-07-26T14:44:00+01:00</published><updated>2025-07-26T14:44:00+01:00</updated><id>https://scown.space/pasta-codex/2025/07/26/veneto-pasta-beans</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/07/26/veneto-pasta-beans"><![CDATA[<p>Same again.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Same again.]]></summary></entry><entry><title type="html">Pasta e Fagioli alla Napoletana</title><link href="https://scown.space/pasta-codex/2025/07/26/pasta-beans-tomatoes" rel="alternate" type="text/html" title="Pasta e Fagioli alla Napoletana" /><published>2025-07-26T14:40:00+01:00</published><updated>2025-07-26T14:40:00+01:00</updated><id>https://scown.space/pasta-codex/2025/07/26/pasta-beans-tomatoes</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/07/26/pasta-beans-tomatoes"><![CDATA[<p>Pass, as again it was non-obvious where to obtain dried beans, or indeed, what kind of beans I’m supposed to use.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pass, as again it was non-obvious where to obtain dried beans, or indeed, what kind of beans I’m supposed to use.]]></summary></entry><entry><title type="html">Avemarie, Cannellini o Chifferi con Purea di Fagioli alla Brasiliana</title><link href="https://scown.space/pasta-codex/2025/06/28/bean-puree" rel="alternate" type="text/html" title="Avemarie, Cannellini o Chifferi con Purea di Fagioli alla Brasiliana" /><published>2025-06-28T15:49:00+01:00</published><updated>2025-06-28T15:49:00+01:00</updated><id>https://scown.space/pasta-codex/2025/06/28/bean-puree</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/06/28/bean-puree"><![CDATA[<p>Pasta with kidney bean puree and vegetables.</p>

<p>Made using tinned beans instead of fresh, which probably didn’t help.</p>

<p>Pictured here with Fusilli.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with kidney bean puree and vegetables.]]></summary></entry><entry><title type="html">Pasta e Fagioli Freschi alla Veneta</title><link href="https://scown.space/pasta-codex/2025/06/28/fresh-bean-soup" rel="alternate" type="text/html" title="Pasta e Fagioli Freschi alla Veneta" /><published>2025-06-28T15:47:00+01:00</published><updated>2025-06-28T15:47:00+01:00</updated><id>https://scown.space/pasta-codex/2025/06/28/fresh-bean-soup</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/06/28/fresh-bean-soup"><![CDATA[<p>Again, skipping this one because I don’t understand shelled fresh beans.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Again, skipping this one because I don’t understand shelled fresh beans.]]></summary></entry><entry><title type="html">Pasta e Fagioli Sgranati</title><link href="https://scown.space/pasta-codex/2025/06/28/pasta-fresh-beans" rel="alternate" type="text/html" title="Pasta e Fagioli Sgranati" /><published>2025-06-28T15:42:00+01:00</published><updated>2025-06-28T15:42:00+01:00</updated><id>https://scown.space/pasta-codex/2025/06/28/pasta-fresh-beans</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/06/28/pasta-fresh-beans"><![CDATA[<p>Pass, because I can’t figure out what sort of beans to buy, let alone where to buy them.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pass, because I can’t figure out what sort of beans to buy, let alone where to buy them.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli con Fave Secche</title><link href="https://scown.space/pasta-codex/2025/06/28/spaghetti-dried-fava-beans" rel="alternate" type="text/html" title="Spaghetti o Vermicelli con Fave Secche" /><published>2025-06-28T15:39:00+01:00</published><updated>2025-06-28T15:39:00+01:00</updated><id>https://scown.space/pasta-codex/2025/06/28/spaghetti-dried-fava-beans</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/06/28/spaghetti-dried-fava-beans"><![CDATA[<p>Pass, because it was non-obvious where to obtain dried beans. Given the cooking time is two hours, it’s unlikely fresh beans would be an acceptable substitute.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pass, because it was non-obvious where to obtain dried beans. Given the cooking time is two hours, it’s unlikely fresh beans would be an acceptable substitute.]]></summary></entry><entry><title type="html">Bucatini o Cannolicchi con le Fave</title><link href="https://scown.space/pasta-codex/2025/06/28/bucatini-fava-beans" rel="alternate" type="text/html" title="Bucatini o Cannolicchi con le Fave" /><published>2025-06-28T15:36:00+01:00</published><updated>2025-06-28T15:36:00+01:00</updated><id>https://scown.space/pasta-codex/2025/06/28/bucatini-fava-beans</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/06/28/bucatini-fava-beans"><![CDATA[<p>Pasta with fried broad beans and parsley.</p>

<p>A bit tedious, mainly because the beans need to be skinned after they are removed from the pods. Do not be tempted to skip this step, as when fried the beans will force themselves out of the skins, and you’ll have to skin them while they’re very hot.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with fried broad beans and parsley.]]></summary></entry><entry><title type="html">Vermicelli o Spaghetti col Sugo di Mele</title><link href="https://scown.space/pasta-codex/2025/05/25/pasta-apple-sauce" rel="alternate" type="text/html" title="Vermicelli o Spaghetti col Sugo di Mele" /><published>2025-05-25T16:33:00+01:00</published><updated>2025-05-25T16:33:00+01:00</updated><id>https://scown.space/pasta-codex/2025/05/25/pasta-apple-sauce</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/05/25/pasta-apple-sauce"><![CDATA[<p>The name conjures up an image of pasta topped with apple sauce (the kind one might have with a pork chop).</p>

<p>This isn’t that, it is instead a tomato sauce with apple juice added (I used ready made pressed apple juice instead of pressing my own apples to save time).</p>

<p>Surprisingly, this actually works really well.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The name conjures up an image of pasta topped with apple sauce (the kind one might have with a pork chop).]]></summary></entry><entry><title type="html">Farfalle o Stelline in Insalata, con Legumi</title><link href="https://scown.space/pasta-codex/2025/05/25/vegetable-salad" rel="alternate" type="text/html" title="Farfalle o Stelline in Insalata, con Legumi" /><published>2025-05-25T16:28:00+01:00</published><updated>2025-05-25T16:28:00+01:00</updated><id>https://scown.space/pasta-codex/2025/05/25/vegetable-salad</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/05/25/vegetable-salad"><![CDATA[<p>Pasta with a potato, carrot and pea salad (I used frozen peas rather than shelled).</p>

<p>Serviceable, but unexciting.</p>

<p>Made here with fusilli, and eaten warmer than expected due to poor scheduling on the day I made it.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with a potato, carrot and pea salad (I used frozen peas rather than shelled).]]></summary></entry><entry><title type="html">Farfalle o Stelline alla Parmigiana</title><link href="https://scown.space/pasta-codex/2025/05/10/farfalle-vegetables" rel="alternate" type="text/html" title="Farfalle o Stelline alla Parmigiana" /><published>2025-05-10T16:51:00+01:00</published><updated>2025-05-10T16:51:00+01:00</updated><id>https://scown.space/pasta-codex/2025/05/10/farfalle-vegetables</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/05/10/farfalle-vegetables"><![CDATA[<p>Pasta cooked in vegetable soup.</p>

<p>I added a bit too much water so the soup was quite thin, and there was too much of it (I had some as a starter later in the week).</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta cooked in vegetable soup.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli alla Provenzale</title><link href="https://scown.space/pasta-codex/2025/05/10/spaghetti-vegetables-herbs" rel="alternate" type="text/html" title="Spaghetti o Vermicelli alla Provenzale" /><published>2025-05-10T16:48:00+01:00</published><updated>2025-05-10T16:48:00+01:00</updated><id>https://scown.space/pasta-codex/2025/05/10/spaghetti-vegetables-herbs</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/05/10/spaghetti-vegetables-herbs"><![CDATA[<p>Spaghetti with fried vegetables. Not bad.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Spaghetti with fried vegetables. Not bad.]]></summary></entry><entry><title type="html">Farfalle o Cannolicchi con Patate ed Erbe</title><link href="https://scown.space/pasta-codex/2025/05/10/pasta-potatoes-herbs" rel="alternate" type="text/html" title="Farfalle o Cannolicchi con Patate ed Erbe" /><published>2025-05-10T16:45:00+01:00</published><updated>2025-05-10T16:45:00+01:00</updated><id>https://scown.space/pasta-codex/2025/05/10/pasta-potatoes-herbs</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/05/10/pasta-potatoes-herbs"><![CDATA[<p>And back to boiled potatoes. Sigh.</p>

<p>Couldn’t find any chervil, so this was made with just parsley.</p>

<p>Pictured here with fusilli and optional cheese.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[And back to boiled potatoes. Sigh.]]></summary></entry><entry><title type="html">Pasta e Patate</title><link href="https://scown.space/pasta-codex/2025/05/10/pasta-potatoes" rel="alternate" type="text/html" title="Pasta e Patate" /><published>2025-05-10T16:40:00+01:00</published><updated>2025-05-10T16:40:00+01:00</updated><id>https://scown.space/pasta-codex/2025/05/10/pasta-potatoes</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/05/10/pasta-potatoes"><![CDATA[<p>Pasta with fried potatoes, tomatoes, and parsley.</p>

<p>An improvement on the previous recipe, mainly due to frying the potatoes.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with fried potatoes, tomatoes, and parsley.]]></summary></entry><entry><title type="html">Orecchiette con le Patate</title><link href="https://scown.space/pasta-codex/2025/02/15/orecchiette-potatoes" rel="alternate" type="text/html" title="Orecchiette con le Patate" /><published>2025-02-15T16:10:00+00:00</published><updated>2025-02-15T16:10:00+00:00</updated><id>https://scown.space/pasta-codex/2025/02/15/orecchiette-potatoes</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/02/15/orecchiette-potatoes"><![CDATA[<p>Pasta with boiled potatoes and tomato sauce.</p>

<p>Boiling potatoes is about the worst way to prepare them, and as such, this is not great (without the tomatoes, it would be even worse).</p>

<p>Made using bought Orecchiette.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with boiled potatoes and tomato sauce.]]></summary></entry><entry><title type="html">Pasta col Finocchio Selvatigo</title><link href="https://scown.space/pasta-codex/2025/02/15/wild-fennel" rel="alternate" type="text/html" title="Pasta col Finocchio Selvatigo" /><published>2025-02-15T16:08:00+00:00</published><updated>2025-02-15T16:08:00+00:00</updated><id>https://scown.space/pasta-codex/2025/02/15/wild-fennel</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/02/15/wild-fennel"><![CDATA[<p>Pass. Wild fennel is difficult to obtain, and standard bulb fennel wouldn’t have anywhere like enough fronds to make this work.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pass. Wild fennel is difficult to obtain, and standard bulb fennel wouldn’t have anywhere like enough fronds to make this work.]]></summary></entry><entry><title type="html">Conchiglie in Insalata con Carciofi</title><link href="https://scown.space/pasta-codex/2025/02/15/conchiglie-artichokes" rel="alternate" type="text/html" title="Conchiglie in Insalata con Carciofi" /><published>2025-02-15T16:05:00+00:00</published><updated>2025-02-15T16:05:00+00:00</updated><id>https://scown.space/pasta-codex/2025/02/15/conchiglie-artichokes</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/02/15/conchiglie-artichokes"><![CDATA[<p>Cold short pasta with artichokes, dressed with olive oil and lemon juice. Again, this is using tinned artichokes.</p>

<p>A reasonable starter.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Cold short pasta with artichokes, dressed with olive oil and lemon juice. Again, this is using tinned artichokes.]]></summary></entry><entry><title type="html">Bucatini, Spaghetti o Penne con i Carciofi e Olive</title><link href="https://scown.space/pasta-codex/2025/02/15/bucatini-artichokes-olives" rel="alternate" type="text/html" title="Bucatini, Spaghetti o Penne con i Carciofi e Olive" /><published>2025-02-15T16:02:00+00:00</published><updated>2025-02-15T16:02:00+00:00</updated><id>https://scown.space/pasta-codex/2025/02/15/bucatini-artichokes-olives</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/02/15/bucatini-artichokes-olives"><![CDATA[<p>Pasta with artichokes and olives. Again, this is using tinned artichokes.</p>

<p>The olives give it a bit of a lift compared to the previous recipe.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with artichokes and olives. Again, this is using tinned artichokes.]]></summary></entry><entry><title type="html">Bucatini, Spaghetti o Penne con i Carciofi</title><link href="https://scown.space/pasta-codex/2025/02/15/bucatini-artichokes" rel="alternate" type="text/html" title="Bucatini, Spaghetti o Penne con i Carciofi" /><published>2025-02-15T15:58:00+00:00</published><updated>2025-02-15T15:58:00+00:00</updated><id>https://scown.space/pasta-codex/2025/02/15/bucatini-artichokes</id><content type="html" xml:base="https://scown.space/pasta-codex/2025/02/15/bucatini-artichokes"><![CDATA[<p>Pasta with artichokes. I used tinned artichoke hearts rather than buying full artichokes and trimming and soaking them.</p>

<p>Pictured here with the optional cheese.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with artichokes. I used tinned artichoke hearts rather than buying full artichokes and trimming and soaking them.]]></summary></entry><entry><title type="html">Bucatini con gli Asparagi</title><link href="https://scown.space/pasta-codex/2024/12/08/bucatini-asparagus" rel="alternate" type="text/html" title="Bucatini con gli Asparagi" /><published>2024-12-08T15:58:00+00:00</published><updated>2024-12-08T15:58:00+00:00</updated><id>https://scown.space/pasta-codex/2024/12/08/bucatini-asparagus</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/12/08/bucatini-asparagus"><![CDATA[<p>Pasta with fried asparagus. Not bad, if you like asparagus.</p>

<p>Shown here with spaghetti.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with fried asparagus. Not bad, if you like asparagus.]]></summary></entry><entry><title type="html">Cannolicchi Piselli, in Insalata</title><link href="https://scown.space/pasta-codex/2024/12/08/pea-salad" rel="alternate" type="text/html" title="Cannolicchi Piselli, in Insalata" /><published>2024-12-08T15:55:00+00:00</published><updated>2024-12-08T15:55:00+00:00</updated><id>https://scown.space/pasta-codex/2024/12/08/pea-salad</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/12/08/pea-salad"><![CDATA[<p>Pasta with peas and parsley, served cool.</p>

<p>Works well as a starter.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with peas and parsley, served cool.]]></summary></entry><entry><title type="html">Pasta (Corta) e Piselli – II Ricetta</title><link href="https://scown.space/pasta-codex/2024/12/08/pasta-peas-2" rel="alternate" type="text/html" title="Pasta (Corta) e Piselli – II Ricetta" /><published>2024-12-08T15:53:00+00:00</published><updated>2024-12-08T15:53:00+00:00</updated><id>https://scown.space/pasta-codex/2024/12/08/pasta-peas-2</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/12/08/pasta-peas-2"><![CDATA[<p>Pasta with fried peas and onions.</p>

<p>Much more like it. Tastes better and is easier to cook properly.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with fried peas and onions.]]></summary></entry><entry><title type="html">Pasta (Corta) e Piselli – I Ricetta</title><link href="https://scown.space/pasta-codex/2024/12/08/pasta-peas-1" rel="alternate" type="text/html" title="Pasta (Corta) e Piselli – I Ricetta" /><published>2024-12-08T15:51:00+00:00</published><updated>2024-12-08T15:51:00+00:00</updated><id>https://scown.space/pasta-codex/2024/12/08/pasta-peas-1</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/12/08/pasta-peas-1"><![CDATA[<p>Pasta with boiled peas and onions.</p>

<p>Not appealing at the best of times, and I also managed to upset my digestive system with this one.</p>

<p>Would not recommend.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with boiled peas and onions.]]></summary></entry><entry><title type="html">Peperoni Ripieni di Spaghetti</title><link href="https://scown.space/pasta-codex/2024/12/08/stuffed-peppers" rel="alternate" type="text/html" title="Peperoni Ripieni di Spaghetti" /><published>2024-12-08T15:42:00+00:00</published><updated>2024-12-08T15:42:00+00:00</updated><id>https://scown.space/pasta-codex/2024/12/08/stuffed-peppers</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/12/08/stuffed-peppers"><![CDATA[<p>Roasted red peppers, stuffed with spaghetti and tomato sauce.</p>

<p>Be careful when roasting the peppers in order to peel them – too much roasting means the peppers collapse and it’s difficult to stuff them without them falling apart.</p>

<p>Despite that, very tasty.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Roasted red peppers, stuffed with spaghetti and tomato sauce.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli, Linguine con Salsa di Peperoni e Pomodori</title><link href="https://scown.space/pasta-codex/2024/10/19/spaghetti-peppers-tomatoes" rel="alternate" type="text/html" title="Spaghetti o Vermicelli, Linguine con Salsa di Peperoni e Pomodori" /><published>2024-10-19T17:25:00+01:00</published><updated>2024-10-19T17:25:00+01:00</updated><id>https://scown.space/pasta-codex/2024/10/19/spaghetti-peppers-tomatoes</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/10/19/spaghetti-peppers-tomatoes"><![CDATA[<p>The previous recipe, with tomatoes added near the end.</p>

<p>I used tinned tomatoes for this, which may mean there was more juice than intended. Nevertheless, I like this more than the version without tomatoes.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The previous recipe, with tomatoes added near the end.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli, Linguine con Salsa di Peperoni</title><link href="https://scown.space/pasta-codex/2024/09/28/spaghetti-peppers" rel="alternate" type="text/html" title="Spaghetti o Vermicelli, Linguine con Salsa di Peperoni" /><published>2024-09-28T15:59:00+01:00</published><updated>2024-09-28T15:59:00+01:00</updated><id>https://scown.space/pasta-codex/2024/09/28/spaghetti-peppers</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/09/28/spaghetti-peppers"><![CDATA[<p>Spaghetti with peppers, boiled in their own liquid.</p>

<p>Despite the addition of balsamic vinegar, not massively flavour-some (maybe I need to buy better peppers).</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Spaghetti with peppers, boiled in their own liquid.]]></summary></entry><entry><title type="html">Spaghetti con i Peperoncini</title><link href="https://scown.space/pasta-codex/2024/09/28/spaghetti-small-sweet-peppers" rel="alternate" type="text/html" title="Spaghetti con i Peperoncini" /><published>2024-09-28T15:52:00+01:00</published><updated>2024-09-28T15:52:00+01:00</updated><id>https://scown.space/pasta-codex/2024/09/28/spaghetti-small-sweet-peppers</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/09/28/spaghetti-small-sweet-peppers"><![CDATA[<p>Not attempted, as the required sweet peppers (possibly <span lang="it">friggitelli</span>) do not appear to be readily available (they are not the same as green chilli peppers).</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Not attempted, as the required sweet peppers (possibly friggitelli) do not appear to be readily available (they are not the same as green chilli peppers).]]></summary></entry><entry><title type="html">Bucatini o Linguine con i Peperoni – II Ricetta</title><link href="https://scown.space/pasta-codex/2024/09/28/bucatini-peppers-ii" rel="alternate" type="text/html" title="Bucatini o Linguine con i Peperoni – II Ricetta" /><published>2024-09-28T15:47:00+01:00</published><updated>2024-09-28T15:47:00+01:00</updated><id>https://scown.space/pasta-codex/2024/09/28/bucatini-peppers-ii</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/09/28/bucatini-peppers-ii"><![CDATA[<p>Bucatini with peppers, capers, tomatoes and parsley.</p>

<p>Remove the capers and parsley along with the peppers, otherwise they will burn.</p>

<p>Very similar to the previous recipe.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Bucatini with peppers, capers, tomatoes and parsley.]]></summary></entry><entry><title type="html">Bucatini o Linguine con i Peperoni – I Ricetta</title><link href="https://scown.space/pasta-codex/2024/08/31/bucatini-peppers" rel="alternate" type="text/html" title="Bucatini o Linguine con i Peperoni – I Ricetta" /><published>2024-08-31T16:35:00+01:00</published><updated>2024-08-31T16:35:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/31/bucatini-peppers</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/31/bucatini-peppers"><![CDATA[<p>Bucatini with roasted bell peppers.</p>

<p>I managed to massively overcook the garlic (hence the black bits in the photo).</p>

<p>Slightly better with cheese.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Bucatini with roasted bell peppers.]]></summary></entry><entry><title type="html">Vermicelli o Spaghetti alla Tunisina con Melanzane e Peperoni</title><link href="https://scown.space/pasta-codex/2024/08/31/spaghetti-eggplant-peppers" rel="alternate" type="text/html" title="Vermicelli o Spaghetti alla Tunisina con Melanzane e Peperoni" /><published>2024-08-31T16:21:00+01:00</published><updated>2024-08-31T16:21:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/31/spaghetti-eggplant-peppers</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/31/spaghetti-eggplant-peppers"><![CDATA[<p>Spaghetti with aubergine and bell pepper slices.</p>

<p>It’s fine.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Spaghetti with aubergine and bell pepper slices.]]></summary></entry><entry><title type="html">Vermicelli o Spaghetti con Melanzane e Pomodoro</title><link href="https://scown.space/pasta-codex/2024/08/31/spaghetti-eggplant-tomatoes" rel="alternate" type="text/html" title="Vermicelli o Spaghetti con Melanzane e Pomodoro" /><published>2024-08-31T16:09:00+01:00</published><updated>2024-08-31T16:09:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/31/spaghetti-eggplant-tomatoes</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/31/spaghetti-eggplant-tomatoes"><![CDATA[<p>Spaghetti with aubergine and tomato sauce (the tomatoes are under the aubergine).</p>

<p>If I remember rightly the parsley was somewhat overdone.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Spaghetti with aubergine and tomato sauce (the tomatoes are under the aubergine).]]></summary></entry><entry><title type="html">Bavette con Melanzane alla Nizzarda</title><link href="https://scown.space/pasta-codex/2024/08/03/ni%C3%A7oise-bavette-eggplant" rel="alternate" type="text/html" title="Bavette con Melanzane alla Nizzarda" /><published>2024-08-03T16:52:00+01:00</published><updated>2024-08-03T16:52:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/ni%C3%A7oise-bavette-eggplant</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/ni%C3%A7oise-bavette-eggplant"><![CDATA[<p>Boiled aubergine slices, with garlic oil.</p>

<p>Spaghetti is substituting for the bavette.</p>

<p>Managed to overcook the aubergine, so it was a bit bland.</p>

<p>Despite this still being under Pasta with Vegetables, the recipe calls for cheese.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Boiled aubergine slices, with garlic oil.]]></summary></entry><entry><title type="html">Vermicello o Spaghetti con le Melazane – II Ricetta</title><link href="https://scown.space/pasta-codex/2024/08/03/spaghetti-eggplant-ii" rel="alternate" type="text/html" title="Vermicello o Spaghetti con le Melazane – II Ricetta" /><published>2024-08-03T16:51:00+01:00</published><updated>2024-08-03T16:51:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/spaghetti-eggplant-ii</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/spaghetti-eggplant-ii"><![CDATA[<p>Spaghetti with diced aubergine, which has been left to drain overnight.</p>

<p>Garlic and chilli give it some additional flavour.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Spaghetti with diced aubergine, which has been left to drain overnight.]]></summary></entry><entry><title type="html">Vermicello o Spaghetti con le Melazane – I Ricetta</title><link href="https://scown.space/pasta-codex/2024/08/03/spaghetti-eggplant-i" rel="alternate" type="text/html" title="Vermicello o Spaghetti con le Melazane – I Ricetta" /><published>2024-08-03T16:49:00+01:00</published><updated>2024-08-03T16:49:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/spaghetti-eggplant-i</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/spaghetti-eggplant-i"><![CDATA[<p>Spaghetti with fried aubergine slices, which have been left to drain overnight.</p>

<p>Works surprisingly well.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Spaghetti with fried aubergine slices, which have been left to drain overnight.]]></summary></entry><entry><title type="html">Tubetti e Cocozza</title><link href="https://scown.space/pasta-codex/2024/08/03/tubetti-cocozza" rel="alternate" type="text/html" title="Tubetti e Cocozza" /><published>2024-08-03T16:44:00+01:00</published><updated>2024-08-03T16:44:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/tubetti-cocozza</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/tubetti-cocozza"><![CDATA[<p>Gave this one a miss as cocozza squash was hard to find and a good substitute wasn’t clear (it doesn’t appear to be very like a butternut squash and I’ve just had a run of courgette recipes).</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Gave this one a miss as cocozza squash was hard to find and a good substitute wasn’t clear (it doesn’t appear to be very like a butternut squash and I’ve just had a run of courgette recipes).]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli con Fiori di Zucca</title><link href="https://scown.space/pasta-codex/2024/08/03/spaghetti-squash-blossoms" rel="alternate" type="text/html" title="Spaghetti o Vermicelli con Fiori di Zucca" /><published>2024-08-03T16:44:00+01:00</published><updated>2024-08-03T16:44:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/spaghetti-squash-blossoms</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/spaghetti-squash-blossoms"><![CDATA[<p>I have no idea where I would obtain squash blossoms.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[I have no idea where I would obtain squash blossoms.]]></summary></entry><entry><title type="html">Conchiglie in Insalata con le Zucchine</title><link href="https://scown.space/pasta-codex/2024/08/03/conchiglie-zucchini" rel="alternate" type="text/html" title="Conchiglie in Insalata con le Zucchine" /><published>2024-08-03T16:35:00+01:00</published><updated>2024-08-03T16:35:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/conchiglie-zucchini</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/conchiglie-zucchini"><![CDATA[<p>Fried courgette slices with lemon juice, served cool.</p>

<p>Made here with fusilli rather than conchiglie.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Fried courgette slices with lemon juice, served cool.]]></summary></entry><entry><title type="html">Spaghetti con Zucchini e Pomodori – II Ricetta</title><link href="https://scown.space/pasta-codex/2024/08/03/spaghetti-zucchini-tomato-ii" rel="alternate" type="text/html" title="Spaghetti con Zucchini e Pomodori – II Ricetta" /><published>2024-08-03T16:31:00+01:00</published><updated>2024-08-03T16:31:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/spaghetti-zucchini-tomato-ii</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/spaghetti-zucchini-tomato-ii"><![CDATA[<p>As the previous recipe, with the addition of boiling water and the spaghetti broken into pieces.</p>

<p>Not sure it really works.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[As the previous recipe, with the addition of boiling water and the spaghetti broken into pieces.]]></summary></entry><entry><title type="html">Spaghetti con Zucchini e Pomodori – I Ricetta</title><link href="https://scown.space/pasta-codex/2024/08/03/spaghetti-zucchini-tomato" rel="alternate" type="text/html" title="Spaghetti con Zucchini e Pomodori – I Ricetta" /><published>2024-08-03T16:21:00+01:00</published><updated>2024-08-03T16:21:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/spaghetti-zucchini-tomato</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/spaghetti-zucchini-tomato"><![CDATA[<p>Spaghetti with diced, fried courgette, and tomatoes.</p>

<p>Not bad.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Spaghetti with diced, fried courgette, and tomatoes.]]></summary></entry><entry><title type="html">Spaghetti con Zucchini</title><link href="https://scown.space/pasta-codex/2024/08/03/spaghetti-zucchini" rel="alternate" type="text/html" title="Spaghetti con Zucchini" /><published>2024-08-03T16:15:00+01:00</published><updated>2024-08-03T16:15:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/spaghetti-zucchini</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/spaghetti-zucchini"><![CDATA[<p>Spaghetti with fried courgette slices.</p>

<p>Not really my thing, but it works well enough.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Spaghetti with fried courgette slices.]]></summary></entry><entry><title type="html">Bucatini con la Cipolla – II Ricetta</title><link href="https://scown.space/pasta-codex/2024/08/03/bucatini-onions-ii" rel="alternate" type="text/html" title="Bucatini con la Cipolla – II Ricetta" /><published>2024-08-03T16:08:00+01:00</published><updated>2024-08-03T16:08:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/bucatini-onions-ii</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/bucatini-onions-ii"><![CDATA[<p>Bucatini with spring onions.</p>

<p>Managed not to photograph this one.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Bucatini with spring onions.]]></summary></entry><entry><title type="html">Bucatini con la Cipolla – I Ricetta</title><link href="https://scown.space/pasta-codex/2024/08/03/bucatini-onions-i" rel="alternate" type="text/html" title="Bucatini con la Cipolla – I Ricetta" /><published>2024-08-03T16:01:00+01:00</published><updated>2024-08-03T16:01:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/bucatini-onions-i</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/bucatini-onions-i"><![CDATA[<p>Bucatini with a large quantity of onion. Tastes about how you’d expect.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Bucatini with a large quantity of onion. Tastes about how you’d expect.]]></summary></entry><entry><title type="html">Bucatini con i Friarelli</title><link href="https://scown.space/pasta-codex/2024/08/03/bucatini-friarelli" rel="alternate" type="text/html" title="Bucatini con i Friarelli" /><published>2024-08-03T15:56:00+01:00</published><updated>2024-08-03T15:56:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/bucatini-friarelli</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/bucatini-friarelli"><![CDATA[<p>Pass. Friarelli is non-trivial to obtain.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pass. Friarelli is non-trivial to obtain.]]></summary></entry><entry><title type="html">Bucatini o Maccheroncini con i Broccoletti alla Siciliana</title><link href="https://scown.space/pasta-codex/2024/08/03/bucatini-pine-nuts-saffron" rel="alternate" type="text/html" title="Bucatini o Maccheroncini con i Broccoletti alla Siciliana" /><published>2024-08-03T15:52:00+01:00</published><updated>2024-08-03T15:52:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/bucatini-pine-nuts-saffron</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/bucatini-pine-nuts-saffron"><![CDATA[<p>Similar to the previous recipe, but with added saffron. Not sure it makes much of a difference.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Similar to the previous recipe, but with added saffron. Not sure it makes much of a difference.]]></summary></entry><entry><title type="html">Bucatini o Maccheroncini con i Broccoletti alla Salernitana</title><link href="https://scown.space/pasta-codex/2024/08/03/bucatini-broccolini-pine-nuts" rel="alternate" type="text/html" title="Bucatini o Maccheroncini con i Broccoletti alla Salernitana" /><published>2024-08-03T15:43:00+01:00</published><updated>2024-08-03T15:43:00+01:00</updated><id>https://scown.space/pasta-codex/2024/08/03/bucatini-broccolini-pine-nuts</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/08/03/bucatini-broccolini-pine-nuts"><![CDATA[<p>Tenderstem broccoli with pine nuts and raisins.</p>

<p>Pictured here with Bucatini.</p>

<p>Slightly odd.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Tenderstem broccoli with pine nuts and raisins.]]></summary></entry><entry><title type="html">Orecchiette (o Pasta Secche) con Broccoletti e Pomodoro</title><link href="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccolini-tomatoes" rel="alternate" type="text/html" title="Orecchiette (o Pasta Secche) con Broccoletti e Pomodoro" /><published>2024-05-18T17:08:00+01:00</published><updated>2024-05-18T17:08:00+01:00</updated><id>https://scown.space/pasta-codex/2024/05/18/orecchiette-broccolini-tomatoes</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccolini-tomatoes"><![CDATA[<p>The same as the previous recipe, but with a tomato sauce.</p>

<p>There may be more tomato here than is strictly necessary.</p>

<p>Very good.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The same as the previous recipe, but with a tomato sauce.]]></summary></entry><entry><title type="html">Orecchiette (o Pasta Secche) con i Broccoletti Strascinati</title><link href="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccolini-garlic" rel="alternate" type="text/html" title="Orecchiette (o Pasta Secche) con i Broccoletti Strascinati" /><published>2024-05-18T17:05:00+01:00</published><updated>2024-05-18T17:05:00+01:00</updated><id>https://scown.space/pasta-codex/2024/05/18/orecchiette-broccolini-garlic</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccolini-garlic"><![CDATA[<p>The same as the previous recipe, but with garlic, which is a slight improvement.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The same as the previous recipe, but with garlic, which is a slight improvement.]]></summary></entry><entry><title type="html">Orecchiette (o Pasta Secche) con Broccoletti</title><link href="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccolini" rel="alternate" type="text/html" title="Orecchiette (o Pasta Secche) con Broccoletti" /><published>2024-05-18T16:50:00+01:00</published><updated>2024-05-18T16:50:00+01:00</updated><id>https://scown.space/pasta-codex/2024/05/18/orecchiette-broccolini</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccolini"><![CDATA[<p>Bought orecchiette with tenderstem broccoli (I assume this is what’s meant by broccolini).</p>

<p>The bought orecchiette are smaller and thinner than the ones I made, and all the better for it.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Bought orecchiette with tenderstem broccoli (I assume this is what’s meant by broccolini).]]></summary></entry><entry><title type="html">Orecchiette (o Pasta Secche) con Cime di Rape, Pomodoro e Pangrattano</title><link href="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccoli-rabe-breadcrumbs" rel="alternate" type="text/html" title="Orecchiette (o Pasta Secche) con Cime di Rape, Pomodoro e Pangrattano" /><published>2024-05-18T16:50:00+01:00</published><updated>2024-05-18T16:50:00+01:00</updated><id>https://scown.space/pasta-codex/2024/05/18/orecchiette-broccoli-rabe-breadcrumbs</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccoli-rabe-breadcrumbs"><![CDATA[<p>The same as the previous recipe, but with fried breadcrumbs added to the sauce.</p>

<p>The breadcrumbs have a surprising amount of influence on the flavour of the dish.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The same as the previous recipe, but with fried breadcrumbs added to the sauce.]]></summary></entry><entry><title type="html">Orecchiette (o Pasta Secche) con Cime di Rape e Pomodoro</title><link href="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccoli-rabe-tomatoes" rel="alternate" type="text/html" title="Orecchiette (o Pasta Secche) con Cime di Rape e Pomodoro" /><published>2024-05-18T16:46:00+01:00</published><updated>2024-05-18T16:46:00+01:00</updated><id>https://scown.space/pasta-codex/2024/05/18/orecchiette-broccoli-rabe-tomatoes</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccoli-rabe-tomatoes"><![CDATA[<p>The same as the previous recipe, but with a tomato sauce.</p>

<p>Again, a slight improvement.</p>

<p>This variation is topped with cheese.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The same as the previous recipe, but with a tomato sauce.]]></summary></entry><entry><title type="html">Orecchiette (o Pasta Secche) con Cime di Rape Strascinate</title><link href="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccoli-rabe-garlic" rel="alternate" type="text/html" title="Orecchiette (o Pasta Secche) con Cime di Rape Strascinate" /><published>2024-05-18T16:44:00+01:00</published><updated>2024-05-18T16:44:00+01:00</updated><id>https://scown.space/pasta-codex/2024/05/18/orecchiette-broccoli-rabe-garlic</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccoli-rabe-garlic"><![CDATA[<p>The same as the previous recipe, but with garlic, which makes it slightly better</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The same as the previous recipe, but with garlic, which makes it slightly better]]></summary></entry><entry><title type="html">Orecchiette (o Pasta Secche) con Cime di Rape</title><link href="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccoli-rabe" rel="alternate" type="text/html" title="Orecchiette (o Pasta Secche) con Cime di Rape" /><published>2024-05-18T16:42:00+01:00</published><updated>2024-05-18T16:42:00+01:00</updated><id>https://scown.space/pasta-codex/2024/05/18/orecchiette-broccoli-rabe</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/05/18/orecchiette-broccoli-rabe"><![CDATA[<p>Home made Orecchiette with kale.</p>

<p>Broccoli rabe is not widely available here, but kale seems to be a reasonable substitute.</p>

<p>These orecchiette are too large and thick, but otherwise not too bad.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Home made Orecchiette with kale.]]></summary></entry><entry><title type="html">Minuicch con la Rucola</title><link href="https://scown.space/pasta-codex/2024/05/18/minuicch-argula" rel="alternate" type="text/html" title="Minuicch con la Rucola" /><published>2024-05-18T16:35:00+01:00</published><updated>2024-05-18T16:35:00+01:00</updated><id>https://scown.space/pasta-codex/2024/05/18/minuicch-argula</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/05/18/minuicch-argula"><![CDATA[<p>Home made minuicch with rocket.</p>

<p>Again, any resemblance to actual Minuicch is purely coincidental.</p>

<p>I used a metal drinking straw to shape this, but the pasta was not sufficiently dried out when doing this; as a result, the pieces deformed when removing them from the straw.</p>

<p>This was compounded by storing the pasta before it had dried out, so it stuck together and had to be reshaped.</p>

<p>Possibly served with too much rocket.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Home made minuicch with rocket.]]></summary></entry><entry><title type="html">Cavatielli con la Rucola</title><link href="https://scown.space/pasta-codex/2024/05/18/cavatielli-argula" rel="alternate" type="text/html" title="Cavatielli con la Rucola" /><published>2024-05-18T16:29:00+01:00</published><updated>2024-05-18T16:29:00+01:00</updated><id>https://scown.space/pasta-codex/2024/05/18/cavatielli-argula</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/05/18/cavatielli-argula"><![CDATA[<p>Home made cavatielli with rocket.</p>

<p>This is where it would be useful if the book had pictures – I have no idea what (if any) resemblance to actual cavatielli my pasta has.</p>

<p>They would probably benefit from being thinner.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Home made cavatielli with rocket.]]></summary></entry><entry><title type="html">Zite con la Catalogna</title><link href="https://scown.space/pasta-codex/2024/05/18/catalogna-chicory" rel="alternate" type="text/html" title="Zite con la Catalogna" /><published>2024-05-18T16:27:00+01:00</published><updated>2024-05-18T16:27:00+01:00</updated><id>https://scown.space/pasta-codex/2024/05/18/catalogna-chicory</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/05/18/catalogna-chicory"><![CDATA[<p>Gave this one a miss as Catalogna Chicory was not available, and the recipe implies
it’s significantly different (or at least, much larger), than the chicory that was
available.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Gave this one a miss as Catalogna Chicory was not available, and the recipe implies it’s significantly different (or at least, much larger), than the chicory that was available.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli con Salsa di Sedano</title><link href="https://scown.space/pasta-codex/2024/05/18/spaghetti-with-celery-sauce" rel="alternate" type="text/html" title="Spaghetti o Vermicelli con Salsa di Sedano" /><published>2024-05-18T16:20:00+01:00</published><updated>2024-05-18T16:20:00+01:00</updated><id>https://scown.space/pasta-codex/2024/05/18/spaghetti-with-celery-sauce</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/05/18/spaghetti-with-celery-sauce"><![CDATA[<p>Spaghetti with quite a lot of celery, which is pretty much what you’d expect.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Spaghetti with quite a lot of celery, which is pretty much what you’d expect.]]></summary></entry><entry><title type="html">Maccheroni (Penne, Mezze Zite, Zite) con le Cipolle</title><link href="https://scown.space/pasta-codex/2024/05/18/pasta-with-onions" rel="alternate" type="text/html" title="Maccheroni (Penne, Mezze Zite, Zite) con le Cipolle" /><published>2024-05-18T16:13:00+01:00</published><updated>2024-05-18T16:13:00+01:00</updated><id>https://scown.space/pasta-codex/2024/05/18/pasta-with-onions</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/05/18/pasta-with-onions"><![CDATA[<p>Penne with onions and tomato purée.</p>

<p>Unsurprisingly, this mostly tastes of onions.</p>

<p>Once again, if I’m not mistaken, this recipe contained tomato paste.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Penne with onions and tomato purée.]]></summary></entry><entry><title type="html">Ruoto di Maccheroni (Mezze Zite, Zite) con i Pomodori</title><link href="https://scown.space/pasta-codex/2024/02/24/baked-penne" rel="alternate" type="text/html" title="Ruoto di Maccheroni (Mezze Zite, Zite) con i Pomodori" /><published>2024-02-24T16:22:00+00:00</published><updated>2024-02-24T16:22:00+00:00</updated><id>https://scown.space/pasta-codex/2024/02/24/baked-penne</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/02/24/baked-penne"><![CDATA[<p>Similar to the previous recipe, but with different pasta (I used Penne as it was what
was available).</p>

<p>Instead of nice layers it ended up as more of a heap, but there was less burning
than the previous recipe.</p>

<p>Again, better reheated as it softens some of the drier pasta.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Similar to the previous recipe, but with different pasta (I used Penne as it was what was available).]]></summary></entry><entry><title type="html">Ruoto di Vermicelli o Bucatini e Pomodori</title><link href="https://scown.space/pasta-codex/2024/02/24/baked-bucatini" rel="alternate" type="text/html" title="Ruoto di Vermicelli o Bucatini e Pomodori" /><published>2024-02-24T16:22:00+00:00</published><updated>2024-02-24T16:22:00+00:00</updated><id>https://scown.space/pasta-codex/2024/02/24/baked-bucatini</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/02/24/baked-bucatini"><![CDATA[<p>Difficult. The recipe calls for layers of tomato halves and pasta (Bucatini used here).</p>

<p>Make sure the tomatoes are on top as exposed pasta burns in the oven. Arranging this
requires the baking dish to be a very specific size or everything falls apart.</p>

<p>Better reheated, which softens some of the burnt pasta.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Difficult. The recipe calls for layers of tomato halves and pasta (Bucatini used here).]]></summary></entry><entry><title type="html">Zite o Maniche, Rigatoni, con Pomodori al Forno</title><link href="https://scown.space/pasta-codex/2024/02/24/baked-rigatoni-tomatoes" rel="alternate" type="text/html" title="Zite o Maniche, Rigatoni, con Pomodori al Forno" /><published>2024-02-24T16:17:00+00:00</published><updated>2024-02-24T16:17:00+00:00</updated><id>https://scown.space/pasta-codex/2024/02/24/baked-rigatoni-tomatoes</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/02/24/baked-rigatoni-tomatoes"><![CDATA[<p>The title is inaccurate: the tomatoes are baked while the pasta is not.</p>

<p>It’s fine, I guess, but a bit of a faff.</p>

<p>Made here with Rigatoni.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The title is inaccurate: the tomatoes are baked while the pasta is not.]]></summary></entry><entry><title type="html">Pasta (Tutti i Tipi) Fritta</title><link href="https://scown.space/pasta-codex/2024/02/24/fried-pasta" rel="alternate" type="text/html" title="Pasta (Tutti i Tipi) Fritta" /><published>2024-02-24T16:13:00+00:00</published><updated>2024-02-24T16:13:00+00:00</updated><id>https://scown.space/pasta-codex/2024/02/24/fried-pasta</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/02/24/fried-pasta"><![CDATA[<p>A strange one. Cooked pasta, which is then fried. I shallow fried it, but the recipe
is intended for deep frying, which would probably work better.</p>

<p>As I recall it was crispy and ever so slightly sweet.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[A strange one. Cooked pasta, which is then fried. I shallow fried it, but the recipe is intended for deep frying, which would probably work better.]]></summary></entry><entry><title type="html">Penne o Conchiglie con le Olive Verde</title><link href="https://scown.space/pasta-codex/2024/01/06/penne-green-olives" rel="alternate" type="text/html" title="Penne o Conchiglie con le Olive Verde" /><published>2024-01-06T16:39:00+00:00</published><updated>2024-01-06T16:39:00+00:00</updated><id>https://scown.space/pasta-codex/2024/01/06/penne-green-olives</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/01/06/penne-green-olives"><![CDATA[<p>A thick sauce made with puréed tomatoes and green olives.</p>

<p>The recipe doesn’t specify which vinegar, so I used Balsamic.</p>

<p>A very thick sauce, but quite tasty.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[A thick sauce made with puréed tomatoes and green olives.]]></summary></entry><entry><title type="html">Maccheroncini con Salsa di Olive al Vino</title><link href="https://scown.space/pasta-codex/2024/01/06/olives-in-wine" rel="alternate" type="text/html" title="Maccheroncini con Salsa di Olive al Vino" /><published>2024-01-06T16:35:00+00:00</published><updated>2024-01-06T16:35:00+00:00</updated><id>https://scown.space/pasta-codex/2024/01/06/olives-in-wine</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/01/06/olives-in-wine"><![CDATA[<p>This one’s a bit different. The olives are cooked in white wine before being added to the pasta, topped with tomatoes, and baked in the oven.</p>

<p>A bit of a faff, but it works.</p>

<p>I used Bucatini as Maccheroncini was not available.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[This one’s a bit different. The olives are cooked in white wine before being added to the pasta, topped with tomatoes, and baked in the oven.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli alla Marinara</title><link href="https://scown.space/pasta-codex/2024/01/06/spaghetti-tomato-olives-2" rel="alternate" type="text/html" title="Spaghetti o Vermicelli alla Marinara" /><published>2024-01-06T16:32:00+00:00</published><updated>2024-01-06T16:32:00+00:00</updated><id>https://scown.space/pasta-codex/2024/01/06/spaghetti-tomato-olives-2</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/01/06/spaghetti-tomato-olives-2"><![CDATA[<p>Requires a one hour resting period before cooking. Despite this, very similar to the previous recipe.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Requires a one hour resting period before cooking. Despite this, very similar to the previous recipe.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli con Salsa di Pomodoro e Olive</title><link href="https://scown.space/pasta-codex/2024/01/06/spaghetti-tomato-olives" rel="alternate" type="text/html" title="Spaghetti o Vermicelli con Salsa di Pomodoro e Olive" /><published>2024-01-06T16:27:00+00:00</published><updated>2024-01-06T16:27:00+00:00</updated><id>https://scown.space/pasta-codex/2024/01/06/spaghetti-tomato-olives</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/01/06/spaghetti-tomato-olives"><![CDATA[<p>Pasta in a tomato and olive sauce. This works.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta in a tomato and olive sauce. This works.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli con Salsa di Olio, Aglio e Olive</title><link href="https://scown.space/pasta-codex/2024/01/06/spaghetti-garlic-olives" rel="alternate" type="text/html" title="Spaghetti o Vermicelli con Salsa di Olio, Aglio e Olive" /><published>2024-01-06T16:20:00+00:00</published><updated>2024-01-06T16:20:00+00:00</updated><id>https://scown.space/pasta-codex/2024/01/06/spaghetti-garlic-olives</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/01/06/spaghetti-garlic-olives"><![CDATA[<p>Pasta in a very olivey sauce.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta in a very olivey sauce.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli, Penne, Rigatoni, con Salsa di Olive</title><link href="https://scown.space/pasta-codex/2024/01/06/spaghetti-with-olive-sauce" rel="alternate" type="text/html" title="Spaghetti o Vermicelli, Penne, Rigatoni, con Salsa di Olive" /><published>2024-01-06T16:14:00+00:00</published><updated>2024-01-06T16:14:00+00:00</updated><id>https://scown.space/pasta-codex/2024/01/06/spaghetti-with-olive-sauce</id><content type="html" xml:base="https://scown.space/pasta-codex/2024/01/06/spaghetti-with-olive-sauce"><![CDATA[<p>This one didn’t work. The olives are supposed to be left to macerate for a week, during which time they will produce a sauce. At the end of the week, I had a bowl full of olives and no sauce.</p>

<p>Speculating wildly, the fact that they were tinned olives in brine may have been the issue, in the all the liquid probably went down the sink when I drained the jars.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[This one didn’t work. The olives are supposed to be left to macerate for a week, during which time they will produce a sauce. At the end of the week, I had a bowl full of olives and no sauce.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli con Salsa di Conserva di Pomodoro, Cipolla e Aglio</title><link href="https://scown.space/pasta-codex/2023/10/21/spaghetti-tomato-paste-garlic" rel="alternate" type="text/html" title="Spaghetti o Vermicelli con Salsa di Conserva di Pomodoro, Cipolla e Aglio" /><published>2023-10-21T16:32:00+01:00</published><updated>2023-10-21T16:32:00+01:00</updated><id>https://scown.space/pasta-codex/2023/10/21/spaghetti-tomato-paste-garlic</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/10/21/spaghetti-tomato-paste-garlic"><![CDATA[<p>Onion, celery and garlic, cooked in white wine, with tomato purée. Ends up being low volume because there isn’t that much tomato in it, but it tastes all right. May benefit from a more intensely flavoured white wine.</p>

<p>Once again, if I’m not mistaken, this recipe contained tomato paste.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Onion, celery and garlic, cooked in white wine, with tomato purée. Ends up being low volume because there isn’t that much tomato in it, but it tastes all right. May benefit from a more intensely flavoured white wine.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli alla Rivello</title><link href="https://scown.space/pasta-codex/2023/10/21/spaghetti-tomato-herbs" rel="alternate" type="text/html" title="Spaghetti o Vermicelli alla Rivello" /><published>2023-10-21T16:22:00+01:00</published><updated>2023-10-21T16:22:00+01:00</updated><id>https://scown.space/pasta-codex/2023/10/21/spaghetti-tomato-herbs</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/10/21/spaghetti-tomato-herbs"><![CDATA[<p>A tomato and garlic sauce, with mint, celery leaves and parsley.</p>

<p>I overdid the mint when I tried this.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[A tomato and garlic sauce, with mint, celery leaves and parsley.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli con Salsa di Pomodoro, Aglio e Cipolla</title><link href="https://scown.space/pasta-codex/2023/10/21/spaghetti-tomato-garlic" rel="alternate" type="text/html" title="Spaghetti o Vermicelli con Salsa di Pomodoro, Aglio e Cipolla" /><published>2023-10-21T16:16:00+01:00</published><updated>2023-10-21T16:16:00+01:00</updated><id>https://scown.space/pasta-codex/2023/10/21/spaghetti-tomato-garlic</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/10/21/spaghetti-tomato-garlic"><![CDATA[<p>A tomato and garlic sauce. Not very exciting, but tasty enough.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[A tomato and garlic sauce. Not very exciting, but tasty enough.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli con Salsa di Pomodoro al Brandy</title><link href="https://scown.space/pasta-codex/2023/10/21/spaghetti-tomatoes-brandy" rel="alternate" type="text/html" title="Spaghetti o Vermicelli con Salsa di Pomodoro al Brandy" /><published>2023-10-21T16:14:00+01:00</published><updated>2023-10-21T16:14:00+01:00</updated><id>https://scown.space/pasta-codex/2023/10/21/spaghetti-tomatoes-brandy</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/10/21/spaghetti-tomatoes-brandy"><![CDATA[<p>The brandy gives this a nice silky texture, and adds a subtle flavour.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The brandy gives this a nice silky texture, and adds a subtle flavour.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli, Bucatini, Linguine con Salsa di Pomodoro alla Cipolla – II Ricetta</title><link href="https://scown.space/pasta-codex/2023/09/23/spaghetti-onion-tomatoes-2" rel="alternate" type="text/html" title="Spaghetti o Vermicelli, Bucatini, Linguine con Salsa di Pomodoro alla Cipolla – II Ricetta" /><published>2023-09-23T17:23:00+01:00</published><updated>2023-09-23T17:23:00+01:00</updated><id>https://scown.space/pasta-codex/2023/09/23/spaghetti-onion-tomatoes-2</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/09/23/spaghetti-onion-tomatoes-2"><![CDATA[<p>Onions and tomato paste (which seems to be what we call tomato puree in the UK).</p>

<p>These onions were a bit large, so it’s mostly onion with not much tomato flavor. I also managed to burn some onto my pan. Sigh.</p>

<p>Once again, if I’m not mistaken, this recipe contained tomato paste.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Onions and tomato paste (which seems to be what we call tomato puree in the UK).]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli, Bucatini, Linguine con Salsa di Pomodoro alla Cipolla – I Ricetta</title><link href="https://scown.space/pasta-codex/2023/09/23/spaghetti-onion-tomatoes" rel="alternate" type="text/html" title="Spaghetti o Vermicelli, Bucatini, Linguine con Salsa di Pomodoro alla Cipolla – I Ricetta" /><published>2023-09-23T17:19:00+01:00</published><updated>2023-09-23T17:19:00+01:00</updated><id>https://scown.space/pasta-codex/2023/09/23/spaghetti-onion-tomatoes</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/09/23/spaghetti-onion-tomatoes"><![CDATA[<p>The last variant of Recipe 19, which adds onions, celery, and basil.</p>

<p>Much more body that the others. This works.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The last variant of Recipe 19, which adds onions, celery, and basil.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli, Bucatini, Linguine con Salsa alla Capodimonte</title><link href="https://scown.space/pasta-codex/2023/09/23/spaghetti-capodimonte" rel="alternate" type="text/html" title="Spaghetti o Vermicelli, Bucatini, Linguine con Salsa alla Capodimonte" /><published>2023-09-23T17:16:00+01:00</published><updated>2023-09-23T17:16:00+01:00</updated><id>https://scown.space/pasta-codex/2023/09/23/spaghetti-capodimonte</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/09/23/spaghetti-capodimonte"><![CDATA[<p>Yet another variant of recipe 19, with parsley and vegetable stock.</p>

<p>Adds a subtle flavour to the dish.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Yet another variant of recipe 19, with parsley and vegetable stock.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli, Bucatini, Linguine, con Salsa di Pomodoro all’Aglio e Pangrattato</title><link href="https://scown.space/pasta-codex/2023/09/23/spaghetti-garlic-breadcrumbs" rel="alternate" type="text/html" title="Spaghetti o Vermicelli, Bucatini, Linguine, con Salsa di Pomodoro all’Aglio e Pangrattato" /><published>2023-09-23T17:11:00+01:00</published><updated>2023-09-23T17:11:00+01:00</updated><id>https://scown.space/pasta-codex/2023/09/23/spaghetti-garlic-breadcrumbs</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/09/23/spaghetti-garlic-breadcrumbs"><![CDATA[<p>Another variant of recipe 19, but with breadcrumbs.</p>

<p>An odd one. The breadcrumbs absorb all the moisture from the tomatoes, so the quantity of sauce produced is really small. Not that great.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Another variant of recipe 19, but with breadcrumbs.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli, Bucatini, Linguine, con Salsa di Pomodoro all’Aglio e Peperoncino</title><link href="https://scown.space/pasta-codex/2023/09/23/spaghetti-garlic-tomato-chilli" rel="alternate" type="text/html" title="Spaghetti o Vermicelli, Bucatini, Linguine, con Salsa di Pomodoro all’Aglio e Peperoncino" /><published>2023-09-23T17:07:00+01:00</published><updated>2023-09-23T17:07:00+01:00</updated><id>https://scown.space/pasta-codex/2023/09/23/spaghetti-garlic-tomato-chilli</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/09/23/spaghetti-garlic-tomato-chilli"><![CDATA[<p>Another variant of recipe 19, but with garlic and chilli.</p>

<p>Quite spicy, at least the way I did it.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Another variant of recipe 19, but with garlic and chilli.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli, Bucatini, Linguine, con Salsa di Pomodoro all’Aglio</title><link href="https://scown.space/pasta-codex/2023/09/23/spaghetti-garlic-tomato" rel="alternate" type="text/html" title="Spaghetti o Vermicelli, Bucatini, Linguine, con Salsa di Pomodoro all’Aglio" /><published>2023-09-23T17:00:00+01:00</published><updated>2023-09-23T17:00:00+01:00</updated><id>https://scown.space/pasta-codex/2023/09/23/spaghetti-garlic-tomato</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/09/23/spaghetti-garlic-tomato"><![CDATA[<p>Another variant of recipe 19, but with garlic.</p>

<p>Tastes much as you’d expect.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Another variant of recipe 19, but with garlic.]]></summary></entry><entry><title type="html">Spaghetti alla Pizzaiola</title><link href="https://scown.space/pasta-codex/2023/07/29/spaghetti-tomato-garlic" rel="alternate" type="text/html" title="Spaghetti alla Pizzaiola" /><published>2023-07-29T15:39:00+01:00</published><updated>2023-07-29T15:39:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/29/spaghetti-tomato-garlic</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/29/spaghetti-tomato-garlic"><![CDATA[<p>The first of a run of tomato and garlic recipes.</p>

<p>Not sure I’m a fan of the capers.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The first of a run of tomato and garlic recipes.]]></summary></entry><entry><title type="html">Ciriole (Stringozzi) alla Ternana</title><link href="https://scown.space/pasta-codex/2023/07/29/ciriole" rel="alternate" type="text/html" title="Ciriole (Stringozzi) alla Ternana" /><published>2023-07-29T15:34:00+01:00</published><updated>2023-07-29T15:34:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/29/ciriole</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/29/ciriole"><![CDATA[<p>The first recipe which involves making your own pasta. A flour and water pasta (eggs are not introduced until Chapter 3). Surprisingly OK.</p>

<p>The portion here looks small because I used half as much flour as was required.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The first recipe which involves making your own pasta. A flour and water pasta (eggs are not introduced until Chapter 3). Surprisingly OK.]]></summary></entry><entry><title type="html">Spaghetti all’Alloro</title><link href="https://scown.space/pasta-codex/2023/07/29/spaghetti-bay-leaves" rel="alternate" type="text/html" title="Spaghetti all’Alloro" /><published>2023-07-29T15:30:00+01:00</published><updated>2023-07-29T15:30:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/29/spaghetti-bay-leaves</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/29/spaghetti-bay-leaves"><![CDATA[<p>Tomato sauce with onion and bay leaf.</p>

<p>Pictured here with rather more sauce than makes sense for one portion.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Tomato sauce with onion and bay leaf.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli, Bucatini, Linguine con Salsa di Pomodoro e Peperoncino</title><link href="https://scown.space/pasta-codex/2023/07/29/spaghetti-tomato-chilli" rel="alternate" type="text/html" title="Spaghetti o Vermicelli, Bucatini, Linguine con Salsa di Pomodoro e Peperoncino" /><published>2023-07-29T15:29:00+01:00</published><updated>2023-07-29T15:29:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/29/spaghetti-tomato-chilli</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/29/spaghetti-tomato-chilli"><![CDATA[<p>The same again, but a chilli is added to the sauce during the cooking process.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The same again, but a chilli is added to the sauce during the cooking process.]]></summary></entry><entry><title type="html">Spaghetti, Vermicelli, Bucatini, Linguine con Salsa di Pomodoro al Tino</title><link href="https://scown.space/pasta-codex/2023/07/29/spaghetti-tomato-thyme" rel="alternate" type="text/html" title="Spaghetti, Vermicelli, Bucatini, Linguine con Salsa di Pomodoro al Tino" /><published>2023-07-29T15:24:00+01:00</published><updated>2023-07-29T15:24:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/29/spaghetti-tomato-thyme</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/29/spaghetti-tomato-thyme"><![CDATA[<p>The same as the previous recipe, but with thyme instead of basil. This gives it a more unusual flavour.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The same as the previous recipe, but with thyme instead of basil. This gives it a more unusual flavour.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli, Bucatini, Linguine con Salsa di Pomodoro al Basilico</title><link href="https://scown.space/pasta-codex/2023/07/29/spaghetti-tomato-basil" rel="alternate" type="text/html" title="Spaghetti o Vermicelli, Bucatini, Linguine con Salsa di Pomodoro al Basilico" /><published>2023-07-29T15:19:00+01:00</published><updated>2023-07-29T15:19:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/29/spaghetti-tomato-basil</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/29/spaghetti-tomato-basil"><![CDATA[<p>The first recipe resembling what I’d have called a pasta sauce. Quite tasty.</p>

<p>An important base recipe for later. Made here with tinned tomatoes.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The first recipe resembling what I’d have called a pasta sauce. Quite tasty.]]></summary></entry><entry><title type="html">Vermicelli al Pomodorini d’Inverno</title><link href="https://scown.space/pasta-codex/2023/07/29/winter-tomatoes" rel="alternate" type="text/html" title="Vermicelli al Pomodorini d’Inverno" /><published>2023-07-29T15:13:00+01:00</published><updated>2023-07-29T15:13:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/29/winter-tomatoes</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/29/winter-tomatoes"><![CDATA[<p>Made here with ordinary cherry tomatoes rather than winter tomatoes as described. Possibly not quite as flavoursome as required.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Made here with ordinary cherry tomatoes rather than winter tomatoes as described. Possibly not quite as flavoursome as required.]]></summary></entry><entry><title type="html">Vermicelli o Bucatini alla Sorrentina</title><link href="https://scown.space/pasta-codex/2023/07/29/sorrento-style-bucatini" rel="alternate" type="text/html" title="Vermicelli o Bucatini alla Sorrentina" /><published>2023-07-29T15:08:00+01:00</published><updated>2023-07-29T15:08:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/29/sorrento-style-bucatini</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/29/sorrento-style-bucatini"><![CDATA[<p>Pasta half-cooked before the tomatoes are added. The trick is not to undercook the pasta too much, otherwise it will be overly al dente. Made here with spaghetti.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta half-cooked before the tomatoes are added. The trick is not to undercook the pasta too much, otherwise it will be overly al dente. Made here with spaghetti.]]></summary></entry><entry><title type="html">Vermicello o Spaghetti “Al Due” e “Al Tre”</title><link href="https://scown.space/pasta-codex/2023/07/29/spaghetti-neapolitan-style" rel="alternate" type="text/html" title="Vermicello o Spaghetti “Al Due” e “Al Tre”" /><published>2023-07-29T15:05:00+01:00</published><updated>2023-07-29T15:05:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/29/spaghetti-neapolitan-style</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/29/spaghetti-neapolitan-style"><![CDATA[<p>Tomatoes cooked in their own juices. This is the first recipe using cooked tomatoes.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Tomatoes cooked in their own juices. This is the first recipe using cooked tomatoes.]]></summary></entry><entry><title type="html">Pasta, Olio e Cipolla</title><link href="https://scown.space/pasta-codex/2023/07/22/pasta-onion" rel="alternate" type="text/html" title="Pasta, Olio e Cipolla" /><published>2023-07-22T15:39:00+01:00</published><updated>2023-07-22T15:39:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/22/pasta-onion</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/22/pasta-onion"><![CDATA[<p>Spaghetti with fried onions. Very strong onion flavour.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Spaghetti with fried onions. Very strong onion flavour.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli con la Mollica</title><link href="https://scown.space/pasta-codex/2023/07/22/spaghetti-breadcrumbs" rel="alternate" type="text/html" title="Spaghetti o Vermicelli con la Mollica" /><published>2023-07-22T15:36:00+01:00</published><updated>2023-07-22T15:36:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/22/spaghetti-breadcrumbs</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/22/spaghetti-breadcrumbs"><![CDATA[<p>Spaghetti with fried breadcrumbs. Unfortunately I forgot to season the breadcrumbs, which left the dish tasting quite bland.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Spaghetti with fried breadcrumbs. Unfortunately I forgot to season the breadcrumbs, which left the dish tasting quite bland.]]></summary></entry><entry><title type="html">Pasta con I Peperoni Secchi</title><link href="https://scown.space/pasta-codex/2023/07/22/pasta-sundried-peppers" rel="alternate" type="text/html" title="Pasta con I Peperoni Secchi" /><published>2023-07-22T15:34:00+01:00</published><updated>2023-07-22T15:34:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/22/pasta-sundried-peppers</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/22/pasta-sundried-peppers"><![CDATA[<p>The recipe calls for sundried sweet peppers, which are either unavailable in the UK, or called something else.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[The recipe calls for sundried sweet peppers, which are either unavailable in the UK, or called something else.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli o Trenette Aglio, Olio e Peperoncino</title><link href="https://scown.space/pasta-codex/2023/07/22/spaghetti-garlic-oil-pepper" rel="alternate" type="text/html" title="Spaghetti o Vermicelli o Trenette Aglio, Olio e Peperoncino" /><published>2023-07-22T15:31:00+01:00</published><updated>2023-07-22T15:31:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/22/spaghetti-garlic-oil-pepper</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/22/spaghetti-garlic-oil-pepper"><![CDATA[<p>Similar to the previous recipe, but with chilli.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Similar to the previous recipe, but with chilli.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli Aglio e Olio</title><link href="https://scown.space/pasta-codex/2023/07/22/spaghetti-garlic-oil" rel="alternate" type="text/html" title="Spaghetti o Vermicelli Aglio e Olio" /><published>2023-07-22T15:27:00+01:00</published><updated>2023-07-22T15:27:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/22/spaghetti-garlic-oil</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/22/spaghetti-garlic-oil"><![CDATA[<p>Spaghetti with fried garlic and parsley. Very garlicky.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Spaghetti with fried garlic and parsley. Very garlicky.]]></summary></entry><entry><title type="html">Spaghettini al Pesto del Sud</title><link href="https://scown.space/pasta-codex/2023/07/22/spaghettini-with-garlic-tomato" rel="alternate" type="text/html" title="Spaghettini al Pesto del Sud" /><published>2023-07-22T15:24:00+01:00</published><updated>2023-07-22T15:24:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/22/spaghettini-with-garlic-tomato</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/22/spaghettini-with-garlic-tomato"><![CDATA[<p>Tomato, herb, and chilli marinated for four hours. Made here with spaghetti.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Tomato, herb, and chilli marinated for four hours. Made here with spaghetti.]]></summary></entry><entry><title type="html">Spaghetti con Salsa a Crudo, alla Alberini</title><link href="https://scown.space/pasta-codex/2023/07/22/spaghetti-uncooked-blender" rel="alternate" type="text/html" title="Spaghetti con Salsa a Crudo, alla Alberini" /><published>2023-07-22T15:20:00+01:00</published><updated>2023-07-22T15:20:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/22/spaghetti-uncooked-blender</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/22/spaghetti-uncooked-blender"><![CDATA[<p>Uncooked tomato sauce run through a blender. Very light.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Uncooked tomato sauce run through a blender. Very light.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli con Salsa a Crudo – III Ricetta</title><link href="https://scown.space/pasta-codex/2023/07/22/spaghetti-uncooked-3" rel="alternate" type="text/html" title="Spaghetti o Vermicelli con Salsa a Crudo – III Ricetta" /><published>2023-07-22T15:10:00+01:00</published><updated>2023-07-22T15:10:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/22/spaghetti-uncooked-3</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/22/spaghetti-uncooked-3"><![CDATA[<p>Uncooked tomato sauce marinated overnight. The spring onions give it an interesting flavour.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Uncooked tomato sauce marinated overnight. The spring onions give it an interesting flavour.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli con Salsa a Crudo – II Ricetta</title><link href="https://scown.space/pasta-codex/2023/07/22/spaghetti-uncooked-2" rel="alternate" type="text/html" title="Spaghetti o Vermicelli con Salsa a Crudo – II Ricetta" /><published>2023-07-22T15:00:00+01:00</published><updated>2023-07-22T15:00:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/22/spaghetti-uncooked-2</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/22/spaghetti-uncooked-2"><![CDATA[<p>Uncooked tomato sauce marinated for two hours. Very similar to the previous recipe, but with olives and chilli.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Uncooked tomato sauce marinated for two hours. Very similar to the previous recipe, but with olives and chilli.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli con Salsa a Crudo – I Ricetta</title><link href="https://scown.space/pasta-codex/2023/07/22/spaghetti-uncooked-1" rel="alternate" type="text/html" title="Spaghetti o Vermicelli con Salsa a Crudo – I Ricetta" /><published>2023-07-22T14:51:00+01:00</published><updated>2023-07-22T14:51:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/22/spaghetti-uncooked-1</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/22/spaghetti-uncooked-1"><![CDATA[<p>Uncooked tomato sauce marinated for two hours.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Uncooked tomato sauce marinated for two hours.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli, Olio, Limone e Pomodoro, a Crudo</title><link href="https://scown.space/pasta-codex/2023/07/22/spaghetti-with-tomato-and-lemon" rel="alternate" type="text/html" title="Spaghetti o Vermicelli, Olio, Limone e Pomodoro, a Crudo" /><published>2023-07-22T14:42:00+01:00</published><updated>2023-07-22T14:42:00+01:00</updated><id>https://scown.space/pasta-codex/2023/07/22/spaghetti-with-tomato-and-lemon</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/07/22/spaghetti-with-tomato-and-lemon"><![CDATA[<p>Spaghetti with uncooked tomatoes and lemon juice. The recipe calls for a fruity olive oil, but the one I had to hand was not.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Spaghetti with uncooked tomatoes and lemon juice. The recipe calls for a fruity olive oil, but the one I had to hand was not.]]></summary></entry><entry><title type="html">Spaghetti dell’Orto Ligure</title><link href="https://scown.space/pasta-codex/2023/05/13/spaghetti-with-herbs" rel="alternate" type="text/html" title="Spaghetti dell’Orto Ligure" /><published>2023-05-13T15:10:00+01:00</published><updated>2023-05-13T15:10:00+01:00</updated><id>https://scown.space/pasta-codex/2023/05/13/spaghetti-with-herbs</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/05/13/spaghetti-with-herbs"><![CDATA[<p>Omitted due to missing ingredients. Fresh savory and marjoram were not available. Since the recipe relies on the herbs for its “perfectly balanced flavour”, it was not worth attempting.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Omitted due to missing ingredients. Fresh savory and marjoram were not available. Since the recipe relies on the herbs for its “perfectly balanced flavour”, it was not worth attempting.]]></summary></entry><entry><title type="html">Conchigliette o Lumachine, Olio e Limone</title><link href="https://scown.space/pasta-codex/2023/05/13/conchigliette-oil-lemon" rel="alternate" type="text/html" title="Conchigliette o Lumachine, Olio e Limone" /><published>2023-05-13T15:05:00+01:00</published><updated>2023-05-13T15:05:00+01:00</updated><id>https://scown.space/pasta-codex/2023/05/13/conchigliette-oil-lemon</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/05/13/conchigliette-oil-lemon"><![CDATA[<p>Pasta with olive oil, lemon juice, and spring onion.</p>

<p>Pictured here with fusilli. The onion flavour is quite strong.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with olive oil, lemon juice, and spring onion.]]></summary></entry><entry><title type="html">Conchigliette o Lumachine in Insalata</title><link href="https://scown.space/pasta-codex/2023/05/13/conchigliette-pasta-salad" rel="alternate" type="text/html" title="Conchigliette o Lumachine in Insalata" /><published>2023-05-13T15:00:00+01:00</published><updated>2023-05-13T15:00:00+01:00</updated><id>https://scown.space/pasta-codex/2023/05/13/conchigliette-pasta-salad</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/05/13/conchigliette-pasta-salad"><![CDATA[<p>Pasta with olive, peppers and vinegar, served cold.</p>

<p>Pictured here with spaghetti (which is probably not an improvement). Not sure balsamic was the best choice of vinegar either.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Pasta with olive, peppers and vinegar, served cold.]]></summary></entry><entry><title type="html">Spaghetti o Vermicelli Aglio e Olio, a Crudo</title><link href="https://scown.space/pasta-codex/2023/05/08/spaghetti-with-garlic-and-oil" rel="alternate" type="text/html" title="Spaghetti o Vermicelli Aglio e Olio, a Crudo" /><published>2023-05-08T19:07:00+01:00</published><updated>2023-05-08T19:07:00+01:00</updated><id>https://scown.space/pasta-codex/2023/05/08/spaghetti-with-garlic-and-oil</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/05/08/spaghetti-with-garlic-and-oil"><![CDATA[<p>Cooked spaghetti tossed with garlic and olive oil (the recipe calls for a green, fruity variety, but I didn’t have one to hand).</p>

<p>Very garlicky.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[Cooked spaghetti tossed with garlic and olive oil (the recipe calls for a green, fruity variety, but I didn’t have one to hand).]]></summary></entry><entry><title type="html">Pasta Codex Introduction</title><link href="https://scown.space/pasta-codex/2023/05/08/pasta-codex-introduction" rel="alternate" type="text/html" title="Pasta Codex Introduction" /><published>2023-05-08T16:40:00+01:00</published><updated>2023-05-08T16:40:00+01:00</updated><id>https://scown.space/pasta-codex/2023/05/08/pasta-codex-introduction</id><content type="html" xml:base="https://scown.space/pasta-codex/2023/05/08/pasta-codex-introduction"><![CDATA[<p>I recently received a copy of <a href="https://www.rizzoliusa.com/book/9780847868742/"> Vincenzo Buonassisi’s Pasta Codex</a>. This category will attempt to document most
of those recipes.</p>

<p>This may take some time.</p>

<p>Some recipes will not be attempted, either because the ingredients are unobtainable
(I have no idea where I would buy camel) or because the recipe does not appeal (contains brain).</p>

<p>Some recipes may be scaled down. For some recipes I may use a different type of pasta to the recommended one.</p>

<p>Photos are taken by me. They may have <em><a href="https://theguardian.com">The Guardian</a></em> or <em>Private Eye</em> in the background.</p>]]></content><author><name>Alex Scown</name></author><category term="pasta-codex" /><summary type="html"><![CDATA[I recently received a copy of Vincenzo Buonassisi’s Pasta Codex. This category will attempt to document most of those recipes.]]></summary></entry><entry><title type="html">Bit Rot</title><link href="https://scown.space/meta/2023/01/19/bit-rot" rel="alternate" type="text/html" title="Bit Rot" /><published>2023-01-19T18:00:00+00:00</published><updated>2023-01-19T18:00:00+00:00</updated><id>https://scown.space/meta/2023/01/19/bit-rot</id><content type="html" xml:base="https://scown.space/meta/2023/01/19/bit-rot"><![CDATA[<p>It’s been a while.</p>

<p>After nearly 4 years I figured it was time to remove the email address from the site – all it did was attract a small quantity of spam.</p>

<p>The change was simple enough, but then it was time to rebuild the site.</p>

<p>Unfortunately my setup had suffered from bit rot (second definition) due to lack of use.</p>

<p>The first issue was the removal of the system Ruby in a previous version of macOS. I used <a href="https://rvm.io">RVM</a> to install Ruby 2.6 (which had to be built from source, but thankfully this was successful).</p>

<p>Attempted to build the site again:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ jekyll build
Could not find proper version of jekyll (3.7.0) in any of the sources
Run `bundle install` to install missing gems.
</code></pre></div></div>

<p>Sigh.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ bundle install
The dependency tzinfo-data (&gt;= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/.........
Fetching public_suffix 3.0.1
Installing public_suffix 3.0.1
Fetching addressable 2.5.2
Installing addressable 2.5.2
Using bundler 1.17.3
Using colorator 1.1.0
Fetching concurrent-ruby 1.0.5
Installing concurrent-ruby 1.0.5
Fetching eventmachine 1.2.5
Installing eventmachine 1.2.5 with native extensions
Fetching http_parser.rb 0.6.0
Installing http_parser.rb 0.6.0 with native extensions
Fetching em-websocket 0.5.1
Installing em-websocket 0.5.1
Fetching ffi 1.9.18
Installing ffi 1.9.18 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
</code></pre></div></div>

<p>Grrr.</p>

<p>At this point I decided the solution was probably to upgrade Jekyll. With hindsight that was probably not the correct answer, but never mind – it was an easy upgrade.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ bundle update
The dependency tzinfo-data (&gt;= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/..........
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Bundler could not find compatible versions for gem "jekyll":
  In Gemfile:
    jekyll (~&gt; 4.3.1)

    jekyll-feed (~&gt; 0.6) was resolved to 0.17.0, which depends on
      jekyll (&gt;= 3.7, &lt; 5.0)

    jekyll-font-awesome-sass was resolved to 0.1.1, which depends on
      jekyll (&gt;= 2.5, &lt; 4.0)`
</code></pre></div></div>

<p>I had a dependency that didn’t work with Jekyll 4. Whether it actually didn’t work or was just conservative in what it claimed to work with, I don’t know.</p>

<p>jekyll-font-awesome-sass hasn’t been updated in some time and appears to no longer be supported. Thankfully all it did was provide Fontawesome, so the easiest solution was simply to vendor it into the project instead. This necessitated upgrading to Fontawesome 5, as Fontawesome 4 was no longer available for download. There were a few small fixes to make, but nothing too arduous.</p>

<p>At this point I could install the toolchain and build the site again.</p>

<p>The next problem: I was using a tool called <a href="https://github.com/laurilehmijoki/s3_website">s3_website</a> to upload the site to S3 and invalidate the Cloudfront distribution. Unfortunately it only works on Java 8, and is no longer actively maintained.</p>

<p>In the end, it was easy to replace with a two line shell script. An <code class="language-plaintext highlighter-rouge">aws s3 sync</code> command to upload the files, and a command to invalidate the distribution. I’m sure s3_website must have done other things, but it’s not clear what they were and right now, I don’t care.</p>

<p>The most important part is that I can update the site again (can does not necessarily imply will).</p>

<p>I’m sure there’s a moral to this story.</p>]]></content><author><name>Alex Scown</name></author><category term="meta" /><summary type="html"><![CDATA[It’s been a while.]]></summary></entry><entry><title type="html">Configuring Cloudfront for use with S3</title><link href="https://scown.space/meta/2019/04/07/configuring-cloudfront-for-use-with-s3" rel="alternate" type="text/html" title="Configuring Cloudfront for use with S3" /><published>2019-04-07T17:06:00+01:00</published><updated>2019-04-07T17:06:00+01:00</updated><id>https://scown.space/meta/2019/04/07/configuring-cloudfront-for-use-with-s3</id><content type="html" xml:base="https://scown.space/meta/2019/04/07/configuring-cloudfront-for-use-with-s3"><![CDATA[<p>Recently I spend some time setting preparing the ground for scown.dev (coming soon to an Internet near you). While I was at the <del>[<em>T-437 Safety Command</em>]</del> AWS console I realised that the scown.space Cloudfront Distibution was set up in a sub-optimal fashion, allowing direct read access to the underlying bucket. Having spent some time getting a better approach working, I thought I’d document it here.</p>

<h2 id="prior-configuration">Prior Configuration</h2>

<p>Previously the scown.space setup consisted of:</p>

<ul>
  <li>An S3 bucket with static website hosting enabled and public read-only access to all objects in the bucket</li>
  <li>A Cloudfront Distribution in front of the S3 bucket using a website origin</li>
  <li>A Lambda@Edge function to allow the HTML files in the bucket to be accessed without specifying their file extension</li>
</ul>

<p>This worked, but also allowed access to the site using S3 URLs. While this was not really an issue (everything in the bucket is accessible via the Cloudfront Distibution), it was also not quite what I was after.</p>

<h2 id="accessing-s3-buckets-using-cloudfront-origin-identities">Accessing S3 Buckets using Cloudfront Origin Identities</h2>

<p>While setting up the scown.dev Cloudfront Distribution I spotted a setting I didn’t remember seeing before: Restrict Bucket Access. Essentially this locks down the S3 bucket and requires clients to access the objects using a Cloudfront Origin Identity. This was exactly what I was after.</p>

<p>Eager to try this out I went back to the scown.space distribution and configured the same settings. Unfortunately it wasn’t quite that straightforward - turning off the static website hosting resulted in some nasty looking XML and 403 errors. Fun times.</p>

<p>After some experimentation turning various permissions on and off, it transpired that there was a step I had missed.</p>

<p>In addition to adding a policy granting the Origin Identity access to the bucket objects, I also needed to add an ACL granting the Origin Identity permission to list objects in the bucket.</p>

<p>This got me most of the way there, but there was still an issue accessing the homepage.</p>

<h2 id="index-document-handling">Index document handling</h2>

<p>S3 buckets configured for static website hosting specify an index document, which I was relying on for serving the main page. Accessing it presented me with some different XML and 404 errors. Sigh.</p>

<p>This turned out to be an issue with my Lambda function. I had unconciously set the Lambda up to rely on the index document property of the bucket. Thankfully the Lambda is so trivial that this was easy to fix.</p>

<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="dl">'</span><span class="s1">use strict</span><span class="dl">'</span><span class="p">;</span>

<span class="nx">exports</span><span class="p">.</span><span class="nx">handler</span> <span class="o">=</span> <span class="p">(</span><span class="nx">event</span><span class="p">,</span> <span class="nx">context</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">request</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">Records</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">cf</span><span class="p">.</span><span class="nx">request</span><span class="p">;</span>

    <span class="kd">let</span> <span class="nx">uri</span> <span class="o">=</span> <span class="nx">request</span><span class="p">.</span><span class="nx">uri</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="nx">uri</span> <span class="o">===</span> <span class="dl">''</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">uri</span> <span class="o">=</span> <span class="nx">request</span><span class="p">.</span><span class="nx">uri</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">/index.html</span><span class="dl">'</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">uri</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/</span><span class="se">\/</span><span class="sr">$/</span><span class="p">))</span> <span class="p">{</span>
        <span class="nx">uri</span> <span class="o">=</span> <span class="nx">request</span><span class="p">.</span><span class="nx">uri</span> <span class="o">+=</span> <span class="dl">'</span><span class="s1">index.html</span><span class="dl">'</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kd">const</span> <span class="nx">extension</span> <span class="o">=</span> <span class="nx">uri</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/</span><span class="se">\.[^</span><span class="sr">.</span><span class="se">\/]</span><span class="sr">+$/</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="nx">extension</span> <span class="o">===</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">request</span><span class="p">.</span><span class="nx">uri</span> <span class="o">+=</span> <span class="dl">'</span><span class="s1">.html</span><span class="dl">'</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">request</span><span class="p">);</span>
<span class="p">};</span></code></pre></figure>

<h2 id="conclusion">Conclusion</h2>

<p>At this point I was able to access scown.space in full without a public bucket. Result.</p>]]></content><author><name>Alex Scown</name></author><category term="meta" /><summary type="html"><![CDATA[Recently I spend some time setting preparing the ground for scown.dev (coming soon to an Internet near you). While I was at the [T-437 Safety Command] AWS console I realised that the scown.space Cloudfront Distibution was set up in a sub-optimal fashion, allowing direct read access to the underlying bucket. Having spent some time getting a better approach working, I thought I’d document it here.]]></summary></entry><entry><title type="html">Writing a CHIP-8 emulator in Swift - Part 2</title><link href="https://scown.space/programming/2018/12/25/writing-a-chip-8-emulator-in-swift-part-2" rel="alternate" type="text/html" title="Writing a CHIP-8 emulator in Swift - Part 2" /><published>2018-12-25T01:25:00+00:00</published><updated>2018-12-25T01:25:00+00:00</updated><id>https://scown.space/programming/2018/12/25/writing-a-chip-8-emulator-in-swift-part-2</id><content type="html" xml:base="https://scown.space/programming/2018/12/25/writing-a-chip-8-emulator-in-swift-part-2"><![CDATA[<p>In <a href="/programming/2018/11/18/writing-a-chip-8-emulator-in-swift">part 1</a> I implemented a CHIP-8 in Swift. In this part I will describe the process of adding a debugger.</p>

<p>The code can be found on Github in repo <a href="#repo-1">[1]</a>.</p>

<h2 id="motivation">Motivation</h2>

<p>Writing an emulator with only print statements to aid me in spotting my mistakes was tedious and error-prone. The logs would have to be combed meticulously and compared with the code in the ROM (which had to be decoded by hand) to work out where the mistakes were.</p>

<p>A debugger would allow me to look at the values in memory in the GUI, and step through the program opcode by opcode.</p>

<h2 id="design-issues">Design issues</h2>

<p>Before building the debugger UI, there were a couple of design issues in the code that needed to be addressed:</p>

<ol>
  <li>Almost all the code was inside the default ViewController class, hindering multiple views backed by the emulator state.</li>
  <li>Everything except rendering the display was done in a background thread. If I wanted to display the emulator state, any updates to the state would need to be done on the main thread.</li>
</ol>

<p>The first step was to fix these issues.</p>

<h3 id="breaking-down-the-code">Breaking down the code</h3>

<p>In the initial design every CHIP-8 memory array was stored directly in the ViewController:</p>

<figure class="highlight"><pre><code class="language-swift" data-lang="swift"><span class="k">var</span> <span class="nv">ram</span> <span class="o">=</span> <span class="p">[</span><span class="kt">UInt8</span><span class="p">]()</span>
<span class="k">var</span> <span class="nv">V</span> <span class="o">=</span> <span class="p">[</span><span class="kt">UInt8</span><span class="p">]()</span>
<span class="k">var</span> <span class="nv">I</span><span class="p">:</span> <span class="kt">UInt16</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">var</span> <span class="nv">delay</span><span class="p">:</span> <span class="kt">UInt8</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">var</span> <span class="nv">sound</span><span class="p">:</span> <span class="kt">UInt8</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">var</span> <span class="nv">PC</span><span class="p">:</span> <span class="kt">UInt16</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">var</span> <span class="nv">SP</span><span class="p">:</span> <span class="kt">Int8</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">var</span> <span class="nv">stack</span> <span class="o">=</span> <span class="p">[</span><span class="kt">UInt16</span><span class="p">]()</span></code></pre></figure>

<p>These were accompanied by the implementation of every single opcode.</p>

<p>The new design looks like this:</p>

<p class="text-center">
<img src="https://scown.space/assets/images/chip8/refactored.svg" alt="Swift8 diagram" />
</p>

<p>The ViewController now has responsibility more in accordance with its status. It powers the user interface, and kicks off the emulator when required. The CPU is responsible for actually running the instructions, and modifying the various regions of memory accordingly, which are now segregated into classes.</p>

<h3 id="threading">Threading</h3>

<p>Swift on macOS benefits from Grand Central Dispatch, which means that resolving the threading issue is relatively straightforward: identify areas which cause UI changes, and make sure they are dispatched to the main thread.</p>

<figure class="highlight"><pre><code class="language-swift" data-lang="swift"><span class="kt">DispatchQueue</span><span class="o">.</span><span class="n">main</span><span class="o">.</span><span class="n">sync</span> <span class="p">{</span>
    <span class="n">registers</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="kt">ByteCell</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">newElm</span><span class="p">)</span>
<span class="p">}</span></code></pre></figure>

<h2 id="showing-the-contents-of-registers">Showing the contents of registers</h2>

<p>To show the contents of the registers I needed a table view with two columns: a register label and the contents of the register itself. The table view would be backed by an <code class="language-plaintext highlighter-rouge">ArrayController</code> which would bridge between the registers array and the table.</p>

<p>At this point I hit a couple of snags:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">UInt8</code> is not a subclass of <code class="language-plaintext highlighter-rouge">NSObject</code>, and so can’t be the source of an <code class="language-plaintext highlighter-rouge">ArrayController</code> binding.</li>
  <li>A <code class="language-plaintext highlighter-rouge">UInt8</code> array provides no binding for the array index.</li>
</ul>

<p>The solution to both these problems was to create <code class="language-plaintext highlighter-rouge">ByteCell</code>, a trivial sublass of <code class="language-plaintext highlighter-rouge">NSObject</code> containing a register index and the value of the register. An array of <code class="language-plaintext highlighter-rouge">ByteCell</code>s would then be wrapped in a class which would allow the rest of the application to ignore this implementational detail.</p>

<p>I then bound the <code class="language-plaintext highlighter-rouge">ArrayController</code> to the array of <code class="language-plaintext highlighter-rouge">ByteCell</code>s and the table view to the <code class="language-plaintext highlighter-rouge">ArrayController</code>, running the index through an <code class="language-plaintext highlighter-rouge">NSFormatter</code> to get a more sensible label.</p>

<p class="text-center">
<img src="https://scown.space/assets/images/screenshots/chip8/chip8-5.png" width="781" height="509" />
</p>

<h2 id="showing-the-contents-of-the-stack">Showing the contents of the stack</h2>

<p>Showing the stack is basically the same as showing the registers (albeit with <code class="language-plaintext highlighter-rouge">UInt16</code>s rather than <code class="language-plaintext highlighter-rouge">UInt8</code>s). The main difference is that it would be nice to highlight the value that is currently at the top of the stack.</p>

<p>Selection is achieved by binding the <code class="language-plaintext highlighter-rouge">selectionIndexes</code> property of a <code class="language-plaintext highlighter-rouge">TableView</code> to an <code class="language-plaintext highlighter-rouge">IndexSet</code>, and adding and removing the value of the <code class="language-plaintext highlighter-rouge">SP</code> register as it changes. An <code class="language-plaintext highlighter-rouge">IndexSet</code> can contain multiple items, but this isn’t a feature that I require here.</p>

<p class="text-center">
<img src="https://scown.space/assets/images/screenshots/chip8/chip8-6.png" width="898" height="509" />
</p>

<h2 id="optimisation">Optimisation</h2>

<p>At this point it was becoming apparent that the debugger was a drag on the performance of the rest of the emulator. It was time to break out the profiler and identify areas to optimise.</p>

<p>The macOS Developer Tools include Instruments for this purpose.</p>

<p class="text-center">
<img src="https://scown.space/assets/images/chip8/profile-1.png" width="698" height="480" />
</p>

<p>By running Swift8 through Instruments and recording the CPU times, it becomes clear that the biggest chunk of time is spent inside Core Animation transactions. Performance here can be improved by creating a separate Core Animation layer for any UI component which is redrawn frequently.</p>

<p>Running the profiler again with these changes shows an approximately 50% speedup in this area, giving improved emulator performance.</p>

<p class="text-center">
<img src="https://scown.space/assets/images/chip8/profile-2.png" width="698" height="480" />
</p>

<h2 id="showing-ram">Showing RAM</h2>

<p>RAM is similar to the registers, but is obviously much larger. As such, it can be represented as an array of <code class="language-plaintext highlighter-rouge">ByteCell</code>s.</p>

<p>However, the RAM stores the code of the currently executing program as well as its data. It would be nice to display any cells containing instructions in their disassembled form for easier debugging. It’s also useful to keep the current instruction in view as the code is executed, which was not an issue for the Stack.</p>

<p>Some cells may contain values which do not correspond to an opcode, in which case no sensible value can be displayed. Other byte pairs may look like instructions, but will never actually be executed. Given that CHIP-8 code may jump arbitrarily, it is not possible to identify these codes up front.</p>

<h3 id="representing-instructions">Representing instructions</h3>

<p>Given that there is no segregation of code and data, any RAM update may potentially be modifying code, and requires the instructions in the corresponding cells to be updated.</p>

<p>CHIP-8 instructions are two bytes long. This means that any single RAM write requires us to compute two instructions:</p>

<ul>
  <li>The instruction starting at the current address</li>
  <li>The instruction starting at the previous addressed</li>
</ul>

<p>If multiple sequential writes are preformed, I can optimise this by only updating the previous instruction until I get to end of the modified address range, before finally updating the last instruction.</p>

<p>This requires a new structure, similar to a <code class="language-plaintext highlighter-rouge">ByteCell</code> but capable of storing an instruction string. However, if I’m going to decode instructions as they are written to RAM, it makes sense to cache this and reuse it when the instruction comes to be executed. Therefore I need to store a mapping from the instruction to the corresponding CPU function.</p>

<p>Putting this together, I wind up with the following:</p>

<figure class="highlight"><pre><code class="language-swift" data-lang="swift"><span class="kd">@objc</span> <span class="kd">protocol</span> <span class="kt">Instruction</span> <span class="p">{</span>
    <span class="k">var</span> <span class="nv">mnemonic</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span>
    <span class="k">var</span> <span class="nv">advance</span><span class="p">:</span> <span class="kt">Bool</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span>
    <span class="k">var</span> <span class="nv">pause</span><span class="p">:</span> <span class="kt">Bool</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span>
    <span class="kd">func</span> <span class="nf">execute</span><span class="p">(</span><span class="nv">onCpu</span><span class="p">:</span> <span class="kt">Cpu</span><span class="p">)</span>
<span class="p">}</span>

<span class="kd">class</span> <span class="kt">RamCell</span><span class="p">:</span> <span class="kt">NSObject</span> <span class="p">{</span>
    <span class="kd">@objc</span> <span class="kd">dynamic</span> <span class="k">let</span> <span class="nv">address</span><span class="p">:</span> <span class="kt">Int</span>
    <span class="kd">@objc</span> <span class="kd">dynamic</span> <span class="k">let</span> <span class="nv">byte</span><span class="p">:</span> <span class="kt">UInt8</span>
    <span class="kd">@objc</span> <span class="kd">dynamic</span> <span class="k">let</span> <span class="nv">instruction</span><span class="p">:</span> <span class="kt">Instruction</span>

    <span class="nf">init</span><span class="p">(</span><span class="n">_</span> <span class="nv">address</span><span class="p">:</span> <span class="kt">Int</span><span class="p">,</span> <span class="n">_</span> <span class="nv">byte</span><span class="p">:</span> <span class="kt">UInt8</span><span class="p">,</span> <span class="n">_</span> <span class="nv">instruction</span><span class="p">:</span> <span class="kt">Instruction</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">self</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">address</span>
        <span class="k">self</span><span class="o">.</span><span class="n">byte</span> <span class="o">=</span> <span class="n">byte</span>
        <span class="k">self</span><span class="o">.</span><span class="n">instruction</span> <span class="o">=</span> <span class="n">instruction</span>
        <span class="k">super</span><span class="o">.</span><span class="nf">init</span><span class="p">()</span>
    <span class="p">}</span>
<span class="p">}</span></code></pre></figure>

<p>I then need an <code class="language-plaintext highlighter-rouge">Instruction</code> implementation for every instruction, whose <code class="language-plaintext highlighter-rouge">mnemonic</code> is the display string and whose <code class="language-plaintext highlighter-rouge">execute</code> method calls the correct method on the CPU.</p>

<p>This changes the CPU’s run loop to simply reading the next instruction from RAM and calling the execute method, passing itself as the <code class="language-plaintext highlighter-rouge">onCpu</code> parameter.</p>

<p class="text-center">
<img src="https://scown.space/assets/images/screenshots/chip8/chip8-8.png" width="1139" height="559" />
</p>

<h2 id="pause-continue-and-step">Pause, Continue and Step</h2>

<p>Any good debugger allows the ability to pause code at arbitrary points. I can implement this with a flag which when set prevents execution of the next instruction. I then need three new UI controls:</p>

<dl>
  <dt>Pause</dt>
  <dd>Set the pause flag</dd>
  <dt>Continue</dt>
  <dd>Clear the pause flag, and execute the next instruction</dd>
  <dt>Step</dt>
  <dd>Execute the next instruction, but do not clear the pause flag</dd>
</dl>

<p>It should only be possible to pause the emulator if the program is running, and it should only be possible to step and continue if the program is paused.</p>

<p>By adding some synthetic properties to the view controller based on the flags, this is straightforward to implement.</p>

<p class="text-center">
<img src="https://scown.space/assets/images/screenshots/chip8/chip8-9.png" width="1139" height="559" />
</p>

<h2 id="breakpoints">Breakpoints</h2>

<p>A logical extension of the pause and resume functionality is the ability to set breakpoints - being able to determine ahead of time where to pause without needing cat-like reflexes to pause at the correct point.</p>

<p>This can be implemented by adding a checkbox column to the RAM table in the UI, and adding a boolean breakpoint property to each instruction which binds to the value of the checkbox.</p>

<p>All we need to do then is to check the value of the instructions breakpoint property before it is executed, and setting the pause flag as necessary. The step and continue buttons can then be used to navigate, and it all just works.</p>

<p class="text-center">
<img src="https://scown.space/assets/images/screenshots/chip8/chip8-10.png" width="1166" height="559" />
</p>

<h2 id="removing-the-performance-overhead">Removing the performance overhead</h2>

<p>Despite the optimisations made above, the debugger still acts as a drag on performance. Even if the debugger remains unused, the views still get rendered and all that scrolling doesn’t come cheap.</p>

<p>The solution to this is to offload the debugger to a separate window, which can be opened or closed as desired.</p>

<p>This requires the creation of a separate view controller, which handles the debugger related functionality, and rearranging the Storyboard accordingly.</p>

<p class="text-center">
<img src="https://scown.space/assets/images/screenshots/chip8/chip8-11a.png" width="664" height="483" />
<img src="https://scown.space/assets/images/screenshots/chip8/chip8-11b.png" width="647" height="558" />
</p>

<h2 id="conclusion">Conclusion</h2>

<p>At this point the debugger – and the emulator itself – are now complete. This provides a good foundation for the construction of a more sophisticated emulator.</p>]]></content><author><name>Alex Scown</name></author><category term="programming" /><summary type="html"><![CDATA[In part 1 I implemented a CHIP-8 in Swift. In this part I will describe the process of adding a debugger.]]></summary></entry><entry><title type="html">Writing a CHIP-8 emulator in Swift - Part 1</title><link href="https://scown.space/programming/2018/11/18/writing-a-chip-8-emulator-in-swift" rel="alternate" type="text/html" title="Writing a CHIP-8 emulator in Swift - Part 1" /><published>2018-11-18T17:58:00+00:00</published><updated>2018-11-18T17:58:00+00:00</updated><id>https://scown.space/programming/2018/11/18/writing-a-chip-8-emulator-in-swift</id><content type="html" xml:base="https://scown.space/programming/2018/11/18/writing-a-chip-8-emulator-in-swift"><![CDATA[<p>Inspired by Tomek Rękawek’s post on writing a GameBoy emulator (<a href="https://blog.rekawek.eu/2017/02/09/coffee-gb/">https://blog.rekawek.eu/2017/02/09/coffee-gb/</a>), I decided it sounded like a fun project. After some digging, I realised that as a precursor, it would be better to get my feet wet by writing a CHIP-8 emulator. I also decided this would be a good excuse to learn some Swift. Digging around, I found <a href="http://devernay.free.fr/hacks/chip8/C8TECH10.HTM">Cowgod’s technical reference</a>, which describes how to implement it.</p>

<p>The code can be found on Github in repo <a href="#repo-1">[1]</a>.</p>

<h2 id="why-swift">Why Swift?</h2>

<p>Ordinarily (given a free choice), I would write my code in Scala. However, Scala is not a good choice for this project. As a JVM language, it lacks unsigned numeric types, which are integral to the design of CHIP-8. Furthermore, my recollection of the native JDK graphics libraries was that they were not great, and using a higher level library felt like it would be a cheat.</p>

<p>It was also a good excuse to learn a new language with a non-trivial project.</p>

<h2 id="getting-started">Getting Started</h2>

<p>Having created a new XCode project, I decided a good first step would be to implement the drawing code, so that there was something I could see.</p>

<p>CHIP-8 has a monochrome 64×32 pixel display. Rendering is performed by drawing a sprite, which is represented as up to 5 bytes. Each byte represents a row of 8 pixels, which each bit corresponding to one of two colours. Sprites are XORd with the existing display to produce an updated image. If drawing would overflow the screen, it wraps around (this is not quite true, as we shall see below).</p>

<p>The screen can be represented as a 2-dimensional array with dimensions 64×32. I then created a custom view in Swift by subclassing NSView, which would draw a square for each pixel. A <code class="language-plaintext highlighter-rouge">true</code> would correspond to a black pixel while a <code class="language-plaintext highlighter-rouge">false</code> would correspond to white. As a test, I hardcoded a simple Sprite and set it to display.</p>

<p class="text-center">
<img src="https://scown.space/assets/images/screenshots/chip8/chip8-1.png" width="664" height="453" />
</p>

<p>CHIP-8 has a number of built in sprites, corresponding to the 16 hex digits. As a next test, I rendered all of these sprites and made sure some of them wrapped around.</p>

<p class="text-center">
<img src="https://scown.space/assets/images/screenshots/chip8/chip8-2.png" width="664" height="453" />
</p>

<p>There’s a mistake here which was corrected later on.</p>

<h2 id="implementing-sound">Implementing sound</h2>

<p>CHIP-8 is only capable of playing a single tone. I elected to cheat a bit here, and generate a 440Hz wav file, suitable for looping. The <code class="language-plaintext highlighter-rouge">AVAudioPlayer</code> class can then load and loop this file straightforwardly. A more complex project would require audio generation code, but I can skip all that here.</p>

<h2 id="adding-a-ui">Adding a UI</h2>

<p>Since I was writing a Mac app, it needed a UI. I was using a storyboard, so this is just a case of adding the buttons to my view - there is no CSS here - and writing a handler method. The handler method just copies the contents of the file into an array representing the RAM, and enables the run button.</p>

<p class="text-center">
<img src="https://scown.space/assets/images/screenshots/chip8/chip8-3.png" width="664" height="453" />
</p>

<h2 id="implementing-the-cpu">Implementing the CPU</h2>

<p>At this point it was time to start implementing the CPU. In theory this was a straightforward exercise - read an instruction from the CHIP-8 RAM array, decode it, and perform the operation, repeatedly. With the help of a <a href="https://slack-files.com/T3CH37TNX-F3RF5KT43-0fb93dbd1f">test ROM</a> I was able to track down some of the more subtle issues.</p>

<ul>
  <li>Swift does not allow integer addition to overflow by default. For most programs, this is beneficial (unexpected overflow <a href="https://scown.space/assets/images/frinkiac/light-is-not-your-friend.jpg" target="_blank">[like light]</a> is not your friend), but something to be aware of when writing an emulator. There is a separate method (<code class="language-plaintext highlighter-rouge">addingReportingOverflow</code>) for that. On the plus side, the method returns a boolean when overflow occurs in the addition, so overflow detection becomes easier.</li>
  <li>Certain functions (notably collision when drawing and carries) set the VF register to 1. This needs to be <em>unset</em> if a carry or collision did not occur.</li>
  <li>Not paying sufficient attention and reading register addresses as values.</li>
  <li>Incrementing the program counter after a jump operation.</li>
  <li>The timer register is supposed to decrement at 60Hz. My initial implementation did not allow for the check being performed less frequently. In addition, the timer could underflow in some circumstances (which in Swift causes a crash).</li>
</ul>

<p>In order to keep the UI responsive, the work was all done in a background thread, with drawing performed on the main thread. Each instruction was queued separately instead of using a loop.</p>

<h2 id="early-optimisation">Early optimisation</h2>

<p>My initial drawing implementation would re-render the entire screen every time there was some drawing work to do, but the Cocoa drawing framework allowed me to do better.</p>

<p>The framework passes a <code class="language-plaintext highlighter-rouge">dirtyRect</code> parameter to the <code class="language-plaintext highlighter-rouge">draw</code> method. This defines the area of the view that needs to be redrawn. By marking individual CHIP-8 pixels as dirty, I was able to reduce the amount of work done on each render. I also tweaked the code to fill in the background for the dirty area, and then only paint the active pixels as necessary.</p>

<p>I also inverted the colour scheme to the traditional white on black.</p>

<p>At this point, it was possible to run most programs.</p>

<p class="text-center">
<img src="https://scown.space/assets/images/screenshots/chip8/chip8-4.png" width="664" height="453" />
</p>

<h2 id="conclusion">Conclusion</h2>

<p>I had written a working CHIP-8 emulator. At this point I decided to integrate a debugger, as finding bugs just using print statements was tedious. This will be covered in Part 2.</p>]]></content><author><name>Alex Scown</name></author><category term="programming" /><summary type="html"><![CDATA[Inspired by Tomek Rękawek’s post on writing a GameBoy emulator (https://blog.rekawek.eu/2017/02/09/coffee-gb/), I decided it sounded like a fun project. After some digging, I realised that as a precursor, it would be better to get my feet wet by writing a CHIP-8 emulator. I also decided this would be a good excuse to learn some Swift. Digging around, I found Cowgod’s technical reference, which describes how to implement it.]]></summary></entry><entry><title type="html">Writing a Regular Expression Engine in Scala - Part 2</title><link href="https://scown.space/programming/2018/10/13/writing-a-regular-expression-engine-in-scala-part-2" rel="alternate" type="text/html" title="Writing a Regular Expression Engine in Scala - Part 2" /><published>2018-10-13T18:16:00+01:00</published><updated>2018-10-13T18:16:00+01:00</updated><id>https://scown.space/programming/2018/10/13/writing-a-regular-expression-engine-in-scala-part-2</id><content type="html" xml:base="https://scown.space/programming/2018/10/13/writing-a-regular-expression-engine-in-scala-part-2"><![CDATA[<p>In <a href="/programming/2018/04/19/regular-expressions">part 1</a> we implemented an NFA class in Scala. In this part, we will implement compilation into a DFA, and the ability to use the DFA to match strings.</p>

<p>The code can be found on Github in repo <a href="#repo-1">[1]</a>.</p>

<h2 id="compiling-an-nfa-into-a-dfa">Compiling an NFA into a DFA</h2>

<p>Recall that the compilation algorithm works as follows:</p>

<ul>
  <li>From the start state, find all the states reachable by consuming some input. Create a new state in the DFA representing this set.</li>
  <li>Repeat this process for each state created, until no new sets are generated.</li>
</ul>

<h3 id="dfa-representation">DFA Representation</h3>

<p>Recall that a DFA is deterministic; it may not contain 𝜀 transitions or multiple choices when consuming a particular character in a particular state. This means that the <code class="language-plaintext highlighter-rouge">Dfa</code> class is simpler than its NFA counterpart.</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="k">type</span> <span class="kt">TransitionMap</span> <span class="o">=</span> <span class="nc">Map</span><span class="o">[</span><span class="kt">State</span>, <span class="kt">Map</span><span class="o">[</span><span class="kt">Char</span>, <span class="kt">State</span><span class="o">]]</span>

<span class="k">case</span> <span class="k">class</span> <span class="nc">Dfa</span><span class="o">(</span><span class="n">startState</span><span class="k">:</span> <span class="kt">State</span><span class="o">,</span> <span class="n">finalStates</span><span class="k">:</span> <span class="kt">Set</span><span class="o">[</span><span class="kt">State</span><span class="o">],</span> <span class="n">transitions</span><span class="k">:</span> <span class="kt">TransitionMap</span><span class="o">)</span> <span class="o">{}</span></code></pre></figure>

<h3 id="implementing-compilation">Implementing compilation</h3>

<p>Since we have a recursive algorithm, we will implement compilation recursively. The <code class="language-plaintext highlighter-rouge">compile</code> method itself takes no arguments. Internally, it has two key helper functions:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">findReachableStates</code>, which given a set of states in the NFA finds all the states reachable under an 𝜀 transition</li>
  <li><code class="language-plaintext highlighter-rouge">constructDfa</code>, which takes a set of NFA states and adds them into a given DFA.</li>
</ul>

<p><code class="language-plaintext highlighter-rouge">compile</code> then calls <code class="language-plaintext highlighter-rouge">constructDfa</code> with the start state of the NFA, a DFA consisting of a single start state, and a mapping that marks the two states as equivalent.</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="k">val</span> <span class="nv">nfaStartStates</span> <span class="k">=</span> <span class="nc">Set</span><span class="o">(</span><span class="n">startState</span><span class="o">)</span>
<span class="k">val</span> <span class="nv">dfaStartState</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">State</span><span class="o">(</span><span class="nv">nfaStartStates</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="nv">_</span><span class="o">.</span><span class="py">label</span><span class="o">))</span>

<span class="nf">constructDfa</span><span class="o">(</span>
  <span class="n">nfaStartStates</span><span class="o">,</span>
  <span class="nc">Dfa</span><span class="o">(</span><span class="n">dfaStartState</span><span class="o">,</span> <span class="nc">Set</span><span class="o">(),</span> <span class="nc">Map</span><span class="o">()),</span>
  <span class="nc">Map</span><span class="o">(</span><span class="n">nfaStartStates</span> <span class="o">-&gt;</span> <span class="n">dfaStartState</span><span class="o">))</span></code></pre></figure>

<h3 id="findreachablestates">findReachableStates</h3>

<p>The <code class="language-plaintext highlighter-rouge">findReachableStates</code> helper function is straightforward. For each state, we find all the transitions, and then subsequently find all the 𝜀 transitions, and flatten the result. This can be represented concisely as a <code class="language-plaintext highlighter-rouge">flatMap</code> operation. We then remove any states which have already been tried, and then recurse.</p>

<p>This can be implemented tail recursively. Tail recursion (recursion as the final operation of a recursive function) is equivalent to a while loop, and this is an optimisation the Scala compiler can perform.</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="nd">@tailrec</span>
<span class="k">def</span> <span class="nf">findReachableStates</span><span class="o">(</span><span class="n">states</span><span class="k">:</span> <span class="kt">Set</span><span class="o">[</span><span class="kt">State</span><span class="o">],</span> <span class="n">visited</span><span class="k">:</span> <span class="kt">Set</span><span class="o">[</span><span class="kt">State</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Set</span><span class="o">(),</span> <span class="n">reachableStates</span><span class="k">:</span> <span class="kt">Set</span><span class="o">[</span><span class="kt">State</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Set</span><span class="o">())</span><span class="k">:</span> <span class="kt">Set</span><span class="o">[</span><span class="kt">State</span><span class="o">]</span> <span class="k">=</span> <span class="o">{</span>
  <span class="nf">if</span> <span class="o">(</span><span class="nv">states</span><span class="o">.</span><span class="py">isEmpty</span><span class="o">)</span> <span class="n">reachableStates</span>
  <span class="k">else</span> <span class="o">{</span>
    <span class="k">val</span> <span class="nv">reachable</span> <span class="k">=</span> <span class="nv">states</span><span class="o">.</span><span class="py">flatMap</span><span class="o">(</span><span class="n">s</span> <span class="k">=&gt;</span> <span class="nv">transitions</span><span class="o">.</span><span class="py">getOrElse</span><span class="o">(</span><span class="n">s</span><span class="o">,</span> <span class="nc">Map</span><span class="o">()).</span><span class="py">getOrElse</span><span class="o">(</span><span class="nc">Epsilon</span><span class="o">,</span> <span class="nc">Set</span><span class="o">())).</span><span class="py">diff</span><span class="o">(</span><span class="n">visited</span><span class="o">)</span>

    <span class="nf">findReachableStates</span><span class="o">(</span><span class="n">reachable</span><span class="o">,</span> <span class="n">visited</span> <span class="o">++</span> <span class="n">states</span><span class="o">,</span> <span class="n">states</span> <span class="o">++</span> <span class="n">reachable</span> <span class="o">++</span> <span class="n">reachableStates</span><span class="o">)</span>
  <span class="o">}</span>
<span class="o">}</span></code></pre></figure>

<h3 id="constructdfa">constructDfa</h3>

<p>Having worked out the reachable states, we combine all their non-𝜀 transitions together, and for each target set of states, create a new state, throwing out any transitions for which we already have transitions from a previous iteration. We use Scala’s pattern matching to concisely destructure the map pairings.</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="k">val</span> <span class="nv">nfaTransitions</span><span class="k">:</span> <span class="kt">Map</span><span class="o">[</span><span class="kt">MatchedCharacter</span>, <span class="kt">Set</span><span class="o">[</span><span class="kt">State</span><span class="o">]]</span> <span class="k">=</span> <span class="n">reachableStates</span>
  <span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="n">s</span> <span class="k">=&gt;</span> <span class="nv">transitions</span><span class="o">.</span><span class="py">getOrElse</span><span class="o">(</span><span class="n">s</span><span class="o">,</span> <span class="nc">Map</span><span class="o">()).</span><span class="py">filter</span><span class="o">({</span>
    <span class="nf">case</span> <span class="o">(</span><span class="n">matched</span><span class="o">,</span> <span class="k">_</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="n">matched</span> <span class="o">!=</span> <span class="nc">Epsilon</span>
  <span class="o">}).</span><span class="py">asInstanceOf</span><span class="o">[</span><span class="kt">Map</span><span class="o">[</span><span class="kt">MatchedCharacter</span>, <span class="kt">Set</span><span class="o">[</span><span class="kt">State</span><span class="o">]]])</span>
  <span class="o">.</span><span class="py">fold</span><span class="o">(</span><span class="nc">Map</span><span class="o">())((</span><span class="n">map1</span><span class="k">:</span> <span class="kt">Map</span><span class="o">[</span><span class="kt">MatchedCharacter</span>, <span class="kt">Set</span><span class="o">[</span><span class="kt">State</span><span class="o">]],</span> <span class="n">map2</span><span class="k">:</span> <span class="kt">Map</span><span class="o">[</span><span class="kt">MatchedCharacter</span>, <span class="kt">Set</span><span class="o">[</span><span class="kt">State</span><span class="o">]])</span> <span class="k">=&gt;</span> <span class="o">{</span>
    <span class="k">val</span> <span class="nv">keys1</span> <span class="k">=</span> <span class="nv">map1</span><span class="o">.</span><span class="py">keySet</span>
    <span class="k">val</span> <span class="nv">keys2</span> <span class="k">=</span> <span class="nv">map2</span><span class="o">.</span><span class="py">keySet</span>

    <span class="k">val</span> <span class="nv">intersection</span> <span class="k">=</span> <span class="nv">keys1</span><span class="o">.</span><span class="py">intersect</span><span class="o">(</span><span class="n">keys2</span><span class="o">)</span>
    <span class="k">val</span> <span class="nv">only1</span> <span class="k">=</span> <span class="nv">keys1</span><span class="o">.</span><span class="py">diff</span><span class="o">(</span><span class="n">keys2</span><span class="o">)</span>
    <span class="k">val</span> <span class="nv">only2</span> <span class="k">=</span> <span class="nv">keys2</span><span class="o">.</span><span class="py">diff</span><span class="o">(</span><span class="n">keys1</span><span class="o">)</span>

    <span class="o">(</span><span class="nc">Map</span><span class="o">()</span>
      <span class="o">++</span> <span class="nv">only1</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="n">key</span> <span class="k">=&gt;</span> <span class="o">(</span><span class="n">key</span><span class="o">,</span> <span class="nf">map1</span><span class="o">(</span><span class="n">key</span><span class="o">)))</span>
      <span class="o">++</span> <span class="nv">only2</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="n">key</span> <span class="k">=&gt;</span> <span class="o">(</span><span class="n">key</span><span class="o">,</span> <span class="nf">map2</span><span class="o">(</span><span class="n">key</span><span class="o">)))</span>
      <span class="o">++</span> <span class="nv">intersection</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="n">key</span> <span class="k">=&gt;</span> <span class="o">(</span><span class="n">key</span><span class="o">,</span> <span class="nf">map1</span><span class="o">(</span><span class="n">key</span><span class="o">)</span> <span class="o">++</span> <span class="nf">map2</span><span class="o">(</span><span class="n">key</span><span class="o">))))</span>
  <span class="o">})</span>

<span class="k">val</span> <span class="nv">newDfaStates</span> <span class="k">=</span> <span class="nv">nfaTransitions</span><span class="o">.</span><span class="py">map</span><span class="o">({</span>
  <span class="nf">case</span> <span class="o">(</span><span class="k">_</span><span class="o">,</span> <span class="n">states</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="o">(</span><span class="n">states</span><span class="o">,</span> <span class="k">new</span> <span class="nc">State</span><span class="o">(</span><span class="nv">states</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="nv">_</span><span class="o">.</span><span class="py">label</span><span class="o">)))</span>
<span class="o">})</span> <span class="o">--</span> <span class="nv">stateMap</span><span class="o">.</span><span class="py">keys</span>

<span class="k">val</span> <span class="nv">newTransitions</span><span class="k">:</span> <span class="kt">Map</span><span class="o">[</span><span class="kt">Char</span>, <span class="kt">State</span><span class="o">]</span> <span class="k">=</span> <span class="nv">nfaTransitions</span><span class="o">.</span><span class="py">map</span><span class="o">({</span>
  <span class="nf">case</span> <span class="o">(</span><span class="n">matched</span><span class="o">,</span> <span class="n">states</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="o">(</span><span class="nv">matched</span><span class="o">.</span><span class="py">c</span><span class="o">,</span> <span class="nv">newDfaStates</span><span class="o">.</span><span class="py">getOrElse</span><span class="o">(</span><span class="n">states</span><span class="o">,</span> <span class="nf">stateMap</span><span class="o">(</span><span class="n">states</span><span class="o">)))</span>
<span class="o">})</span></code></pre></figure>

<p>Then we can create a new DFA. This is a copy of the current DFA, with the new transitions added and the set of final states updated (if a final state is reachable via 𝜀 transitions from the current set of states, they are a final state in the DFA). Because everything is immutable, a shallow copy is sufficient.</p>

<p>If there were no new states produced, we’re done. Otherwise, we need to repeat this procedure for the newly generated states, before combining all of the transition maps together. Note that while this may produce several instances of the same state, this doesn’t actually matter as they all work as keys in the transition map regardless.</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="nf">if</span> <span class="o">(</span><span class="nv">newDfaStates</span><span class="o">.</span><span class="py">isEmpty</span><span class="o">)</span> <span class="n">updatedDfa</span>
<span class="k">else</span> <span class="n">newDfaStates</span>
  <span class="o">.</span><span class="py">map</span><span class="o">({</span>
    <span class="nf">case</span> <span class="o">(</span><span class="n">states</span><span class="o">,</span> <span class="k">_</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="nf">constructDfa</span><span class="o">(</span>
      <span class="n">states</span><span class="o">,</span>
      <span class="n">updatedDfa</span><span class="o">,</span>
      <span class="n">stateMap</span> <span class="o">++</span> <span class="n">newDfaStates</span>
    <span class="o">)</span>
  <span class="o">})</span>
  <span class="o">.</span><span class="py">fold</span><span class="o">(</span><span class="n">dfa</span><span class="o">)((</span><span class="n">dfa1</span><span class="o">,</span> <span class="n">dfa2</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="o">{</span>
    <span class="nv">dfa1</span><span class="o">.</span><span class="py">copy</span><span class="o">(</span>
      <span class="n">finalStates</span> <span class="k">=</span> <span class="nv">dfa1</span><span class="o">.</span><span class="py">finalStates</span> <span class="o">++</span> <span class="nv">dfa2</span><span class="o">.</span><span class="py">finalStates</span><span class="o">,</span>
      <span class="n">transitions</span> <span class="k">=</span> <span class="o">{</span>
        <span class="k">val</span> <span class="nv">intersection</span> <span class="k">=</span> <span class="nv">dfa1</span><span class="o">.</span><span class="py">transitions</span><span class="o">.</span><span class="py">keySet</span><span class="o">.</span><span class="py">intersect</span><span class="o">(</span><span class="nv">dfa2</span><span class="o">.</span><span class="py">transitions</span><span class="o">.</span><span class="py">keySet</span><span class="o">)</span>

        <span class="k">val</span> <span class="nv">intersectionMap</span> <span class="k">=</span> <span class="nv">intersection</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="n">state</span> <span class="k">=&gt;</span> <span class="o">{</span>
          <span class="n">state</span> <span class="o">-&gt;</span> <span class="o">(</span><span class="nv">dfa1</span><span class="o">.</span><span class="py">transitions</span><span class="o">(</span><span class="n">state</span><span class="o">)</span> <span class="o">++</span> <span class="nv">dfa2</span><span class="o">.</span><span class="py">transitions</span><span class="o">(</span><span class="n">state</span><span class="o">))</span>
        <span class="o">})</span>

        <span class="nv">dfa1</span><span class="o">.</span><span class="py">transitions</span> <span class="o">++</span> <span class="nv">dfa2</span><span class="o">.</span><span class="py">transitions</span> <span class="o">++</span> <span class="n">intersectionMap</span>
      <span class="o">}</span>
    <span class="o">)</span>
  <span class="o">})</span></code></pre></figure>

<p>We now have a <code class="language-plaintext highlighter-rouge">Dfa</code> instance which corresponds to the <code class="language-plaintext highlighter-rouge">Nfa</code>. Now we can implement matching.</p>

<h2 id="implementing-matching">Implementing matching</h2>

<p>Given a <code class="language-plaintext highlighter-rouge">Dfa</code> and a <code class="language-plaintext highlighter-rouge">String</code> to match, we want to return a sequence of all the possible matches. The matching algorithm will be greedy; in the event that the DFA may match the string in multiple ways, we want to return the longest match. Once we’ve found a match, the next search should commence from the end of the previous match.</p>

<p>This basically reduces down to a number of cases:</p>

<ul>
  <li>If the input is empty, return a sequence containing the last match if it exists, or the empty sequence if it does not</li>
  <li>If there is input</li>
  <li>
    <ul>
      <li>If the input matches and the DFA is in a final state, the the result becomes a possible match (we do not add it to the sequence yet as we are being greedy). If it is not a final state, we simply append the character to the current match.</li>
    </ul>
  </li>
  <li>
    <ul>
      <li>If the input does not match, we append the last known match to the sequence (if it exists) and backtrack to the end of the last known match before proceeding from the start state.</li>
    </ul>
  </li>
</ul>

<p>This algorithm maps nicely to Scala code:</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="k">case</span> <span class="k">class</span> <span class="nc">Dfa</span><span class="o">(</span><span class="n">startState</span><span class="k">:</span> <span class="kt">State</span><span class="o">,</span> <span class="n">finalStates</span><span class="k">:</span> <span class="kt">Set</span><span class="o">[</span><span class="kt">State</span><span class="o">],</span> <span class="n">transitions</span><span class="k">:</span> <span class="kt">TransitionMap</span><span class="o">)</span> <span class="o">{</span>
  <span class="k">def</span> <span class="nf">matches</span><span class="o">(</span><span class="n">s</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span><span class="k">:</span> <span class="kt">Stream</span><span class="o">[</span><span class="kt">String</span><span class="o">]</span> <span class="k">=</span> <span class="o">{</span>
    <span class="k">def</span> <span class="nf">helper</span><span class="o">(</span><span class="n">s</span><span class="k">:</span> <span class="kt">Vector</span><span class="o">[</span><span class="kt">Char</span><span class="o">],</span> <span class="n">state</span><span class="k">:</span> <span class="kt">State</span><span class="o">,</span> <span class="n">lastResult</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">String</span><span class="o">],</span> <span class="n">acc</span><span class="k">:</span> <span class="kt">Vector</span><span class="o">[</span><span class="kt">Char</span><span class="o">],</span> <span class="n">next</span><span class="k">:</span> <span class="kt">Vector</span><span class="o">[</span><span class="kt">Char</span><span class="o">])</span><span class="k">:</span> <span class="kt">Stream</span><span class="o">[</span><span class="kt">String</span><span class="o">]</span> <span class="k">=</span> <span class="n">s</span> <span class="k">match</span> <span class="o">{</span>
      <span class="c1">// If there is no more input, return the last result if we have one</span>
      <span class="k">case</span> <span class="nc">Vector</span><span class="o">()</span> <span class="k">if</span> <span class="nv">lastResult</span><span class="o">.</span><span class="py">isDefined</span> <span class="k">=&gt;</span> <span class="nc">Stream</span><span class="o">(</span><span class="nv">lastResult</span><span class="o">.</span><span class="py">get</span><span class="o">)</span>
      <span class="k">case</span> <span class="nc">Vector</span><span class="o">()</span> <span class="k">=&gt;</span> <span class="nc">Stream</span><span class="o">()</span>
      <span class="k">case</span> <span class="n">h</span> <span class="o">+:</span> <span class="n">t</span> <span class="k">=&gt;</span> <span class="nv">transitions</span><span class="o">.</span><span class="py">getOrElse</span><span class="o">(</span><span class="n">state</span><span class="o">,</span> <span class="nc">Map</span><span class="o">()).</span><span class="py">get</span><span class="o">(</span><span class="n">h</span><span class="o">)</span> <span class="k">match</span> <span class="o">{</span>
        <span class="c1">// If the next state is final, record the result</span>
        <span class="k">case</span> <span class="nc">Some</span><span class="o">(</span><span class="n">nextState</span><span class="o">)</span> <span class="k">if</span> <span class="nv">finalStates</span><span class="o">.</span><span class="py">contains</span><span class="o">(</span><span class="n">nextState</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="nf">helper</span><span class="o">(</span><span class="n">t</span><span class="o">,</span> <span class="n">nextState</span><span class="o">,</span> <span class="nc">Some</span><span class="o">((</span><span class="n">acc</span> <span class="o">:+</span> <span class="n">h</span><span class="o">).</span><span class="py">mkString</span><span class="o">(</span><span class="s">""</span><span class="o">)),</span> <span class="n">acc</span> <span class="o">:+</span> <span class="n">h</span><span class="o">,</span> <span class="n">t</span><span class="o">)</span>
        <span class="c1">// If the next state is not final, build the accumulator</span>
        <span class="k">case</span> <span class="nc">Some</span><span class="o">(</span><span class="n">nextState</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="nf">helper</span><span class="o">(</span><span class="n">t</span><span class="o">,</span> <span class="n">nextState</span><span class="o">,</span> <span class="n">lastResult</span><span class="o">,</span> <span class="n">acc</span> <span class="o">:+</span> <span class="n">h</span><span class="o">,</span> <span class="n">next</span><span class="o">)</span>
        <span class="c1">// If there is no next state, return a Stream containing the last result if we have one</span>
        <span class="k">case</span> <span class="nc">None</span> <span class="k">if</span> <span class="nv">lastResult</span><span class="o">.</span><span class="py">isDefined</span> <span class="k">=&gt;</span> <span class="nv">lastResult</span><span class="o">.</span><span class="py">get</span> <span class="o">#::</span> <span class="nf">helper</span><span class="o">(</span><span class="n">next</span><span class="o">,</span> <span class="n">startState</span><span class="o">,</span> <span class="nc">None</span><span class="o">,</span> <span class="nc">Vector</span><span class="o">(),</span> <span class="nc">Vector</span><span class="o">())</span>
        <span class="k">case</span> <span class="nc">None</span> <span class="k">=&gt;</span> <span class="nf">helper</span><span class="o">(</span><span class="n">t</span><span class="o">,</span> <span class="n">startState</span><span class="o">,</span> <span class="nc">None</span><span class="o">,</span> <span class="nc">Vector</span><span class="o">(),</span> <span class="nc">Vector</span><span class="o">())</span>
      <span class="o">}</span>
    <span class="o">}</span>

    <span class="nf">helper</span><span class="o">(</span><span class="nv">s</span><span class="o">.</span><span class="py">toVector</span><span class="o">,</span> <span class="n">startState</span><span class="o">,</span> <span class="nc">None</span><span class="o">,</span> <span class="nc">Vector</span><span class="o">(),</span> <span class="nc">Vector</span><span class="o">())</span>
  <span class="o">}</span>
<span class="o">}</span></code></pre></figure>

<p>This is a recursive function with an accumulator for the current match.</p>

<p>We have elected to use a <code class="language-plaintext highlighter-rouge">Stream</code> as the sequence type. This is a lazy collection; its elements are not computed until they are needed. This means that we need not pay the cost of finding all the matches if we’re only interested in the first one.</p>

<h2 id="conclusion">Conclusion</h2>

<p>We’ve implemented a simple Regular Expression engine in Scala. While lacking in most of the conveniences of a modern Regular Expression engine, we are still able to create a DFA for any regular language.</p>]]></content><author><name>Alex Scown</name></author><category term="programming" /><summary type="html"><![CDATA[In part 1 we implemented an NFA class in Scala. In this part, we will implement compilation into a DFA, and the ability to use the DFA to match strings.]]></summary></entry><entry><title type="html">Writing a Regular Expression Engine in Scala - Part 1</title><link href="https://scown.space/programming/2018/10/12/writing-a-regular-expression-engine" rel="alternate" type="text/html" title="Writing a Regular Expression Engine in Scala - Part 1" /><published>2018-10-12T00:16:00+01:00</published><updated>2018-10-12T00:16:00+01:00</updated><id>https://scown.space/programming/2018/10/12/writing-a-regular-expression-engine</id><content type="html" xml:base="https://scown.space/programming/2018/10/12/writing-a-regular-expression-engine"><![CDATA[<p>Having explained the theory behind Regular Expressions (see <a href="/programming/2018/04/19/regular-expressions">here</a>), let’s implement a Regular Expression engine in Scala.</p>

<p>The code can be found on Github in repo <a href="#repo-1">[1]</a>.</p>

<h2 id="why-scala">Why Scala</h2>
<p>Of all the programming languages I have tried, I think Scala is my favourite. It favours immutable objects, supports functional styles of programming, and has an expressive type system which reduces the difference between the set of compilable programs and the set of working programs.</p>

<p>Scala has several features which will be useful when writing the Regular Expression engine, which will be pointed out as we go.</p>

<h2 id="building-an-nfa">Building an NFA</h2>
<p>We begin by writing a class to represent an NFA.</p>

<h3 id="nfa-representation">NFA Representation</h3>
<p>Recall that an NFA consists of a set of states, and a set of transitions between them. An obvious implementation might represent a state as a <code class="language-plaintext highlighter-rouge">Map[Character, Set[State]]</code>, with a flag to mark final states.</p>

<p>The problem with this approach is that it incompatible with immutable objects. Once a state has been created, it cannot be modified - we can only create a new state. This means that when a transition is added to a state, we must recursively modify all the states which point to said state. If the NFA contains cycles, this process repeats forever. The solution to this is to have the NFA itself own the transitions.</p>

<p>Thus an NFA will consist of a start State, a set of final states, and a map of State -&gt; Character -&gt; Set[State]. There’s a slight complication: we also need to be able to match the empty string, 𝜀.</p>

<p>In Scala, this can be represented succinctly.</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="k">sealed</span> <span class="k">trait</span> <span class="nc">Matched</span>

<span class="k">case</span> <span class="k">object</span> <span class="nc">Epsilon</span> <span class="k">extends</span> <span class="nc">Matched</span>
<span class="k">case</span> <span class="k">class</span> <span class="nc">MatchedCharacter</span><span class="o">(</span><span class="n">c</span><span class="k">:</span> <span class="kt">Char</span><span class="o">)</span> <span class="k">extends</span> <span class="nc">Matched</span>

<span class="k">case</span> <span class="k">class</span> <span class="nc">Nfa</span><span class="o">(</span><span class="n">startState</span><span class="k">:</span> <span class="kt">State</span><span class="o">,</span> <span class="n">finalStates</span><span class="k">:</span> <span class="kt">Set</span><span class="o">[</span><span class="kt">State</span><span class="o">],</span> <span class="n">transitions</span><span class="k">:</span> <span class="kt">Map</span><span class="o">[</span><span class="kt">State</span>, <span class="kt">Map</span><span class="o">[</span><span class="kt">Matched</span>, <span class="kt">Set</span><span class="o">[</span><span class="kt">State</span><span class="o">]]])</span> <span class="o">{</span>
<span class="o">}</span></code></pre></figure>

<h3 id="constructing-an-nfa">Constructing an NFA</h3>
<p>This is a good start, but constructing NFAs like this would be tedious, illegible, and error prone. To mitigate this we can use a companion object with some static factories for the five base NFAs (a companion object is a singleton object with the same name as a class).</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="k">object</span> <span class="nc">Nfa</span> <span class="o">{</span>

<span class="o">}</span></code></pre></figure>

<p>We start by writing a factory method for the single character case.</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="k">val</span> <span class="nv">EMPTY</span><span class="k">:</span> <span class="kt">Nfa</span> <span class="o">=</span> <span class="nf">character</span><span class="o">(</span><span class="nc">Epsilon</span><span class="o">)</span>

<span class="k">def</span> <span class="nf">character</span><span class="o">(</span><span class="n">c</span><span class="k">:</span> <span class="kt">Matched</span><span class="o">)</span><span class="k">:</span> <span class="kt">Nfa</span> <span class="o">=</span> <span class="o">{</span>
  <span class="k">val</span> <span class="nv">startState</span> <span class="k">=</span> <span class="nc">State</span><span class="o">()</span>
  <span class="k">val</span> <span class="nv">finalState</span> <span class="k">=</span> <span class="nc">State</span><span class="o">()</span>

  <span class="nc">Nfa</span><span class="o">(</span>
    <span class="n">startState</span><span class="o">,</span>
    <span class="nc">Set</span><span class="o">(</span><span class="n">finalState</span><span class="o">),</span>
    <span class="nc">Map</span><span class="o">(</span>
      <span class="n">startState</span> <span class="o">-&gt;</span> <span class="nc">Map</span><span class="o">(</span><span class="n">c</span> <span class="o">-&gt;</span> <span class="nc">Set</span><span class="o">(</span><span class="n">finalState</span><span class="o">))</span>
    <span class="o">)</span>
  <span class="o">)</span>
<span class="o">}</span></code></pre></figure>

<p>This describes the single character NFA as an NFA with a start state, a single final state, and a transition from one to the other. As a small optimisation, since <code class="language-plaintext highlighter-rouge">Epsilon</code> is a singleton, we can cache a reference to the empty Nfa. This is one of the benefits of immutable state.</p>

<p>This leaves the three compound cases: concatenation, union, and the Kleene star.</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="k">type</span> <span class="kt">TransitionMap</span> <span class="o">=</span> <span class="nc">Map</span><span class="o">[</span><span class="kt">State</span>, <span class="kt">Map</span><span class="o">[</span><span class="kt">Matched</span>, <span class="kt">Set</span><span class="o">[</span><span class="kt">State</span><span class="o">]]]</span>

<span class="k">def</span> <span class="nf">concatenation</span><span class="o">(</span><span class="n">n1</span><span class="k">:</span> <span class="kt">Nfa</span><span class="o">,</span> <span class="n">n2</span><span class="k">:</span> <span class="kt">Nfa</span><span class="o">)</span><span class="k">:</span> <span class="kt">Nfa</span> <span class="o">=</span> <span class="o">{</span>
  <span class="k">val</span> <span class="nv">startState</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">State</span><span class="o">()</span>
  <span class="k">val</span> <span class="nv">joinState</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">State</span><span class="o">()</span>
  <span class="k">val</span> <span class="nv">finalState</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">State</span><span class="o">()</span>

  <span class="nc">Nfa</span><span class="o">(</span>
    <span class="n">startState</span><span class="o">,</span>
    <span class="nc">Set</span><span class="o">(</span><span class="n">finalState</span><span class="o">),</span>
    <span class="nc">Map</span><span class="o">(</span>
      <span class="n">startState</span> <span class="o">-&gt;</span> <span class="nc">Map</span><span class="o">(</span><span class="nc">Epsilon</span> <span class="o">-&gt;</span> <span class="nc">Set</span><span class="o">(</span><span class="nv">n1</span><span class="o">.</span><span class="py">startState</span><span class="o">)),</span>
      <span class="n">joinState</span> <span class="o">-&gt;</span> <span class="nc">Map</span><span class="o">(</span><span class="nc">Epsilon</span> <span class="o">-&gt;</span> <span class="nc">Set</span><span class="o">(</span><span class="nv">n2</span><span class="o">.</span><span class="py">startState</span><span class="o">))</span>
    <span class="o">).</span><span class="py">asInstanceOf</span><span class="o">[</span><span class="kt">TransitionMap</span><span class="o">]</span>
      <span class="o">++</span> <span class="nv">n1</span><span class="o">.</span><span class="py">finalStates</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="n">s</span> <span class="k">=&gt;</span> <span class="o">(</span><span class="n">s</span><span class="o">,</span> <span class="nc">Map</span><span class="o">(</span><span class="nv">Epsilon</span><span class="o">.</span><span class="py">asInstanceOf</span><span class="o">[</span><span class="kt">Matched</span><span class="o">]</span> <span class="o">-&gt;</span> <span class="nc">Set</span><span class="o">(</span><span class="n">joinState</span><span class="o">))))</span>
      <span class="o">++</span> <span class="nv">n2</span><span class="o">.</span><span class="py">finalStates</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="n">s</span> <span class="k">=&gt;</span> <span class="o">(</span><span class="n">s</span><span class="o">,</span> <span class="nc">Map</span><span class="o">(</span><span class="nv">Epsilon</span><span class="o">.</span><span class="py">asInstanceOf</span><span class="o">[</span><span class="kt">Matched</span><span class="o">]</span> <span class="o">-&gt;</span> <span class="nc">Set</span><span class="o">(</span><span class="n">finalState</span><span class="o">))))</span>
      <span class="o">++</span> <span class="nv">n1</span><span class="o">.</span><span class="py">transitions</span>
      <span class="o">++</span> <span class="nv">n2</span><span class="o">.</span><span class="py">transitions</span>
  <span class="o">)</span>
<span class="o">}</span>

<span class="k">def</span> <span class="nf">union</span><span class="o">(</span><span class="n">n1</span><span class="k">:</span> <span class="kt">Nfa</span><span class="o">,</span> <span class="n">n2</span><span class="k">:</span> <span class="kt">Nfa</span><span class="o">)</span><span class="k">:</span> <span class="kt">Nfa</span> <span class="o">=</span> <span class="o">{</span>
  <span class="k">val</span> <span class="nv">startState</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">State</span><span class="o">()</span>
  <span class="k">val</span> <span class="nv">finalState</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">State</span><span class="o">()</span>

  <span class="nc">Nfa</span><span class="o">(</span>
    <span class="n">startState</span><span class="o">,</span>
    <span class="nc">Set</span><span class="o">(</span><span class="n">finalState</span><span class="o">),</span>
    <span class="nc">Map</span><span class="o">(</span>
      <span class="n">startState</span> <span class="o">-&gt;</span> <span class="nc">Map</span><span class="o">(</span><span class="nc">Epsilon</span> <span class="o">-&gt;</span> <span class="nc">Set</span><span class="o">(</span><span class="nv">n1</span><span class="o">.</span><span class="py">startState</span><span class="o">,</span> <span class="nv">n2</span><span class="o">.</span><span class="py">startState</span><span class="o">))</span>
    <span class="o">).</span><span class="py">asInstanceOf</span><span class="o">[</span><span class="kt">TransitionMap</span><span class="o">]</span>
      <span class="o">++</span> <span class="nv">n1</span><span class="o">.</span><span class="py">finalStates</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="n">s</span> <span class="k">=&gt;</span> <span class="o">(</span><span class="n">s</span><span class="o">,</span> <span class="nc">Map</span><span class="o">(</span><span class="nv">Epsilon</span><span class="o">.</span><span class="py">asInstanceOf</span><span class="o">[</span><span class="kt">Matched</span><span class="o">]</span> <span class="o">-&gt;</span> <span class="nc">Set</span><span class="o">(</span><span class="n">finalState</span><span class="o">))))</span>
      <span class="o">++</span> <span class="nv">n2</span><span class="o">.</span><span class="py">finalStates</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="n">s</span> <span class="k">=&gt;</span> <span class="o">(</span><span class="n">s</span><span class="o">,</span> <span class="nc">Map</span><span class="o">(</span><span class="nv">Epsilon</span><span class="o">.</span><span class="py">asInstanceOf</span><span class="o">[</span><span class="kt">Matched</span><span class="o">]</span> <span class="o">-&gt;</span> <span class="nc">Set</span><span class="o">(</span><span class="n">finalState</span><span class="o">))))</span>
      <span class="o">++</span> <span class="nv">n1</span><span class="o">.</span><span class="py">transitions</span>
      <span class="o">++</span> <span class="nv">n2</span><span class="o">.</span><span class="py">transitions</span>
  <span class="o">)</span>
<span class="o">}</span>

<span class="k">def</span> <span class="nf">star</span><span class="o">(</span><span class="n">n</span><span class="k">:</span> <span class="kt">Nfa</span><span class="o">)</span><span class="k">:</span> <span class="kt">Nfa</span> <span class="o">=</span> <span class="o">{</span>
  <span class="k">val</span> <span class="nv">startState</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">State</span><span class="o">()</span>
  <span class="k">val</span> <span class="nv">finalState</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">State</span><span class="o">()</span>
  <span class="k">val</span> <span class="nv">startLoop</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">State</span><span class="o">()</span>
  <span class="k">val</span> <span class="nv">endLoop</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">State</span><span class="o">()</span>

  <span class="nc">Nfa</span><span class="o">(</span>
    <span class="n">startState</span><span class="o">,</span>
    <span class="nc">Set</span><span class="o">(</span><span class="n">finalState</span><span class="o">),</span>
    <span class="nc">Map</span><span class="o">(</span>
      <span class="n">startState</span> <span class="o">-&gt;</span> <span class="nc">Map</span><span class="o">(</span><span class="nc">Epsilon</span> <span class="o">-&gt;</span> <span class="nc">Set</span><span class="o">(</span><span class="n">startLoop</span><span class="o">,</span> <span class="n">finalState</span><span class="o">)),</span>
      <span class="n">startLoop</span> <span class="o">-&gt;</span> <span class="nc">Map</span><span class="o">(</span><span class="nc">Epsilon</span> <span class="o">-&gt;</span> <span class="nc">Set</span><span class="o">(</span><span class="nv">n</span><span class="o">.</span><span class="py">startState</span><span class="o">)),</span>
      <span class="n">endLoop</span> <span class="o">-&gt;</span> <span class="nc">Map</span><span class="o">(</span><span class="nc">Epsilon</span> <span class="o">-&gt;</span> <span class="nc">Set</span><span class="o">(</span><span class="n">startLoop</span><span class="o">,</span> <span class="n">finalState</span><span class="o">))</span>
    <span class="o">).</span><span class="py">asInstanceOf</span><span class="o">[</span><span class="kt">TransitionMap</span><span class="o">]</span>
      <span class="o">++</span> <span class="nv">n</span><span class="o">.</span><span class="py">finalStates</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="n">s</span> <span class="k">=&gt;</span> <span class="o">(</span><span class="n">s</span><span class="o">,</span> <span class="nc">Map</span><span class="o">(</span><span class="nv">Epsilon</span><span class="o">.</span><span class="py">asInstanceOf</span><span class="o">[</span><span class="kt">Matched</span><span class="o">]</span> <span class="o">-&gt;</span> <span class="nc">Set</span><span class="o">(</span><span class="n">endLoop</span><span class="o">))))</span>
      <span class="o">++</span> <span class="nv">n</span><span class="o">.</span><span class="py">transitions</span>
  <span class="o">)</span>
<span class="o">}</span></code></pre></figure>

<p>These work pretty much as you’d expect. We create the required additional states, and add the required 𝜀 transitions to the transitions of the existing NFAs. Irritatingly we need typecasts to stop the compiler inferring that the transition maps only use <code class="language-plaintext highlighter-rouge">Epsilon</code> as a key, which prevents the combination of the maps.</p>

<p>This gives us all the tools we need to construct an NFA that is equivalent to any Regular Expression.</p>

<h3 id="instance-methods">Instance Methods</h3>
<p>While functionally this is all we need, it’s still pretty clunky. We can use a Scala feature to help with this.</p>

<p>Scala doesn’t have operators. It has types that have methods with names like <code class="language-plaintext highlighter-rouge">+</code>, <code class="language-plaintext highlighter-rouge">-</code> and <code class="language-plaintext highlighter-rouge">::</code>. We can add methods with these sorts of names to our own types.</p>

<p>While operators can be overused (the Dispatch library was a <a href="http://www.flotsam.nl/dispatch-periodic-table.html">classic example</a> of this), in cases where we are trying to code externally defined operators with Scala code they can be quite helpful.</p>

<p>In this case, the union and Kleene star have standard notation (<code class="language-plaintext highlighter-rouge">|</code> and <code class="language-plaintext highlighter-rouge">*</code> respectively). We can add methods with these names to the Nfa class.</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="k">def</span> <span class="nf">|</span><span class="o">(</span><span class="n">other</span><span class="k">:</span> <span class="kt">Nfa</span><span class="o">)</span><span class="k">:</span> <span class="kt">Nfa</span> <span class="o">=</span> <span class="nv">Nfa</span><span class="o">.</span><span class="py">union</span><span class="o">(</span><span class="k">this</span><span class="o">,</span> <span class="n">other</span><span class="o">)</span>
<span class="k">def</span> <span class="nf">*</span> <span class="k">:</span> <span class="kt">Nfa</span> <span class="o">=</span> <span class="nv">Nfa</span><span class="o">.</span><span class="py">star</span><span class="o">(</span><span class="k">this</span><span class="o">)</span>

<span class="k">val</span> <span class="nv">x</span><span class="k">:</span> <span class="kt">Nfa</span> <span class="o">=</span> <span class="n">n</span><span class="o">|</span><span class="n">m</span>
<span class="k">val</span> <span class="nv">y</span><span class="k">:</span> <span class="kt">Nfa</span> <span class="o">=</span> <span class="n">n</span><span class="o">*</span></code></pre></figure>

<p>(Yes, I’m aware concatenation is missing. I’m getting to that.)</p>

<h3 id="concatenation">Concatenation</h3>
<p>One approach to concatenation is to allow instances of the Nfa type to be constructed from Strings. A String is a sequence of characters, which we can take to be the Nfa that matches the sequence. This also generalises nicely to the empty string, which can be taken as the Nfa matching 𝜀.</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="k">implicit</span> <span class="k">def</span> <span class="nf">string2Nfa</span><span class="o">(</span><span class="n">s</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span><span class="k">:</span> <span class="kt">Nfa</span> <span class="o">=</span> <span class="o">{</span>
  <span class="nf">if</span> <span class="o">(</span><span class="nv">s</span><span class="o">.</span><span class="py">isEmpty</span><span class="o">)</span> <span class="nv">Nfa</span><span class="o">.</span><span class="py">EMPTY</span>
  <span class="k">else</span> <span class="nv">s</span><span class="o">.</span><span class="py">map</span><span class="o">(</span><span class="n">c</span> <span class="k">=&gt;</span> <span class="nv">Nfa</span><span class="o">.</span><span class="py">character</span><span class="o">(</span><span class="nc">MatchedCharacter</span><span class="o">(</span><span class="n">c</span><span class="o">))).</span><span class="py">reduce</span><span class="o">(</span><span class="nv">Nfa</span><span class="o">.</span><span class="py">concatenation</span><span class="o">)</span>
<span class="o">}</span></code></pre></figure>

<p>This also allows us to demonstrate another Scala feature: implicits. If we have an instance of a type <code class="language-plaintext highlighter-rouge">A</code>, we required a type <code class="language-plaintext highlighter-rouge">B</code>, and we have an implicit method <code class="language-plaintext highlighter-rouge">a2B</code> of type <code class="language-plaintext highlighter-rouge">A =&gt; B</code>, the compiler will allow us to use instances of type <code class="language-plaintext highlighter-rouge">A</code> as if they were instances of type <code class="language-plaintext highlighter-rouge">B</code>.</p>

<p>Used improperly, implicits can make code confusing by making it difficult to see where a conversion is happening. Determining if this is one of those cases is left as an exercise for the reader.</p>

<p>We can now write code like this:</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="k">val</span> <span class="nv">x</span><span class="k">:</span> <span class="kt">Nfa</span> <span class="o">=</span> <span class="s">"abc"</span><span class="o">|</span><span class="s">"xyz"</span><span class="o">*</span></code></pre></figure>

<p>There’s just one more trick we need.</p>

<h3 id="application">Application</h3>

<p>It turns out Scala has a trick we can use to implement concatenation as an instance method.</p>

<p>Scala allows any type that implements an <code class="language-plaintext highlighter-rouge">apply</code> method to be called as a function.</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="k">def</span> <span class="nf">apply</span><span class="o">(</span><span class="n">other</span><span class="k">:</span> <span class="kt">Nfa</span><span class="o">)</span><span class="k">:</span> <span class="kt">Nfa</span> <span class="o">=</span> <span class="nv">Nfa</span><span class="o">.</span><span class="py">concatenation</span><span class="o">(</span><span class="k">this</span><span class="o">,</span> <span class="n">other</span><span class="o">)</span></code></pre></figure>

<p>Which means the following is working Scala code:</p>

<figure class="highlight"><pre><code class="language-scala" data-lang="scala"><span class="k">val</span> <span class="nv">nfa</span><span class="k">:</span> <span class="kt">Nfa</span> <span class="o">=</span> <span class="o">(</span><span class="s">"011"</span><span class="o">|</span><span class="s">"10"</span><span class="o">)(</span><span class="s">"1"</span><span class="o">*)|(</span><span class="s">"00"</span><span class="o">|</span><span class="s">"11"</span><span class="o">)(</span><span class="s">"0"</span><span class="o">(</span><span class="s">"1"</span><span class="o">*)|</span><span class="s">""</span><span class="o">)</span></code></pre></figure>

<p>It may have a few more parentheses than one would use to write it in the standard library, but it’s otherwise a pretty natural way of writing it.</p>

<h2 id="conclusion">Conclusion</h2>

<p>We’ve implemented the beginning of a regular expression engine, by creating an NFA class and a concise way of instantiating it. In Part 2, we’ll look at implementing compilation into a DFA.</p>]]></content><author><name>Alex Scown</name></author><category term="programming" /><summary type="html"><![CDATA[Having explained the theory behind Regular Expressions (see here), let’s implement a Regular Expression engine in Scala.]]></summary></entry><entry><title type="html">Code from a past life</title><link href="https://scown.space/programming/2018/08/22/code-from-a-past-life" rel="alternate" type="text/html" title="Code from a past life" /><published>2018-08-22T22:43:00+01:00</published><updated>2018-08-22T22:43:00+01:00</updated><id>https://scown.space/programming/2018/08/22/code-from-a-past-life</id><content type="html" xml:base="https://scown.space/programming/2018/08/22/code-from-a-past-life"><![CDATA[<p>The other day I decided to dig out one of my old university assignments. In my second year we had an AI sub-module, in which the programming assignment was to solve a number of instances of the Travelling Salesman Problem.</p>

<h2 id="the-travelling-saleman-problem">The Travelling Saleman problem</h2>

<p>The full background can be found on the <a href="https://en.wikipedia.org/wiki/Travelling_salesman_problem">Wikipedia page</a>, but essentially, the Travelling Salesman Problem is:</p>

<div class="card card-body bg-light">Given a set of cities and the distances between them, find the shortest tour that visits all of the cities exactly once.</div>

<p>This turns out to be a hard problem. An exact solution can only be found in exponential time. However, there are a number of approximations which can be made to produce very good solutions much more quickly. The assignment was about choosing some of these approximations to find solutions to a number of instances of the problem.</p>

<h2 id="digging-out-the-code">Digging out the code</h2>

<p>The code was previously stored as an Eclipse project on my local machine. It was originally written in 2008 by Past Me, who was young and stupid. As such there are a number of issues with the code:</p>

<ul>
  <li>Past Me was only dimly aware of source control and believed it required a server, so there is no version history.</li>
  <li>Past Me had no idea how to lay out a project, so the folder structure makes no sense.</li>
</ul>

<p>The first step was to reorganise the code and sort out the folder structure in preparation for committing to Github. I set up a Maven module and moved the files around accordingly. The code can now be found on Github in repo <a href="#repo-1">[1]</a>.</p>

<p>This rest of this exercise will involve cleaning up the Greedy Best First Search implementation.</p>

<h2 id="greedy-best-first-search">Greedy Best First Search</h2>

<p>The Greedy Best First Search algorithm works thusly:</p>

<ul>
  <li>Choose a starting city</li>
  <li>Iterate through the Graph, choosing the shortest edge to a city that has yet to be visited.</li>
  <li>Finish up in the starting city</li>
</ul>

<p>This process is repeated for each starting city so that the choice of starting point does not over influence the final tour.</p>

<p>This algorithm visits each of n cities, scans n edges at each city, and repeats this for each of n cities, so a naive implementation should run in <em>O(n<sup>3</sup>)</em>.</p>

<h2 id="dusting-it-off">Dusting it off</h2>

<p>Past Me had a terrible coding style, as he had not yet discovered IntelliJ IDEA and its code inspections. The next job was to use the automated refactorings to cleanup some small issues:</p>

<ul>
  <li>Fixing access levels</li>
  <li>Removing dead code</li>
  <li>Adding <code class="language-plaintext highlighter-rouge">final</code> declarations where appropriate (mutable state isn’t your friend)</li>
  <li>Updating the code from Java 5 to Java 8 to allow the use of (among other things) the diamond notation</li>
  <li>Using interface types instead of implementations where appropriate</li>
</ul>

<h2 id="running-the-code">Running the code</h2>

<p>Having given the project a cursory polish, it was time to run it. As a first attempt I ran the code without arguments, to be greeted by the following message:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Some sort of error occurred.  Check the file was formatted correctly
</code></pre></div></div>

<p>Thanks Past Me. Sure enough:</p>

<figure class="highlight"><pre><code class="language-java" data-lang="java">    
    <span class="nd">@Main</span>
    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">){</span>
      <span class="nc">Parser</span> <span class="n">parser</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
      <span class="k">try</span><span class="o">{</span>
        <span class="n">parser</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Parser</span><span class="o">(</span><span class="n">args</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span>
      <span class="o">}</span>
      <span class="k">catch</span><span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">){</span>
        <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Some sort of error occurred.  Check the file was formatted correctly"</span><span class="o">);</span>
        <span class="k">return</span><span class="o">;</span>
      <span class="o">}</span>
      <span class="c1">// remaining code omitted</span>
    
    </code></pre></figure>

<p>Past Me clearly knew about Exceptions, but didn’t always know when not to catch them. Here it would be clearer to just throw the Exception so that useful information about the problem is printed out.</p>

<p>Clearing this up (and a similar issue with writing the output at the end), and running the code with the files I had previously resulted in the following running times (I’ve included my times from 10 years ago as a reference):</p>

<table class="table table-striped">
  <thead>
    <tr>
      <th>Filename</th>
      <th>2006 Macbook /s</th>
      <th>2017 Macbook Pro /s</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>file12</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file17</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file21</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file26</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file42</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file48</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file58</td>
      <td>1</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file175</td>
      <td>89</td>
      <td>8</td>
    </tr>
    <tr>
      <td>file180</td>
      <td>99</td>
      <td>25</td>
    </tr>
    <tr>
      <td>file535</td>
      <td>9401</td>
      <td>1385</td>
    </tr>
  </tbody>
</table>

<p>Modern hardware has clearly gotten much faster.</p>

<h2 id="modernising-the-code">Modernising the code</h2>

<p>Having run the code, it was time to look for improvements. In the intervening 10 years I’ve become much more interested in a functional programming style, so I planned to look through the code and identify places where those changes could be made.</p>

<p>Past Me didn’t know about Unit Testing, so unfortunately there were no tests to verify that correctness had been maintained, but re-running the code and checking the output didn’t change would be good enough.</p>

<p>I chose to process the files in execution order. Past Me did a reasonable job breaking up the code into modules.</p>

<ul>
  <li>Parser.java contains code for reading the input files</li>
  <li>Graph.java contains a graph data structure for processing the input. There are also Node.java and Arc.java containing helper data structures</li>
  <li>Path.java contains code for managing a solution or part thereof</li>
  <li>Writer.java contains code for writing the final solution to a file</li>
</ul>

<p>Some of the APIs were questionable, but the high level structure was broadly sound. By proceeding through each file I turn, I would be able to improve the code without major breakages.</p>

<h3 id="parserjava">Parser.java</h3>

<p>The initial version of the <code class="language-plaintext highlighter-rouge">Parser</code> constructor looked like this:</p>

<figure class="highlight"><pre><code class="language-java" data-lang="java">    <span class="nd">@SuppressWarnings</span><span class="o">(</span><span class="s">"unchecked"</span><span class="o">)</span>
    <span class="kd">public</span> <span class="nf">Parser</span><span class="o">(</span><span class="kd">final</span> <span class="nc">String</span> <span class="n">filename</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">IOException</span> <span class="o">{</span>
      <span class="kd">final</span> <span class="nc">BufferedReader</span> <span class="n">reader</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">BufferedReader</span><span class="o">(</span><span class="k">new</span> <span class="nc">FileReader</span><span class="o">(</span><span class="n">filename</span><span class="o">));</span>
      <span class="nc">String</span> <span class="n">line</span> <span class="o">=</span> <span class="n">reader</span><span class="o">.</span><span class="na">readLine</span><span class="o">();</span>
      <span class="nc">String</span> <span class="n">data</span> <span class="o">=</span> <span class="s">""</span><span class="o">;</span>
      <span class="k">while</span><span class="o">(</span><span class="n">line</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">){</span>
        <span class="n">data</span><span class="o">+=</span><span class="n">line</span><span class="o">;</span>
        <span class="n">line</span> <span class="o">=</span> <span class="n">reader</span><span class="o">.</span><span class="na">readLine</span><span class="o">();</span>
      <span class="o">}</span>
      <span class="kd">final</span> <span class="nc">String</span><span class="o">[]</span> <span class="n">parts</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="na">split</span><span class="o">(</span><span class="s">","</span><span class="o">);</span>
      <span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span><span class="n">i</span><span class="o">&lt;</span><span class="n">parts</span><span class="o">.</span><span class="na">length</span><span class="o">;</span><span class="n">i</span><span class="o">++){</span>
        <span class="n">parts</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">parts</span><span class="o">[</span><span class="n">i</span><span class="o">].</span><span class="na">trim</span><span class="o">();</span>
      <span class="o">}</span>

      <span class="kd">final</span> <span class="nc">String</span><span class="o">[]</span> <span class="n">nameParts</span> <span class="o">=</span> <span class="n">parts</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">split</span><span class="o">(</span><span class="s">"="</span><span class="o">);</span>
      <span class="n">name</span> <span class="o">=</span> <span class="n">nameParts</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="na">trim</span><span class="o">();</span>

      <span class="kd">final</span> <span class="nc">String</span><span class="o">[]</span> <span class="n">sizeParts</span> <span class="o">=</span> <span class="n">parts</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="na">split</span><span class="o">(</span><span class="s">"="</span><span class="o">);</span>
      <span class="kd">final</span> <span class="nc">String</span> <span class="n">sizeString</span> <span class="o">=</span> <span class="n">sizeParts</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="na">trim</span><span class="o">();</span>
      <span class="n">size</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">sizeString</span><span class="o">);</span>

      <span class="kd">final</span> <span class="nc">HashSet</span><span class="o">&lt;</span><span class="nc">Node</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;&gt;</span> <span class="n">nodes</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">HashSet</span><span class="o">&lt;&gt;();</span>
      <span class="kd">final</span> <span class="nc">Node</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;[]</span> <span class="n">nodeArray</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Node</span><span class="o">[</span><span class="n">size</span><span class="o">];</span>
      <span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span><span class="n">i</span><span class="o">&lt;</span><span class="n">size</span><span class="o">;</span><span class="n">i</span><span class="o">++){</span>
        <span class="n">nodeArray</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Node</span><span class="o">&lt;&gt;(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="o">);</span>
      <span class="o">}</span>
      <span class="nc">Collections</span><span class="o">.</span><span class="na">addAll</span><span class="o">(</span><span class="n">nodes</span><span class="o">,</span> <span class="n">nodeArray</span><span class="o">);</span>

      <span class="kd">final</span> <span class="nc">HashSet</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;&gt;</span> <span class="n">arcs</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">HashSet</span><span class="o">&lt;&gt;();</span>
      <span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">2</span><span class="o">;</span>
      <span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span><span class="n">k</span><span class="o">&lt;</span><span class="n">size</span><span class="o">;</span><span class="n">k</span><span class="o">++){</span>
        <span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">l</span> <span class="o">=</span> <span class="n">k</span><span class="o">+</span><span class="mi">1</span><span class="o">;</span><span class="n">l</span><span class="o">&lt;</span><span class="n">size</span><span class="o">;</span><span class="n">l</span><span class="o">++){</span>
          <span class="kd">final</span> <span class="kt">int</span> <span class="n">weight</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">parts</span><span class="o">[</span><span class="n">j</span><span class="o">]);</span>
          <span class="n">arcs</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="nc">Arc</span><span class="o">&lt;&gt;(</span><span class="n">nodeArray</span><span class="o">[</span><span class="n">k</span><span class="o">],</span> <span class="n">nodeArray</span><span class="o">[</span><span class="n">l</span><span class="o">],</span> <span class="n">weight</span><span class="o">));</span>
          <span class="n">arcs</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="nc">Arc</span><span class="o">&lt;&gt;(</span><span class="n">nodeArray</span><span class="o">[</span><span class="n">l</span><span class="o">],</span> <span class="n">nodeArray</span><span class="o">[</span><span class="n">k</span><span class="o">],</span> <span class="n">weight</span><span class="o">));</span>
          <span class="n">j</span><span class="o">++;</span>
        <span class="o">}</span>
      <span class="o">}</span>

      <span class="n">graph</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Graph</span><span class="o">&lt;&gt;(</span><span class="n">nodes</span><span class="o">,</span> <span class="n">arcs</span><span class="o">);</span>
    <span class="o">}</span></code></pre></figure>

<p>The unclosed <code class="language-plaintext highlighter-rouge">BufferedReader</code> aside, this is not brilliant, but not completely terrible by Java 6 standards. However, Java 8 introduced <code class="language-plaintext highlighter-rouge">Stream</code>s, which give us the tools to clean up things like this.</p>

<p>The reading of the input file can be replaced with <code class="language-plaintext highlighter-rouge">Files.lines</code>, which is both shorter and fixes the unclosed <code class="language-plaintext highlighter-rouge">Reader</code> issue.</p>

<figure class="highlight"><pre><code class="language-java" data-lang="java">    <span class="kd">final</span> <span class="nc">String</span> <span class="n">data</span> <span class="o">=</span> <span class="nc">Files</span><span class="o">.</span><span class="na">lines</span><span class="o">(</span><span class="nc">Paths</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">filename</span><span class="o">))</span>
          <span class="o">.</span><span class="na">collect</span><span class="o">(</span><span class="nc">Collectors</span><span class="o">.</span><span class="na">joining</span><span class="o">());</span></code></pre></figure>

<p>The extraction of the values and the generation of the <code class="language-plaintext highlighter-rouge">List&lt;Node&gt;</code> can be replaced with a couple of simple map operations.</p>

<figure class="highlight"><pre><code class="language-java" data-lang="java">    <span class="kd">final</span> <span class="nc">List</span><span class="o">&lt;</span><span class="nc">String</span><span class="o">&gt;</span> <span class="n">parts</span> <span class="o">=</span> <span class="nc">Arrays</span><span class="o">.</span><span class="na">stream</span><span class="o">(</span><span class="n">data</span><span class="o">.</span><span class="na">split</span><span class="o">(</span><span class="s">","</span><span class="o">))</span>
            <span class="o">.</span><span class="na">map</span><span class="o">(</span><span class="nl">String:</span><span class="o">:</span><span class="n">trim</span><span class="o">)</span>
            <span class="o">.</span><span class="na">collect</span><span class="o">(</span><span class="nc">Collectors</span><span class="o">.</span><span class="na">toList</span><span class="o">());</span>

    <span class="c1">// code omitted</span>

    <span class="kd">final</span> <span class="nc">List</span><span class="o">&lt;</span><span class="nc">Node</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;&gt;</span> <span class="n">nodes</span> <span class="o">=</span> <span class="nc">IntStream</span><span class="o">.</span><span class="na">range</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span> <span class="n">size</span> <span class="o">+</span> <span class="mi">1</span><span class="o">)</span>
            <span class="o">.</span><span class="na">boxed</span><span class="o">()</span>
            <span class="o">.</span><span class="na">map</span><span class="o">(</span><span class="nl">Node:</span><span class="o">:</span><span class="k">new</span><span class="o">)</span>
            <span class="o">.</span><span class="na">collect</span><span class="o">(</span><span class="nc">Collectors</span><span class="o">.</span><span class="na">toList</span><span class="o">());</span></code></pre></figure>

<p>The double loop at the end can be replaced by an <code class="language-plaintext highlighter-rouge">Iterator</code> to generate the <code class="language-plaintext highlighter-rouge">Node</code> labels, and a pair of nested <code class="language-plaintext highlighter-rouge">flatMap</code> operations. Determining if this is better or worse is left as an exercise for the reader.</p>

<figure class="highlight"><pre><code class="language-java" data-lang="java">    <span class="kd">final</span> <span class="nc">Iterator</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">nodeIndices</span> <span class="o">=</span> <span class="n">parts</span><span class="o">.</span><span class="na">subList</span><span class="o">(</span><span class="mi">2</span><span class="o">,</span> <span class="n">parts</span><span class="o">.</span><span class="na">size</span><span class="o">()).</span><span class="na">stream</span><span class="o">()</span>
            <span class="o">.</span><span class="na">map</span><span class="o">(</span><span class="nl">Integer:</span><span class="o">:</span><span class="n">parseInt</span><span class="o">)</span>
            <span class="o">.</span><span class="na">iterator</span><span class="o">();</span>

    <span class="kd">final</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;&gt;</span> <span class="n">arcs</span> <span class="o">=</span> <span class="nc">IntStream</span><span class="o">.</span><span class="na">range</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="n">size</span><span class="o">)</span>
            <span class="o">.</span><span class="na">boxed</span><span class="o">()</span>
            <span class="o">.</span><span class="na">flatMap</span><span class="o">(</span><span class="n">k</span> <span class="o">-&gt;</span> <span class="nc">IntStream</span><span class="o">.</span><span class="na">range</span><span class="o">(</span><span class="n">k</span> <span class="o">+</span> <span class="mi">1</span><span class="o">,</span> <span class="n">size</span><span class="o">)</span>
                    <span class="o">.</span><span class="na">boxed</span><span class="o">()</span>
                    <span class="o">.</span><span class="na">flatMap</span><span class="o">(</span><span class="n">l</span> <span class="o">-&gt;</span> <span class="o">{</span>
                        <span class="kd">final</span> <span class="kt">int</span> <span class="n">weight</span> <span class="o">=</span> <span class="n">nodeIndices</span><span class="o">.</span><span class="na">next</span><span class="o">();</span>
                        <span class="k">return</span> <span class="nc">Stream</span><span class="o">.</span><span class="na">of</span><span class="o">(</span>
                                <span class="k">new</span> <span class="nc">Arc</span><span class="o">&lt;&gt;(</span><span class="n">nodes</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">k</span><span class="o">),</span> <span class="n">nodes</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">l</span><span class="o">),</span> <span class="n">weight</span><span class="o">),</span>
                                <span class="k">new</span> <span class="nc">Arc</span><span class="o">&lt;&gt;(</span><span class="n">nodes</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">l</span><span class="o">),</span> <span class="n">nodes</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">k</span><span class="o">),</span> <span class="n">weight</span><span class="o">)</span>
                        <span class="o">);</span>
                    <span class="o">}))</span>
            <span class="o">.</span><span class="na">collect</span><span class="o">(</span><span class="nc">Collectors</span><span class="o">.</span><span class="na">toSet</span><span class="o">());</span></code></pre></figure>

<p>None of these changes are likely to boost performance, but they are more functional.</p>

<h3 id="graphjava">Graph.java</h3>

<p>The first observation was that the <code class="language-plaintext highlighter-rouge">Node</code> class added no value - it was merely a wrapper around an instance of type <code class="language-plaintext highlighter-rouge">T</code>. The first step was to expunge this class from the program.</p>

<p>Most of the code in <code class="language-plaintext highlighter-rouge">Graph</code> was only used by an experimental subclass, which was never finished. Removing that and the associated methods shortened <code class="language-plaintext highlighter-rouge">Graph</code> considerably.</p>

<figure class="highlight"><pre><code class="language-java" data-lang="java">    <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Graph</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="o">{</span>

    <span class="kd">private</span> <span class="kd">final</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="n">nodes</span><span class="o">;</span>
    <span class="kd">protected</span> <span class="kd">final</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;&gt;</span> <span class="n">arcs</span><span class="o">;</span>

    <span class="kd">public</span> <span class="nf">Graph</span><span class="o">(</span><span class="kd">final</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="n">nodes</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;&gt;</span> <span class="n">arcs</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">nodes</span> <span class="o">=</span> <span class="n">nodes</span><span class="o">;</span>
        <span class="k">this</span><span class="o">.</span><span class="na">arcs</span> <span class="o">=</span> <span class="n">arcs</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="nf">getNodes</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">nodes</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;&gt;</span> <span class="nf">getArcs</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">arcs</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;&gt;</span> <span class="nf">startingAt</span><span class="o">(</span><span class="kd">final</span> <span class="no">T</span> <span class="n">node</span><span class="o">)</span> <span class="o">{</span>
        <span class="kd">final</span> <span class="nc">HashSet</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;&gt;</span> <span class="n">startingAt</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">HashSet</span><span class="o">&lt;&gt;();</span>
        <span class="k">for</span> <span class="o">(</span><span class="kd">final</span> <span class="nc">Arc</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="n">arc</span> <span class="o">:</span> <span class="n">arcs</span><span class="o">)</span> <span class="o">{</span>
            <span class="k">if</span> <span class="o">(</span><span class="n">arc</span><span class="o">.</span><span class="na">isStart</span><span class="o">(</span><span class="n">node</span><span class="o">))</span> <span class="o">{</span>
                <span class="n">startingAt</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">arc</span><span class="o">);</span>
            <span class="o">}</span>
        <span class="o">}</span>
        <span class="k">return</span> <span class="n">startingAt</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kt">int</span> <span class="nf">distance</span><span class="o">(</span><span class="kd">final</span> <span class="no">T</span> <span class="n">n1</span><span class="o">,</span> <span class="kd">final</span> <span class="no">T</span> <span class="n">n2</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">IllegalArgumentException</span> <span class="o">{</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">succeeds</span><span class="o">(</span><span class="n">n1</span><span class="o">,</span> <span class="n">n2</span><span class="o">))</span> <span class="o">{</span>
            <span class="kd">final</span> <span class="nc">Iterable</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;&gt;</span> <span class="n">arcs</span> <span class="o">=</span> <span class="n">startingAt</span><span class="o">(</span><span class="n">n1</span><span class="o">);</span>
            <span class="kt">int</span> <span class="n">distance</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
            <span class="k">for</span> <span class="o">(</span><span class="kd">final</span> <span class="nc">Arc</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="n">arc</span> <span class="o">:</span> <span class="n">arcs</span><span class="o">)</span> <span class="o">{</span>
                <span class="k">if</span> <span class="o">(</span><span class="n">arc</span><span class="o">.</span><span class="na">isEnd</span><span class="o">(</span><span class="n">n2</span><span class="o">))</span> <span class="o">{</span>
                    <span class="n">distance</span> <span class="o">=</span> <span class="n">arc</span><span class="o">.</span><span class="na">getWeight</span><span class="o">();</span>
                <span class="o">}</span>
            <span class="o">}</span>
            <span class="k">return</span> <span class="n">distance</span><span class="o">;</span>
        <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
            <span class="k">throw</span> <span class="k">new</span> <span class="nf">IllegalArgumentException</span><span class="o">(</span><span class="s">"Nodes not adjacent"</span><span class="o">);</span>
        <span class="o">}</span>
    <span class="o">}</span>
<span class="o">}</span></code></pre></figure>

<p>The Graph is an immutable data structure (well done Past Me), but doesn’t take full advantage of this. The <code class="language-plaintext highlighter-rouge">startingAt</code> method naively runs through the entire graph, which is <em>n<sup>2</sup></em> edges. This is Shlemiel the Painter’s algorithm. This drives the time complexity of the program up to <em>O(n<sup>4</sup>)</em>.</p>

<p>One solution here is build a cache, a <code class="language-plaintext highlighter-rouge">Map&lt;T, Set&lt;Arc&lt;T&gt;&gt;</code> mapping a node to the arcs starting from it, which can be built when the graph is constructed. This requires <em>O(n<sup>2</sup>)</em> time, but only has to be done once, so it is no worse than the complexity of the program as a whole. The <code class="language-plaintext highlighter-rouge">startingAt</code> method then runs in constant time.</p>

<p>The <code class="language-plaintext highlighter-rouge">distance</code> method also runs in <em>O(n<sup>2</sup>)</em> by virtue of calling <code class="language-plaintext highlighter-rouge">startingAt</code>. It also called <code class="language-plaintext highlighter-rouge">succeeds</code>, which also iterated through the whole graph. These performance issues make the fact that it pointlessly continues looking at arcs once it has found the one required (Past Me obviously hadn’t discovered <code class="language-plaintext highlighter-rouge">break</code>) a minor issue. This can be replaced with a <code class="language-plaintext highlighter-rouge">filter</code> and a <code class="language-plaintext highlighter-rouge">findFirst</code> to short circuit when the correct edge is found. The absent case of the <code class="language-plaintext highlighter-rouge">Optional</code> is irrelevant because Travelling Salesman Problem graphs are always connected.</p>

<p>The terrible <code class="language-plaintext highlighter-rouge">successors</code> method can then be removed.</p>

<figure class="highlight"><pre><code class="language-java" data-lang="java">    <span class="kd">private</span> <span class="kd">final</span> <span class="nc">Map</span><span class="o">&lt;</span><span class="no">T</span><span class="o">,</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;&gt;&gt;</span> <span class="n">table</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">HashMap</span><span class="o">&lt;&gt;();</span>

    <span class="kd">private</span> <span class="kd">final</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="n">nodes</span><span class="o">;</span>

    <span class="kd">public</span> <span class="nf">Graph</span><span class="o">(</span><span class="kd">final</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="n">nodes</span><span class="o">,</span> <span class="kd">final</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;&gt;</span> <span class="n">arcs</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">nodes</span> <span class="o">=</span> <span class="n">nodes</span><span class="o">;</span>

        <span class="k">for</span> <span class="o">(</span><span class="kd">final</span> <span class="nc">Arc</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="n">arc</span> <span class="o">:</span> <span class="n">arcs</span><span class="o">)</span> <span class="o">{</span>
            <span class="k">if</span> <span class="o">(!</span><span class="n">table</span><span class="o">.</span><span class="na">containsKey</span><span class="o">(</span><span class="n">arc</span><span class="o">.</span><span class="na">getStart</span><span class="o">()))</span> <span class="o">{</span>
                <span class="n">table</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">arc</span><span class="o">.</span><span class="na">getStart</span><span class="o">(),</span> <span class="k">new</span> <span class="nc">HashSet</span><span class="o">&lt;&gt;());</span>
            <span class="o">}</span>

            <span class="n">table</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">arc</span><span class="o">.</span><span class="na">getStart</span><span class="o">()).</span><span class="na">add</span><span class="o">(</span><span class="n">arc</span><span class="o">);</span>
        <span class="o">}</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;&gt;</span> <span class="nf">startingAt</span><span class="o">(</span><span class="kd">final</span> <span class="no">T</span> <span class="n">node</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">table</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">node</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kt">int</span> <span class="nf">distance</span><span class="o">(</span><span class="kd">final</span> <span class="no">T</span> <span class="n">n1</span><span class="o">,</span> <span class="kd">final</span> <span class="no">T</span> <span class="n">n2</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">IllegalArgumentException</span> <span class="o">{</span>
        <span class="kd">final</span> <span class="nc">Optional</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">weight</span> <span class="o">=</span> <span class="n">startingAt</span><span class="o">(</span><span class="n">n1</span><span class="o">).</span><span class="na">stream</span><span class="o">()</span>
                <span class="o">.</span><span class="na">filter</span><span class="o">(</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="n">a</span><span class="o">.</span><span class="na">getEnd</span><span class="o">().</span><span class="na">equals</span><span class="o">(</span><span class="n">n2</span><span class="o">))</span>
                <span class="o">.</span><span class="na">findFirst</span><span class="o">()</span>
                <span class="o">.</span><span class="na">map</span><span class="o">(</span><span class="nl">Arc:</span><span class="o">:</span><span class="n">getWeight</span><span class="o">);</span>

        <span class="k">return</span> <span class="n">weight</span><span class="o">.</span><span class="na">orElseThrow</span><span class="o">(()</span> <span class="o">-&gt;</span> <span class="k">new</span> <span class="nc">IllegalArgumentException</span><span class="o">(</span><span class="s">"Nodes not adjacent"</span><span class="o">));</span>
<span class="o">}</span></code></pre></figure>

<h3 id="greedybestfirstsearchjava">GreedyBestFirstSearch.java</h3>

<p>Now we come to the algorithm itself.</p>

<figure class="highlight"><pre><code class="language-java" data-lang="java">    <span class="kd">class</span> <span class="nc">GreedyBestFirstSearch</span> <span class="o">{</span>

        <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="kd">final</span> <span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">IOException</span> <span class="o">{</span>
            <span class="kd">final</span> <span class="nc">Parser</span> <span class="n">parser</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Parser</span><span class="o">(</span><span class="n">args</span><span class="o">[</span><span class="mi">0</span><span class="o">]);</span>

            <span class="kd">final</span> <span class="nc">Collection</span><span class="o">&lt;</span><span class="nc">Path</span><span class="o">&gt;</span> <span class="n">paths</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">HashSet</span><span class="o">&lt;&gt;();</span>

            <span class="k">for</span><span class="o">(</span><span class="kd">final</span> <span class="nc">Integer</span> <span class="n">node</span> <span class="o">:</span> <span class="n">parser</span><span class="o">.</span><span class="na">getGraph</span><span class="o">().</span><span class="na">getNodes</span><span class="o">()){</span>
                <span class="kd">final</span> <span class="nc">Path</span> <span class="n">path</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Path</span><span class="o">();</span>
                <span class="kd">final</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">node</span><span class="o">;</span>
                <span class="n">path</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">i</span><span class="o">,</span><span class="mi">0</span><span class="o">);</span>

                <span class="k">while</span><span class="o">(</span><span class="n">path</span><span class="o">.</span><span class="na">size</span><span class="o">()&lt;</span><span class="n">parser</span><span class="o">.</span><span class="na">getSize</span><span class="o">()){</span>
                    <span class="kd">final</span> <span class="nc">Integer</span> <span class="n">n</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="na">getLast</span><span class="o">();</span>
                    <span class="kd">final</span> <span class="nc">Set</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;&gt;</span> <span class="n">arcs</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="na">getGraph</span><span class="o">().</span><span class="na">startingAt</span><span class="o">(</span><span class="n">n</span><span class="o">);</span>
                    <span class="kt">boolean</span> <span class="n">added</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>

                    <span class="k">while</span><span class="o">(!</span><span class="n">added</span><span class="o">){</span>
                        <span class="kd">final</span> <span class="nc">Arc</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">arc</span> <span class="o">=</span> <span class="nc">Collections</span><span class="o">.</span><span class="na">min</span><span class="o">(</span><span class="n">arcs</span><span class="o">);</span>

                        <span class="k">if</span><span class="o">(!</span><span class="n">path</span><span class="o">.</span><span class="na">contains</span><span class="o">(</span><span class="n">arc</span><span class="o">.</span><span class="na">getEnd</span><span class="o">())){</span>
                            <span class="n">path</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">arc</span><span class="o">.</span><span class="na">getEnd</span><span class="o">(),</span> <span class="n">arc</span><span class="o">.</span><span class="na">getWeight</span><span class="o">());</span>
                            <span class="n">added</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
                        <span class="o">}</span>
                        <span class="k">else</span><span class="o">{</span>
                            <span class="n">arcs</span><span class="o">.</span><span class="na">remove</span><span class="o">(</span><span class="n">arc</span><span class="o">);</span>
                        <span class="o">}</span>
                    <span class="o">}</span>
                <span class="o">}</span>

                <span class="kd">final</span> <span class="nc">Integer</span> <span class="n">n</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="na">getLast</span><span class="o">();</span>
                <span class="kd">final</span> <span class="nc">Iterable</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;&gt;</span> <span class="n">arcs</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="na">getGraph</span><span class="o">().</span><span class="na">startingAt</span><span class="o">(</span><span class="n">n</span><span class="o">);</span>

                <span class="k">for</span><span class="o">(</span><span class="kd">final</span> <span class="nc">Arc</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">arc</span> <span class="o">:</span> <span class="n">arcs</span><span class="o">){</span>
                    <span class="k">if</span><span class="o">(</span><span class="n">arc</span><span class="o">.</span><span class="na">isEnd</span><span class="o">(</span><span class="n">node</span><span class="o">)){</span>
                        <span class="n">path</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">i</span><span class="o">,</span> <span class="n">arc</span><span class="o">.</span><span class="na">getWeight</span><span class="o">());</span>
                    <span class="o">}</span>
                <span class="o">}</span>

                <span class="n">paths</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">path</span><span class="o">);</span>
            <span class="o">}</span>

            <span class="nc">Writer</span><span class="o">.</span><span class="na">writeToFile</span><span class="o">(</span><span class="n">parser</span><span class="o">.</span><span class="na">getName</span><span class="o">(),</span> <span class="n">parser</span><span class="o">.</span><span class="na">getSize</span><span class="o">(),</span> <span class="nc">Collections</span><span class="o">.</span><span class="na">min</span><span class="o">(</span><span class="n">paths</span><span class="o">));</span>
        <span class="o">}</span>
    <span class="o">}</span></code></pre></figure>

<p>The program itself is not bad, aside from its dependence on slow code. That said, there are a couple of improvements that can be made here.</p>

<p>If the <code class="language-plaintext highlighter-rouge">Graph</code> is modified to use a <code class="language-plaintext highlighter-rouge">TreeSet</code> as the basis of the cache, the code for finding the shortest edge can be simplified to the following.</p>

<figure class="highlight"><pre><code class="language-java" data-lang="java">    <span class="kd">final</span> <span class="nc">Optional</span><span class="o">&lt;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;&gt;</span> <span class="n">shortestEdge</span> <span class="o">=</span> <span class="n">arcs</span><span class="o">.</span><span class="na">stream</span><span class="o">()</span>
            <span class="o">.</span><span class="na">filter</span><span class="o">(</span><span class="n">arc</span> <span class="o">-&gt;</span> <span class="o">!</span><span class="n">path</span><span class="o">.</span><span class="na">contains</span><span class="o">(</span><span class="n">arc</span><span class="o">.</span><span class="na">getEnd</span><span class="o">()))</span>
            <span class="o">.</span><span class="na">findFirst</span><span class="o">();</span></code></pre></figure>

<p>This will find the shortest edge from the cache in <em>O(log n)</em> time, which allows us to bring down the complexity of the program to <em>O(n<sup>2</sup>log n)</em>.</p>

<p>We can also replace the code for completing the tour with a single call to the <code class="language-plaintext highlighter-rouge">distance</code> method on the graph.</p>

<h2 id="putting-it-all-together">Putting it all together</h2>

<p>Having modernised and optimised the code, I ran it again to see if there was any improvement.</p>

<table class="table table-striped">
  <thead>
    <tr>
      <th>Filename</th>
      <th>2017 Macbook Pro /s</th>
      <th>2017 Macbook Pro (optimised) /s</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>file12</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file17</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file21</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file26</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file42</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file48</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file58</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file175</td>
      <td>8</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file180</td>
      <td>25</td>
      <td>0</td>
    </tr>
    <tr>
      <td>file535</td>
      <td>1385</td>
      <td>3</td>
    </tr>
  </tbody>
</table>

<p>This is a speed up of three orders of magnitude on the largest file. This demonstrates the importance of profiling for bottlenecks.</p>]]></content><author><name>Alex Scown</name></author><category term="programming" /><summary type="html"><![CDATA[The other day I decided to dig out one of my old university assignments. In my second year we had an AI sub-module, in which the programming assignment was to solve a number of instances of the Travelling Salesman Problem.]]></summary></entry><entry><title type="html">Regular Expressions</title><link href="https://scown.space/programming/2018/04/19/regular-expressions" rel="alternate" type="text/html" title="Regular Expressions" /><published>2018-04-19T23:42:00+01:00</published><updated>2018-04-19T23:42:00+01:00</updated><id>https://scown.space/programming/2018/04/19/regular-expressions</id><content type="html" xml:base="https://scown.space/programming/2018/04/19/regular-expressions"><![CDATA[<p>In a previous job I did a fair amount of mentoring. One piece I would use any excuse to bring out was a discussion of the theory behind regular expressions. It wasn’t just a digression - I found regular expressions much easier to read once I understood how they worked.</p>

<p>But before we get to regular expressions we need to do some automata theory.</p>

<h2 id="deterministic-finite-automata">Deterministic Finite Automata</h2>

<p>Deterministic Finite Automata are a simple model of computation. A <abbr title="Deterministic Finite Automaton">DFA</abbr> is so called because it is comprised of a finite number of states, with deterministic transitions between them.</p>

<p>A DFA begins in a designated start state, and attempts to process some input (often a sequence of characters). If the DFA is in a designated final state upon reaching the end of the input, the DFA is said to <em>match</em> the input.</p>

<p>Here is an example DFA:</p>

<p><img src="https://scown.space/assets/images/dfas/01.svg" alt="DFA" /></p>

<p>The start state is represented by the arrow at the left hand side (state A), and the final state is represented by a double circle (state F). This DFA has two paths. The bottom path (A, D, E, F) matches the string 101 only. The top path (A, B, C, F) matches the string 00, followed by zero or more 1s, followed by a 0.</p>

<p>DFAs can also be represented as state tables:</p>

<div class="table-responsive">
    <table class="table table-striped table-bordered">
        <tr>
            <th>State</th>
            <th>0</th>
            <th>1</th>
        </tr>
        <tr>
            <td>A</td>
            <td>B</td>
            <td>D</td>
        </tr>
        <tr>
            <td>B</td>
            <td>C</td>
            <td></td>
        </tr>
        <tr>
            <td>C</td>
            <td>F</td>
            <td>C</td>
        </tr>
        <tr>
            <td>D</td>
            <td>E</td>
            <td></td>
        </tr>
        <tr>
            <td>E</td>
            <td></td>
            <td>F</td>
        </tr>
    </table>
</div>

<p>In order to be deterministic a DFA may only have a single state transition for a given input in any particular state. If we relax this requirement, we get a Nondeterministic Finite Automaton.</p>

<h2 id="nondeterministic-finite-automata">Nondeterministic Finite Automata</h2>

<p>An <abbr title="Nondeterministic Finite Automaton">NFA</abbr> is an extension of a DFA, with the following two additional rules:</p>

<ul>
  <li>The requirement for unique state transitions for a given input is removed.</li>
  <li>There may be state transitions which match an empty input (hereafter denoted 𝜀).</li>
</ul>

<p>It follows from the definition that any DFA is also an NFA - it simply has no nondeterministic states or 𝜀 moves.</p>

<p>Here is an example NFA:</p>

<p><img src="https://scown.space/assets/images/dfas/02.svg" alt="NFA" /></p>

<p>This NFA matches any of the following:</p>

<ul>
  <li>The string 00 (A, C, F, I, J)</li>
  <li>The string 11 (A, C, G, I, J)</li>
  <li>A 0 followed by at least two 1s (A, B, E, J)</li>
  <li>The string 10 followed by zero or more 1s (A, D, H, J)</li>
  <li>The string 0001 [<em>C Montgomery Burns!</em>] (A, C, F, I, E, J)</li>
  <li>The string 1101 (A, C, G, I, E, J)</li>
  <li>The string 000 followed by zero or more 1s (A, C, F, I, H, J)</li>
  <li>The string 110 followed by zero or more 1s (A, C, G, I, H, J)</li>
</ul>

<p>It turns out that these changes do not increase power of the system - for any NFA there exists an equivalent DFA. This can be found by constructing a DFA where each state represents the set of possible states that can be reached in the NFA.</p>

<p>As an example, we shall apply this process to the above NFA:</p>

<p><img src="https://scown.space/assets/images/dfas/03a.svg" alt="NFA to DFA 1" /></p>

<p>From the start state A, we can read both 0 and 1. After reading a 0, we will be in either of states B or F, so the set {B, F} forms a state in the DFA. From BF, we can read a 0 and end up in either of states I or J. J is a final state, so the state IJ is also a final state.</p>

<p>Starting from A and reading a 1 will take us to the new state DG, and from there a 1 will take us to IJ, which we’ve seen before.</p>

<p><img src="https://scown.space/assets/images/dfas/03b.svg" alt="NFA to DFA 2" /></p>

<p>From B or F, reading a 1 will take us from B to B reflexively, or from B to E. From DG, reading a 0 will take us to H or J, which forms a second final state.</p>

<p><img src="https://scown.space/assets/images/dfas/03c.svg" alt="NFA to DFA 3" /></p>

<p>From BE, reading a 1 will take us either to B reflexively, from B to E, or from E to J, forming the new final state BEJ. Since BE is a subset of BEJ, reading a 1 at BEJ forms a reflexive transition.</p>

<p>HJ also has a reflexive transition when reading a 1, due to the reflexive transition on H.</p>

<p><img src="https://scown.space/assets/images/dfas/03d.svg" alt="NFA to DFA 4" /></p>

<p>From IJ we can read a 0 and end up in the final state EHJ. From those reading a 1 leaves us in HJ, which we’ve seen before. This covers all the transitions in the original NFA, so we’re done. Verifying that this DFA matches the same inputs as the NFA is left as an exercise for the reader.</p>

<p>“This is all well and good” I hear you say, “but what does this have to do with Regular Expressions”. We’re getting to that.</p>

<h2 id="regular-expressions">Regular Expressions</h2>

<p>Regular Expressions are a way of representing strings that are members of a Regular Language (a Regular Language being the set of all strings matched by a given Regular Expression).</p>

<p>The key limitation of Regular Language is that Regular Expressions cannot count - it is not possible to represent (for instance) balanced parentheses in a Regular Language.</p>

<p>There are 5 elementary Regular Expressions - two simple expressions and three compound expressions (parentheses can also be used to represent precedence).</p>

<ol>
  <li>𝜀, matching nothing.</li>
  <li><em>a</em>, matching a single character.</li>
  <li>Concatenation, <em>AB</em>, representing Regular Expression A followed by Regular Expression B.</li>
  <li>Union, <em>A|B</em> or sometimes <em>A+B</em>, representing either Regular Expression A or Regular Expression B.</li>
  <li><a href="https://en.wikipedia.org/wiki/Kleene_star">The Kleene Star</a>, <em>A*</em>, representing Regular Expression A 0 or more times.</li>
</ol>

<p>This is enough to build any Regular Expression. Other operators provided by most programming languages are just syntactic sugar. For example:</p>

<ul>
  <li>Character groups <em>[A-Z]</em> are just abbreviated unions.</li>
  <li>Optional matches, <em>A?</em>, are equivalent to <em>A|𝜀</em>.</li>
  <li>At least one matches, <em>A+</em>, are equivalent to <em>AA*</em>.</li>
  <li>Fixed count matches, such as <em>A{n}</em>, are equivalent to <em>A</em> repeated <em>n</em> times.</li>
</ul>

<p>It turns out that the five elementary Regular Expressions can all be represented as NFAs.</p>

<p><img src="https://scown.space/assets/images/dfas/04.svg" alt="Regular Expression NFAs" /></p>

<p>The simple expressions consist of two states joined by either 𝜀 or the character in question. The compound expressions are more interesting. The ovals containing Expression represent other Regular Expressions, with their start and final states connected via 𝜀 transitions to states in the compound expression.</p>

<p>As an example we’ll use the Regular Expression <code class="language-plaintext highlighter-rouge">((011|10)1*)|(00|11)(01*|𝜀)</code>. You should be able to convince yourself that this Regular Expression matches the same inputs as the NFA above. But we can also algorithmically compile it into a combination of the five elementary expressions:</p>

<p><img src="https://scown.space/assets/images/dfas/05.svg" alt="Regular Expression as NFA" /></p>

<p>The Regular Expression is a union of two parts. The first (the top line in the diagram) contains a further union, concatenated with a Kleene Star expression. The second union contains a concatenation of two unions.</p>

<p>Since this is an NFA, it can be compiled into a DFA:</p>

<p><img src="https://scown.space/assets/images/dfas/06.svg" alt="Regular Expression as DFA" /></p>

<p>Since this is not the same as our first compilation result, but matches the same input, we’ve also shown that two different NFAs can be equivalent.</p>

<p>When you compile a Regular Expression (such as with Java’s <code class="language-plaintext highlighter-rouge">Pattern.compile</code>), a process like this is what occurs. And since the DFA can be represented as a state table, once compiled, they are an efficient way to match a string. This also explains why Regular Expressions cannot count - they are equivalent to a Finite State Machine and are incapable of unbounded counting.</p>

<p>I find this to be a good base for understanding Regular Expressions. Having this understanding of why Regular Expressions are the way they are, their limitations and why they have those limitations, makes it easier to understand when they are appropriate to use and how to use them effectively.</p>]]></content><author><name>Alex Scown</name></author><category term="programming" /><summary type="html"><![CDATA[In a previous job I did a fair amount of mentoring. One piece I would use any excuse to bring out was a discussion of the theory behind regular expressions. It wasn’t just a digression - I found regular expressions much easier to read once I understood how they worked.]]></summary></entry><entry><title type="html">Now for the groundbreaking ceremony</title><link href="https://scown.space/meta/2018/02/17/groundbreaking-ceremony" rel="alternate" type="text/html" title="Now for the groundbreaking ceremony" /><published>2018-02-17T18:18:00+00:00</published><updated>2018-02-17T18:18:00+00:00</updated><id>https://scown.space/meta/2018/02/17/groundbreaking-ceremony</id><content type="html" xml:base="https://scown.space/meta/2018/02/17/groundbreaking-ceremony"><![CDATA[<p>Greetings friends! This is the first of what will hopefully be many posts at ScownSpace.</p>

<p>Expect occasional postings about programming, TV, wine, and whatever else I feel like writing about. My sense of humour
owes much to classic era episodes of <em>The Simpsons</em>, so expect recycled Simpsons jokes as well.</p>

<p>Hopefully you’ll find something here that is informative and/or entertaining.</p>

<p>Let us begin.</p>]]></content><author><name>Alex Scown</name></author><category term="meta" /><summary type="html"><![CDATA[Greetings friends! This is the first of what will hopefully be many posts at ScownSpace.]]></summary></entry></feed>