<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://catswhisker.xyz/">
  <id>http://catswhisker.xyz/</id>
  <title>The Cat's Whisker</title>
  <updated>2024-01-01T00:36:34Z</updated>
  <link rel="alternate" href="http://catswhisker.xyz/" type="text/html"/>
  <link rel="self" href="http://catswhisker.xyz/atom.xml" type="application/atom+xml"/>
  <author>
    <name>A. Cynic</name>
    <uri>http://catswhisker.xyz/about/</uri>
  </author>
  <entry>
    <id>tag:catswhisker.xyz,2024-01-01:/log/2023/12/31/fo_roundup_2023/</id>
    <title type="html">Things I made in 2023: A Year of Knits, Crochet, and 3D Creations</title>
    <published>2024-01-01T00:36:34Z</published>
    <updated>2024-01-01T00:36:34Z</updated>
    <link rel="alternate" href="http://catswhisker.xyz/log/2023/12/31/fo_roundup_2023/" type="text/html"/>
    <content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;I have continued to knit in 2023, and I also reminded myself how to crochet.
As usual, check the Ravelry link for the pattern, more photos, and more details of each project.
You can view all 13 of the projects mentioned below at once: &lt;a href="https://www.ravelry.com/projects/cristoperb?set=&amp;amp;page=&amp;amp;search=&amp;amp;sort=completed_%20status_changed_&amp;amp;view=thumbnail&amp;amp;years%5B%5D=2023"&gt;2023 Projects on Ravelry&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Click any of the images below for bigger versions.
And as always, thank you to my sister for making everything look better with her modeling and photography!&lt;/p&gt;
&lt;/div&gt;
&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle" class="title"&gt;Table of Contents&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_beware_the_mighty_septopus"&gt;Beware the Mighty Septopus!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_pom_poms"&gt;Pom poms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_the_big_projects"&gt;The big projects&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_chollas_bahama_blanket"&gt;Cholla&amp;#8217;s Bahama Blanket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_oceanspray_shawl"&gt;Oceanspray Shawl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_the_book_exchange_book_exchange_cardigan"&gt;The Book Exchange Book Exchange Cardigan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_crochet"&gt;Crochet&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_doilies"&gt;Doilies!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_yellow_hex_christmas_stocking"&gt;Yellow Hex Christmas Stocking&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_bonus_3d_prints"&gt;Bonus: 3D Prints&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_print_in_place"&gt;Print-in-place&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_card_kit"&gt;Card kit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_vase_mode"&gt;Vase mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_cookie_cutters"&gt;Cookie cutters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_up_next"&gt;Up next&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_beware_the_mighty_septopus"&gt;Beware the Mighty Septopus!&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/close.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/close-small.jpg" alt="close small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/mittens_tea.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/mittens_tea.jpg" alt="mittens tea"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/front-back.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/front-back-fade.gif" alt="front back fade" style="clip-path: ellipse(141px 152px at center center);shape-outside: ellipse(140px 153px at center center);float: left;margin-left: -20px;width: 60%;"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;At the end of &lt;a href="/log/2022/12/31/fo_roundup_2022/"&gt;last year&amp;#8217;s roundup&lt;/a&gt; I had finished a single octopus colorwork mitten for my sister.
I finished the pair, and also a sweater to go with them!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Both cephalopod designs (the mittens by Emily Peters and the sweater by Maia E. Sirnes) feature tentacles that wrap around the entire piece.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock right"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/mittens_lining.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/mittens_lining_small.jpg" alt="mittens lining small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I lined the mittens with polar fleece&amp;#8201;&amp;#8212;&amp;#8201;which was the first and, unfortunately, last thing I used my sewing machine for in 2023.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock right"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/mittens_snow.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/mittens_snow_small.jpg" alt="mittens snow small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For both pieces I managed the floats using &lt;a href="https://ysolda.com/blogs/journal/ladderback-jacquard-tutorial"&gt;ladderback jacquard&lt;/a&gt;.
The small mittens were a good practice for the sweater. In both projects I started the ladders using the lifted increase method, but those are visible in several places on the rightside of the sweater and I wish I had tried using the backwards loop cast on method mentioned in the ysolda tutorial (linked above).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/blocked_insideout_back.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/blocked_insideout_back_small.jpg" alt="blocked insideout back small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;The inside of the sweater showing my ad hoc ladderbacks&lt;/div&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/embrace-octopus-sweater"&gt;Mindy&amp;#8217;s Mighty Septopus&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/octopus-mittens"&gt;Octopus Mittens&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_pom_poms"&gt;Pom poms&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/ogo.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/ogo_small.jpg" alt="ogo small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Before finishing the mittens and sweater, I made a couple of beanies out of a single skein of closeout ($3) acrylic yarn.
(The hat on the left in the photo is Snap by Tin Can Knits which I made as a beta tester for &lt;a href="https://tincanknits.com/app"&gt;their new app&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/ufo.jpeg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/ufo_small.jpeg" alt="ufo small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In the fall I went on a road/hiking trip in the American Southwest. We stayed in Roswell, NM, on our first night, so I found and made an alien-themed beanie pattern before leaving.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Like the octopus pieces, I managed the floats in the colorblocks between and within the alien faces with ladderback jacquard.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/alien.jpeg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/alien_small.jpeg" alt="alien small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;I don&amp;#8217;t really want to believe&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock right"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/sockhead.jpeg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/sockhead_small.jpeg" alt="sockhead small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;While in the car I cast on for a second hat: the &lt;a href="https://www.ravelry.com/patterns/library/sockhead-slouch-hat"&gt;Sockhead Slouch Hat by Kelly McClure&lt;/a&gt;.
It is a slouchy stockinette cap meant to be done with a single skein of sock yarn.
I chose the Tiger Lily sock yarn because its turquoise and rust colors remind me of the Southwest.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I worked on the hat several nights in my tent during a 4-day, 70-mile hike on the &lt;a href="https://en.wikipedia.org/wiki/Arizona_Trail"&gt;Arizona Trail&lt;/a&gt;, more on the drive back through New Mexico, and finally finished the day we arrived home.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Winter hiking in Arizona is nice, except the sun sets so early that we were at camp for many hours before bed every night. It was nice to have a project to work on. I highly recommend something portable and stockinette like this pattern for winter hiking.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;
&lt;!--image::verbatim/mindysockhead_small.jpg[float=left, link=verbatim/mindysockhead.jpg]--&gt;
&lt;div class="imageblock left" style="clip-path: ellipse(168px closest-side at center center);shape-outside: ellipse(176px 214px at center center);"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/mindysockhead.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/mindysockhead_small.jpg" alt="mindysockhead small" style="/*! clip-path: ellipse(); *//*! shape-outside: ellipse(239px closest-side at center center); */"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Unfortunately I didn&amp;#8217;t take any photos of it while working on the trail, but my sister was kind enough to model it when we got home.
Despite it having no pom pom, this has become my most-worn hat I&amp;#8217;ve made&amp;#8230;&amp;#8203; but even the superwash merino sock yarn can become quite itchy to me!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Kelly also has a &lt;a href="https://www.ravelry.com/patterns/library/sockhead-cowl"&gt;Sockhead Cowl&lt;/a&gt; pattern to match the hat which looks like it could work like a neck gator (I wear my Buffs all the time), so I am definitely planning on making one of those.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/snap"&gt;O&amp;#8217;go bulky hats&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/out-of-this-world-alien-beanie"&gt;Roswell Cap&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/sockhead-slouch-hat"&gt;Sockhead on the Arizona Trail&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_the_big_projects"&gt;The big projects&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;While I think the Embrace Octopus sweater is the most visually striking project of the year, once I calculated the gauge to work with lighter yarn (including some modifications to the charts), the actual knitting went pretty quickly.
I did finish three projects that took significant amounts of time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_chollas_bahama_blanket"&gt;Cholla&amp;#8217;s Bahama Blanket&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/texture.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/texture_small.jpg" alt="texture small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/floor-corner.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/floor-corner_small.jpg" alt="floor corner small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I started this in the summer of 2022 and didn&amp;#8217;t finish until February 2023.
In 2020 I finished two Tunisian crochet throw blankets, so working on this one felt quite familiar.
Though this is my first chevron pattern.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I made this one for my sister&amp;#8217;s cat Cholla.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/bahama-blanket"&gt;Cholla&amp;#8217;s Bahama Blanket&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_oceanspray_shawl"&gt;Oceanspray Shawl&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/shawl.jpeg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/shawl_small.jpeg" alt="shawl small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/sunflowers.jpeg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/sunflowers_small.jpeg" alt="sunflowers small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://knitty.com/ISSUEwbis11/PATToceanspray.php"&gt;The Oceanspray shawl&lt;/a&gt; is about 81,000 stitches.
The first two thirds of the pattern are mostly stockinette (with some yarnovers), which drag on a bit, but the payoff is the elm leaf edging.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/elm.jpeg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/elm.jpeg" alt="elm"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock right"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/kerchief.jpeg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/kerchief_small.jpeg" alt="kerchief small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;18" x 12"&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I also did a little lace kerchief in the same yarn.
(I still have several skeins of the green Alpaca Cloud yarn left, so another large lace shawl is probably in the queue for 2024.)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/oceanspray"&gt;Oceanspray&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/ostrich-feather-lace-kerchief"&gt;Ostrich Feather Lace Kerchief&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_the_book_exchange_book_exchange_cardigan"&gt;The Book Exchange Book Exchange Cardigan&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/bookexchange.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/bookexchange.jpg" alt="bookexchange"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/book_exchange_wormhead.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/book_exchange_wormhead_small.jpg" alt="book exchange wormhead small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Years ago, before I really knew how to knit (at least before I had made any garments), I received book &lt;a href="https://www.ravelry.com/patterns/library/the-book-exchange-cardigan"&gt;&lt;em&gt;Knitting Brioche&lt;/em&gt;&lt;/a&gt; as a gift.
From the patterns in the back I selected the Book Exchange Cardigan as one I would like to try some day. Later, about a year and a half ago, WEBS was having a sale on Cascade 220 ($8/100g) so I bought 10 skeins with that cardigan in mind. This October I actually cast on. I had one gauge mishap and had to restart after almost finishing the back&amp;#8230;&amp;#8203; but I finally finished (and it fits)!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock right"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/saddle_seam.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/saddle_seam_small.jpg" alt="saddle seam small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;This cardigan has saddle shoulders and a cowl collar&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I haven&amp;#8217;t even calculated how many stitches this cardigan contains, but it took me over 3 months of dedicated knitting and 820g (1.8 lb) of wool.
The Cascade 220 yarn is actually soft enough for me to wear, it fits (even buttoned up), the brioche fabric is fluffy, and it has pockets!
It is my favorite garment I&amp;#8217;ve made for myself so far.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/bookexchangebooks.jpeg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/bookexchangebooks_small.jpeg" alt="bookexchangebooks small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In the book, Nancy says the pattern is named after a used bookstore she frequented in Amsterdam.
In a synchronicitous turn of events I finished the cardigan on December 20th, and my family had decided that we would (for the first time) do a "white elephant" style book exchange on Christmas Eve as our Christmas gathering this year. So I got to wear my new Book Exchange to a book exchange.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/the-book-exchange-cardigan"&gt;The Book Exchange Book Exchange Cardigan&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_crochet"&gt;Crochet&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/candy.jpeg" alt="candy"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I haven&amp;#8217;t crocheted (except for Tunisian) since completing some &lt;a href="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/"&gt;simple crochet beanies&lt;/a&gt; back in 2019, so I decided to do some small projects to remind myself how.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;One thing I discovered after completing most of the projects below is that I had been crocheting wrong!
I was creating the new stitch to the left of the stitch below (with the right side facing).
But the usual way is to create the stitch to the right of the stitch in the previous row.
My way not only introduces more left-leaning bias when worked in the round, but it can be more difficult especially right before chains that tend to be very tight.
I don&amp;#8217;t know if I always crocheted that way, or if I only just recently re-taught myself wrong  🤷&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For reference, Shelley Husband has a blog post on where to insert when creating stitches (think of rightside stitches as a capital letter P, &amp;#8220;The circley bit of the P is where you poke your hook if you’re working into the stitch&amp;#8221;): &lt;a href="https://shelleyhusbandcrochet.com/how-to-work-into-a-stitch-and-around-and-between-and/"&gt;How to work into a stitch (and around, and between and…)&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_doilies"&gt;Doilies!&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/doilies.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/doilies_small.jpg" alt="doilies small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Clockwise from top-left: Dawnglow by Julia Hart with 2.25mm hook, Boo! by Marsha Glassner with 1.75mm hook, Dawnglow #2 with 1.75mm hook, Elise by Grace Fearon with Clover 1.75mm hook&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Thread crochet has always looked impressive to me, so I decided to get back into crochet by trying to make some doilies (using #10 thread).
I have been happy to find active designers publishing modern doily patterns. These three in particular have many patterns I&amp;#8217;d like to try:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://gracefearon.com/"&gt;Grace Fearon&lt;/a&gt;&amp;#8201;&amp;#8212;&amp;#8201;She has &lt;a href="https://www.ravelry.com/designers/grace-fearon"&gt;157 designs on Ravelry&lt;/a&gt; and several print books.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.draiguna.com/"&gt;Julia Hart&lt;/a&gt;&amp;#8201;&amp;#8212;&amp;#8201;&lt;a href="https://www.ravelry.com/designers/julia-hart"&gt;104 designs on Ravelry&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://en.iriskabeat.ru/"&gt;Irina Maleeva&lt;/a&gt;&amp;#8201;&amp;#8212;&amp;#8201;&lt;a href="https://www.ravelry.com/designers/irina-maleeva"&gt;31 designs on Ravelry&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/twotoneboo.jpeg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/twotoneboo_small.jpeg" alt="twotoneboo small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;One thing I learned from my first attempt (which turned out much larger than expected) is that you can&amp;#8217;t trust the size stamped on cheap steel hooks!
I measured the ones I had with some calipers, and not only were many of the sizes wrong, they weren&amp;#8217;t even monotonic: some of the smaller sizes were actually larger in diameter than the ones that were supposed to be several sizes larger than them.
I ended up buying a set of &lt;a href="https://www.amazon.com/Clover-Amour-Steel-Crochet-Hook/dp/B00KB68U3C?th=1"&gt;Clover steel hooks&lt;/a&gt; which are much more accurate (and ergonomic).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock right"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/snowflakes.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/snowflakes_small.jpg" alt="snowflakes small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So far my favorite result is a textured doily called &lt;a href="https://www.ravelry.com/patterns/library/elise-17"&gt;Elise by Grace Fearon&lt;/a&gt; that I did in a soft blue thread.
But my most impressive is a two-color version of Marsha Glassner&amp;#8217;s Halloween themed ghost doily I worked out how to do.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For Christmas I made some snowflakes following an Irina Maleeva pattern.
The best one (fewest mistakes) was done in sparkly white fingering weight wool rather than cotton thread.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/dawnglow"&gt;Four Practice Doilies&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/boo"&gt;Two-tone Boo!&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/ariel-snowflake-x6"&gt;Christmas Ariel snowflakes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_yellow_hex_christmas_stocking"&gt;Yellow Hex Christmas Stocking&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/crochet.jpg" alt="crochet"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;30 years ago my mom crocheted hexagon Christmas stockings for me and my four siblings. At some point my youngest sister&amp;#8217;s stocking went missing. This year my mom and I decided to make a replacement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/stocking.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/stocking_small.jpg" alt="stocking small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;New stocking (right) next to reverse-engineered old stocking&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The original pattern could not be found. I found several similar patterns including &lt;a href="https://www.ravelry.com/patterns/library/vintage-hexagon-christmas-stocking"&gt;this free one&lt;/a&gt; on Ravelry, but none of them were the same. So I reversed &lt;a href="https://images4-a.ravelrycache.com/uploads/cristoperb/964418434/mindy_stocking.jpg"&gt;the pattern&lt;/a&gt; from one of the old completed stockings. My mom&amp;#8217;s toe hexes are laid out differently than any of the other patterns I found: to get a round toe she seamed the pointy bits to the inside.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We made it using whatever worsted acrylic that was in my stash (most of it I inherited from my mom or sisters and is probably 20 years old itself!) plus some sparkly white sock yarn (held double). All of the old stockings are made from red, white, and green, but I actually really like the bright colors of this and it suits my sister&amp;#8217;s personality.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/yellow-hex-replacement-christmas-stocking"&gt;Yellow Hex Replacement Christmas Stocking&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_bonus_3d_prints"&gt;Bonus: 3D Prints&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/dragon.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/dragon_small.jpg" alt="dragon small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Just before Christmas a friend gave me a 3D printer he no longer has time to use (an Ender 3 Pro)!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I have zero prior experience with 3d printing, but my very first print was successful: a little BMO character from Adventure Time (I scaled it to 25% before printing, so it is only about 1" across).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But my attempts at printing were not always immediately successful.
In particular any model with small-diameter features on the first layer would often not adhere.
After spending hours leveling and re-leveling, I found that the most effective thing was usually to wash the build surface with soap and water (and not merely wipe it with isopropyl).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock right"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/bmo.jpg" alt="bmo"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To increase the ratio of my time spent printing vs leveling, I replaced the build surface with a PEI surface (which is great because once the bed cools down the prints pop right off), replaced the bed-leveling springs with stiff silicone spacers (as recommended in several reddit threads), and installed a &lt;a href="https://www.amazon.com/Creality-Leveling-Compatible-Mainboard-Printer/dp/B098LQ9WPX"&gt;CR Touch&lt;/a&gt; &amp;#8220;auto bed leveling&amp;#8221; sensor which replaces the Z-axis limit switch with a sensor that can always zero to the surface of the print bed.
To take full advantage of the CR Touch I upgraded the printer&amp;#8217;s firmware to a version of Marlin that supports mesh-based auto leveling (I used the &lt;a href="https://shinyupgrades.com/pages/ender-3-pro-firmware-install-guide-update-firmware-with-microsd-card"&gt;pre-built firmware by Shiny Upgrades&lt;/a&gt;; they also have a good general guide here: &lt;a href="https://shinyupgrades.com/pages/ender-3-pro-starter-guide"&gt;Ender 3 Pro Starter Guide&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I still have tons to learn, but I am now getting reliable first layer adhesion even for models with tiny circles.
Overall, hobby 3d printing feels closely adjacent to yarn crafts.
Except it is cheaper ($20/kg of PLA filament vs $200/kg of wool yarn) and faster (a large print can take 24 hours plus some setup time, while a large knitting project can take 24 weeks or more, all of it labor intensive).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There are currently several competing model/project database websites (Thingiverse, &lt;a href="https://www.printables.com/"&gt;Printables&lt;/a&gt;, &lt;a href="https://thangs.com/"&gt;Thangs&lt;/a&gt;, &amp;#8230;&amp;#8203;), though none of them are as feature-complete as Ravelry is for yarn crafts.
I like the look-and-feel of Printables best, but Thingiverse has more models and its database of makes (&amp;#8220;projects&amp;#8221; in Ravelry terms) prompts for more metadata which I like.
For now I&amp;#8217;m using both.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&amp;#8201;&amp;#8212;&amp;#8201;Thingiverse Make: &lt;a href="https://www.thingiverse.com/make:1144377"&gt;Adventure Time BMO&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_print_in_place"&gt;Print-in-place&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/printplace.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/printplace_small.jpg" alt="printplace small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;A springy gecko and a print-in-place shark&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;One of the coolest classes of designs made possible by 3d printing are so-called &amp;#8220;print-in-place&amp;#8221; models which have multiple parts joined by hinges printed as a single piece.
Once the model is finished it can articulate with no assembly required.
So far I&amp;#8217;ve tried a hammer head shark and a 30-segment snake model, and they both worked perfectly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Printables Make: &lt;a href="https://www.printables.com/model/507934-articulated-hammerhead-shark/comments/1389402"&gt;Articulated Hammerhead Shark&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Printables Make: &lt;a href="https://www.printables.com/model/538160-articulated-bone-dragon/comments/1386767"&gt;Articulated Bone Dragon&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_card_kit"&gt;Card kit&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/xwing.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/xwing_small.jpg" alt="xwing small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Another technique is to design models which print flat and then snap together into a 3d shape like this Christmas-themed X-Wing fighter.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Thingiverse Make: &lt;a href="https://www.thingiverse.com/make:1144385"&gt;Snowflake X-Wing Kit Card Ornament&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_vase_mode"&gt;Vase mode&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/vase.jpg"&gt;&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/vase_small.jpg" alt="vase small"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Vase mode (or &amp;#8220;Spiralize Outer Contour&amp;#8221; in Cura) is a way of printing vase-like models without a Z seam. The print nozzle continues around in a seamless spiral rather than printing discrete layers. This is analogous to crocheting continuously in the round instead of joining each round with a slipstitch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I printed this pencil holder in some ombre filament I got as a Christmas gift (&lt;a href="https://www.amazon.com/Creality-3D-Colourful-Toughness-Dimensional/dp/B0C39XCDSY"&gt;Creality Ender-PLA+ in colorway &amp;#8220;Colourful&amp;#8221;&lt;/a&gt;).
I love how it turned out!
Though it is a bit squishy&amp;#8230;&amp;#8203; I should have probably increased the extrusion width to 0.6mm (with my 0.4mm nozzle). I will try that on future vase-mode prints.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Printables Make: &lt;a href="https://www.printables.com/model/327316-wavy-pencil-holder-vase-mode/comments/1389462"&gt;Wavy Pencil Holder&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_cookie_cutters"&gt;Cookie cutters&lt;/h3&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2023/12/31/fo_roundup_2023/verbatim/cookiecutter.jpg" alt="cookiecutter"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;By far the most &lt;em&gt;pracitcal&lt;/em&gt; prints I&amp;#8217;ve made so far are cookie cutters!
The most popular is the fat unicorn.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Printables Make: &lt;a href="https://www.printables.com/model/336332-unicorn-cookie-cutter/comments/1389441"&gt;Unicorn cookie cutter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_up_next"&gt;Up next&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In 2024 I hope to focus even more on knitting. Most immediately that means probably making a pair of &lt;a href="https://www.ravelry.com/patterns/library/monkey-socks"&gt;Cookie A&amp;#8217;s Monkey Socks&lt;/a&gt;, but more long term I intend to complete at least Level 1 of The Knitting Guild Association&amp;#8217;s &lt;a href="https://tkga.org/certification/master-hand-knitting/"&gt;Master Hand Knitter program&lt;/a&gt;. I haven&amp;#8217;t signed up yet, but I just registered as a TKGA member while writing this post!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I also hope to dedicate time to creating some knitting CAD tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In addition to knitting and crochet, I have a growing queue of sewing projects. I already have all of the materials for the &lt;a href="https://klumhouse.com/products/fremont-pattern"&gt;Fremont tote bag&lt;/a&gt;, so that will probably be first up!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
    <summary type="html">I'm still knitting (and crocheting (and 3d printing!)))</summary>
  </entry>
  <entry>
    <id>tag:catswhisker.xyz,2023-08-11:/log/2023/8/11/2023_denver_open/</id>
    <title type="html">2023 Denver Open</title>
    <published>2023-08-11T19:16:30Z</published>
    <updated>2023-08-11T19:16:30Z</updated>
    <link rel="alternate" href="http://catswhisker.xyz/log/2023/8/11/2023_denver_open/" type="text/html"/>
    <content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;I had the opportunity to play in the Denver Open 2023 chess tournament (along with almost 200 other players!)
I played in the U1800 section, winning 4 games and losing 1 to tie (with 7 other people!) for the 2nd place prize pool (I got $100).
This is my best tournament performance so far; my rating increased from 1501 to 1574.
My rating is still provisional until I play two more rated games. I&amp;#8217;m hoping to be close to 1600 after my next tournament.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="https://photos.google.com/share/AF1QipOACMkfty7eH9Ie1Mi6X2JifnobHb--hng_YI6jUYF8ggXKLfNRZ3wHDwsc4ggrXQ?key=ck5rTHdReEFFbXpOSEMzVXg3RkVQQzM3eGNSRHRn"&gt;&lt;img src="/log/2023/8/11/2023_denver_open/round5-2.jpg" alt="round5 2"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 1. Round 5 just before my opponent sacs a rook. Photo by John Brezina.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For an overview of the event see &lt;a href="https://denverchess.com/news/article/2220"&gt;DCC 2023 Denver Open report&lt;/a&gt; on the Denver Chess Club&amp;#8217;s site.
For the official results and crosstable see the &lt;a href="https://www.uschess.org/msa/XtblMain.php?202307233582-17031943"&gt;2023 Denver Open USCF event page&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Below are my five games with a few notes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_round_1"&gt;Round 1&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;My first opponent was rated 1141, almost 500 points lower than me, so I was hoping for a non-taxing, preferably short game to give me time to relax in my hotel room before the more difficult rounds later in the day.
Instead I got a 3+ hour game where I was paranoid the entire time I would mess up the end game and draw (or lose).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I had the white pieces and played 1.e4. She played a French, so I played the Advance since that&amp;#8217;s the only variation I know comfortably.
But she exchanged lightsquare bishops on b5 and then left her queen on that diagonal preventing me from castling.
It was uncomfortable, but she underestimated my knight moves and lost 2 pawns before we traded down to an endgame.
I made several mistakes in the conversion but managed to stop her pawns and push mine to victory.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;iframe width=600 height=371 src="https://lichess.org/study/embed/d4KvBiRa/u0loJvRB?theme=blue" frameborder=0&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_round_2"&gt;Round 2&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In the second round I had the black pieces against a 1700.
This time I played the French and they played the King&amp;#8217;s Indian Attack.
I don&amp;#8217;t know how to play against the KIA so I just mirrored white and fianchettoed my bishop as well.
I think I had a worse understanding of the position for most of the game, but we got to a point where they could trade their bishop for my bishop or for my knight and they chose my knight (&lt;a href="https://lichess.org/study/d4KvBiRa/7lBfGgCk#53"&gt;27..Bxc4?&lt;/a&gt;).
That decision left them with weak lightsquares, me with a strong lightsquare bishop, and suddenly I was the one making threats against their king.
They resigned with a Mate-in-1 on the board.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;iframe width=600 height=371 src="https://lichess.org/study/embed/d4KvBiRa/7lBfGgCk?theme=blue" frameborder=0&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_round_3"&gt;Round 3&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The last round of the day and I was hoping for a good pairing to give me a chance of a perfect 3-0.
Instead I got the black pieces against the highest rated player in the U1800 section.
This was another King&amp;#8217;s Indian Attack. Ugh.
Whatever I did in Round 2 against a similarly rated opponent seemed to work, so I once again went for a setup where I fianchettoed my kingside bishop.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I never really felt in control this game, and I got into some tactical trouble, but calculated out a tenacious defense that saved a piece that I was proud of.
Unfortunately the resulting position was worse and more tactically dangerous for black than I realized (until I was once again losing a piece with no way out).
I resigned after 24 moves.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;iframe width=600 height=371 src="https://lichess.org/study/embed/d4KvBiRa/EKBjItvt?theme=blue" frameborder=0&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_round_4"&gt;Round 4&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The next morning I was paired with the white pieces against a 1234-rated player.
Out of the opening I won one of their center pawns, but in compensation they got a tremendous amount of activity.
I think we were about equal (though I would need several moves to develop my bishops), when he decided to try an exchange sacrifice with 17&amp;#8230;&amp;#8203;Rxb2?!
It was exciting but turned out to be unsound and I soon capitalized on their weak back rank; they resigned with Mate-in-1 on the board.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;iframe width=600 height=371 src="https://lichess.org/study/embed/d4KvBiRa/HTEWpPen?theme=blue" frameborder=0&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_round_5"&gt;Round 5&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Last round. I have white again. If I win then I probably get some prize money.
We both played some opening inaccuracies, but I saw a chance to sacrifice a pawn for a strong positional advantage. I had to calculate a bunch of knight moves which hurt my poor little brain, but it worked: out of the opening I was down a pawn but +5.5 according to Stockfish!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I continued to restrict my opponent&amp;#8217;s moves until they finally sacrificed an entire rook just to be able to move their pieces.
Out of all of the tournament games I&amp;#8217;ve played so far, this one felt by far the most like I was playing real, positional chess.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;iframe width=600 height=371 src="https://lichess.org/study/embed/d4KvBiRa/SEmc5xA4?theme=blue" frameborder=0&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
    <summary type="html">My best chess tournament performance so far.</summary>
  </entry>
  <entry>
    <id>tag:catswhisker.xyz,2023-01-01:/log/2022/12/31/fo_roundup_2022/</id>
    <title type="html">Knit &amp; Crochet Finished Object Roundup 2020-2022</title>
    <published>2023-01-01T06:57:46Z</published>
    <updated>2023-01-01T06:57:46Z</updated>
    <link rel="alternate" href="http://catswhisker.xyz/log/2022/12/31/fo_roundup_2022/" type="text/html"/>
    <content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;I&amp;#8217;m currently bringing in the new year while knitting a mitten.
Here&amp;#8217;s a quick look back at how I got here. (As usual, check the Ravelry link for the pattern, more photos, and more details of each project.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_2020_the_year_of_blankets"&gt;2020 The Year of Blankets&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In 2019 I wrote about how I started to knit again and finished a few projects (&lt;a href="/log/2019/12/3/fo_december/"&gt;my first pair of socks and some hats&lt;/a&gt;) after having learned years earlier but never having finished anything other than a scarf.
I had hoped that was the start of my knitting momentum, but I did even less in 2020.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_tunisian_crochet_blankets"&gt;Tunisian Crochet Blankets&lt;/h3&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/rgb_blanket.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/rgb_blanket.jpg" alt="rgb blanket"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/christmas_blanket.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/christmas_blanket.jpg" alt="christmas blanket"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Although I knit very little in 2020, I did experiment with Tunisian crochet and finished two blankets!
I liked the first one so much that I made another one for my sister at the end of the year.
They are both just Tunisian full stitch with a single crochet edge.
The yarn I used is Premier Yarn&amp;#8217;s Puzzle, which is a very soft and fuzzy bulky acrylic.
The Tunisian full stitch texture works well with it, and the blankets are like very cozy chain mail.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/moms-rgb-puzzle-blanket"&gt;RGB Blanket&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/christmas-blanket"&gt;Christmas Blanket&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_doubleknit_potholder"&gt;Doubleknit Potholder&lt;/h3&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/potholder.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/potholder.jpg" alt="potholder"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I did knit one thing! A doubleknit potholder I made for my sister who raises chickens (that&amp;#8217;s a hen duplicate stitched into one of the green diamonds). I designed the colorwork chart. It is my first real attempt at doubleknitting, using cotton yarn (so it can be used as a potholder without melting or burning), in a rush for Christmas, and unsurprisingly the tension is pretty wonky. It still gets used to this day, but it is even less square than when it was new.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/marshall-potholder"&gt;Marshall Potholder&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_2021_more_crochet_experiments"&gt;2021 More Crochet Experiments&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_toe_up_socks"&gt;Toe-up socks&lt;/h3&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/toeup_socks.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/toeup_socks.jpg" alt="toeup socks"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Again I didn&amp;#8217;t end up knitting much in 2021, but I did complete a pair of plain toe-up socks which [mostly] fit their intended recipient and were overall much better than my first attempt at socks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/slip-stitch-heel-basic-socks"&gt;Toe-Up Plan Mom Socks&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_knit_brim_crochet_hats"&gt;Knit-brim Crochet hats&lt;/h3&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/knitbrim_crochet_hat.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/knitbrim_crochet_hat.jpg" alt="knitbrim crochet hat"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/honeycomb_hat.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/honeycomb_hat.jpg" alt="honeycomb hat"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I also made a couple of hats where I crocheted (or Tunisian crocheted in the case of the honeycomb one) the hat body and knit the ribbed brim.
I really like the combination of Tunisian for the top of the hat and knit for the rib; I will experiment with that further.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/simple-crochet-beanie-2"&gt;Kit Rib Crochet Beanie&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/honeycomb-beanie-v1"&gt;Honeycomb Beanie v1&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_tunisian_scarf"&gt;Tunisian scarf&lt;/h3&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/daisy_scarf.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/daisy_scarf.jpg" alt="daisy scarf"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I also designed a tunisian simple stitch scarf for my sister.
My intention was to surface cross stitch a graphic into the scarf (using the grid created by the tunisian simple stitches), but the scarf had too much curl.
I&amp;#8217;ve designed a second version as a tube, to be crocheted in the round (which I think will be easier than working flat anyway), to solve the curling issue (and to more easily add pockets) that I need to get started on some day.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/daisy-scarf-prototype"&gt;Daisy Scarf Prototype&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_2022_the_year_of_sweaters"&gt;2022 The Year of Sweaters!&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This year is the year where I finally feel like I&amp;#8217;ve become a knitter!
I made my first sweater(s), first colorwork socks, first lace, first mittens.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_socks_and_mittens"&gt;Socks and Mittens&lt;/h3&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/daisy_sock.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/daisy_sock.jpg" alt="daisy sock"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I branched out into some more complicated socks, including some lacey patterns (like this design by Wendy Johnson) and a colorwork pattern.
This first pair was meant to be a Christmas gift but I didn&amp;#8217;t finish it until January. This is the first time I have bought some fancy hand-dyed yarn (from an Etsy seller) for a project. (The yarn ended up producing some flashing/inadvertant stripes; oh well :shrug:)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/seaweed-socks"&gt;Daisy Seaweed Socks&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/vines_sock.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/vines_sock.jpg" alt="vines sock"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With the left over yarn I made a short pair of socks for another sister.
This one uses the free &lt;a href="https://www.ravelry.com/patterns/library/a-thousand-vines"&gt;A Thousand Vines pattern by Nancy Pelletier&lt;/a&gt;, which I had to modify to make a bit larger in circumference.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/a-thousand-vines"&gt;A Thousand Vines (but larger)&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/mittens.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/mittens.jpg" alt="mittens"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I also made some mittens that incorporate the same lace pattern from the Seaweed Socks pattern (one pair without the yarnovers, to make it a little warmer).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/arched-gusset-mittens"&gt;Daisy Seaweed Mittens&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/sweetdumplin_socks.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/sweetdumplin_socks.jpg" alt="sweetdumplin socks"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;These socks are from a &lt;a href="https://universalyarn.com/collections/patterns/products/sweet-dumplin-socks"&gt;free colorwork pattern&lt;/a&gt; using some Universal Bella Cash yarn I got on sale.
I&amp;#8217;m very happy with how they turned out.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/sweet-dumplin-socks-mkal"&gt;Sweet Dumplin' Socks&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_echo_flower_shawl"&gt;Echo Flower Shawl&lt;/h3&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/shawl.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/shawl.jpg" alt="shawl"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I&amp;#8217;m not even sure what a shawl is for, but I came across several free patterns of impressive-looking lace I want to try.
First up is this &lt;a href="https://www.ravelry.com/patterns/library/echo-flower-shawl"&gt;Echo Flower Shawl pattern&lt;/a&gt; by Jenny Johnson Johnen.
The pattern incudes a full shawl as well as a smaller &amp;#8220;shoulderette&amp;#8221; which I made.
My first lace pattern&amp;#8230;&amp;#8203; it was fun to see it open up with blocking.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/echo-flower-shawl"&gt;Echo Flower Shawl&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_sweaters"&gt;Sweaters&lt;/h3&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/flax.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/flax.jpg" alt="flax"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I finally made a sweater!
I first bought some bulky wool yarn to try a circular yoke design, but then I got on sale some worsted-weight acrylic yarn and decided to make a &lt;a href="https://www.tincanknits.com/pattern/flax"&gt;Flax by Tin Can Knits&lt;/a&gt; (a very popular topdown, seamless raglan).
I still haven&amp;#8217;t gotten to the bulky colorwork sweater.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/flax"&gt;first sweater! (colorblock Flax with brioche mittcuffs)&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/phrancko.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/phrancko.jpg" alt="phrancko"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I wanted to make a T-shirt, and I got some rustic linen/wool/cotton yarn on sale that I thought might work.
The pattern uses Phrancko&amp;#8217;s seamless set-in sleeve construction (&lt;a href="https://phrancko.com/" class="bare"&gt;https://phrancko.com/&lt;/a&gt;).
I also attempted a patch pocket.
It turns out the yarn is both heavier and itchier than I expected, so it is more like a short-sleeve sweater and I haven&amp;#8217;t worn it much.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/phranckos-seamless-set-in-sleeves"&gt;Nerdy Hippie Tee&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/handsomechris.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/handsomechris.jpg" alt="handsomechris"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For my birthday I got some Aran-weight wool yarn that I made into an Aran sweater following Caryn Shaffer&amp;#8217;s free &lt;a href="https://www.ravelry.com/patterns/library/the-handsome-chris-pullover"&gt;Handsome Chris Pullover pattern&lt;/a&gt; (it is based on the sweater featured in the &lt;em&gt;Knives Out&lt;/em&gt; movie).
This was my first seamed garment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/the-handsome-chris-pullover"&gt; a handsome chris for chris&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_shadow_knit_potholder"&gt;Shadow Knit Potholder&lt;/h3&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/shadow1.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/shadow1.jpg" alt="shadow1"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/shadow2.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/shadow2.jpg" alt="shadow2"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I have plans to make a shadow knit sweater.
To practice that technique, I made this potholder.
The idea is that when viewed straight on it looks like horizontal stripes, but when viewed at an acute angle, vertical stripes appear.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/pot-holders"&gt;Shadow Knit Potholder&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_hats"&gt;Hats&lt;/h3&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/spanish1.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/spanish1.jpg" alt="spanish1"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/spanish2.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/spanish2.jpg" alt="spanish2"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;My sister brought me a skein of wool yarn from a trip to Spain, and I used it to make a couple of cabled hats designed by Irina Dmitrieva.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/iced-hat"&gt;Spanish Iced Hat&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/pinecone-hat"&gt;Spanish Pinecone Hat&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/1898_hat.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/1898_hat.jpg" alt="1898 hat"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Maybe my favorite hat I&amp;#8217;ve made, with its fun and warm double-thick brim.
It was designed by Kristine Byrnes for the Seamen&amp;#8217;s Church Institute&amp;#8217;s &lt;a href="https://seamenschurch.org/programs-services/christmas-at-sea/"&gt;Christmas At Sea program&lt;/a&gt;.
I made this one out of leftover yarn from my Flax sweater.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/1898-hat"&gt;1898 Hat&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_up_next"&gt;Up next&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="verbatim/octopus.jpg"&gt;&lt;img src="/log/2022/12/31/fo_roundup_2022/verbatim/octopus.jpg" alt="octopus"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I knit my sister one of these octopus mittens (based on &lt;a href="https://www.ravelry.com/patterns/library/octopus-mittens"&gt;the beautiful pattern by Emily Peters&lt;/a&gt;).
I&amp;#8217;m currently working on the second one. And then early next year the plan is to make a matching &lt;a href="https://www.ravelry.com/patterns/library/embrace-octopus-sweater"&gt;Embrace Octopus Sweater&lt;/a&gt;! We already bought the yarn.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
    <summary type="html">I started knitting again, again</summary>
  </entry>
  <entry>
    <id>tag:catswhisker.xyz,2022-10-24:/log/2022/10/23/tournament_report_fall_classic_2022/</id>
    <title type="html">Tournament Report: DCC Fall Classic 2022</title>
    <published>2022-10-24T01:45:58Z</published>
    <updated>2022-10-24T01:45:58Z</updated>
    <link rel="alternate" href="http://catswhisker.xyz/log/2022/10/23/tournament_report_fall_classic_2022/" type="text/html"/>
    <content type="html">&lt;div class="sect1"&gt;
&lt;h2 id="_background"&gt;Background&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I played my very first over-the-board tournament at the 2019 Denver Open.
I did surprisingly well in the U1800 section at that tournament, getting 3 points our of 5, and finishing with a rather optimistic provisional USCF rating of 1615.
I wrote a full report: &lt;a href="/log/2019/5/10/tournament_report_denver_open_2019/"&gt;Tournament Report: Denver Open 2019 (my first chess tournament!)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Later that year I had the chance to compete in a rapid tournament (game in 25 minutes with a 5 second delay).
I won two and lost two games to finish in the middle of the pack.
At least one of my losses was to the overall winner of the tournament.
I wrote a much-less thorough report of that event: &lt;a href="/log/2019/8/15/tournament_report_dcc_rapid/"&gt;Tournament Report: DCC Rapid&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Denver Open was canceled for the next two years because of Covid19, but I did manage to play the 1-day, 3-round &amp;#8220;DCC Nearly Normal Tournament&amp;#8221; in June, 2021.
I lost my first two rounds (my oponent during Round 2, where I let a nice opening advantage slip away, commentated our game in the DCC database: &lt;a href="https://denverchess.com/games/view/19946"&gt;Jason McEwen (1761) - Chris Burkhardt (1615)&lt;/a&gt;), and then the tournament software gave me a bye for round 3.
Apparently a bye was good for 1 point, so at least I didn&amp;#8217;t get last place, though my rating dropped to 1523.
The tournament director said that if I wanted to I could play a rated game against a player in the lower section who was also given a bye, and I accepted.
I had a relatively short game against a 635 rated player.
I won, but the game got reported to the USCF as a loss for me, dropping my provisional rating further to 1409.
I contacted the tournament director who in turn contacted USCF, but it has been three years and it is still not corrected. Oh well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Denver Open returned in May, 2022, and I played (along with a friend from our local chess group)!
I felt sorry for my opponents facing me with an erroneously low rating, but I was confident I would be able to get my rating back to where it should be.
I was playing in the U1800 section and my friend in the U1400; we were hoping we would both win some cash.
I won 2, lost 3, finished in 42nd place (toward the bottom), and my rating dropped to 1370.
My chess club friend didn&amp;#8217;t do much better.
Chess is hard!
In my first game I blundered a totally winning endgame to a loss (a 21 point blunder according to stockfish).
&lt;a href="https://lichess.org/study/tKBNYju0"&gt;Lichess study for my Denver Open 2022 games&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2022/10/23/tournament_report_fall_classic_2022/dasari_41.png" alt="dasari 41"&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 1. Black to move and lose. Round 1 at Denver Open 2022&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_fall_classic_2022"&gt;Fall Classic 2022&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;That brings us to the Fall Classic this October.
I played in the U1600 section (I paid $15 extra to play one section up), and my brother-in-law played in the U1400 section as his first ever over-the-board tournament!
I wrote in my first tournament report, over three years ago, that I had meant to study endgames (read &lt;em&gt;De la Villa’s 100 Endgames You Must Know&lt;/em&gt;) but didn&amp;#8217;t get around to it.
I still haven&amp;#8217;t.
Though I think my openings are better just from playing games on lichess and looking at the database afterwards.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Many of my tournament losses have been from better positions that I just couldn&amp;#8217;t hang on to.
My goal in the Fall Classic was to stay focused even when I have a winning position.
I&amp;#8217;m happy with how I did on that front. I won all the games I was winning, and managed a draw in one of the games I was losing. According to the lichess analysis, I played over 90% accuracy in every game (which means that only 10% of my moves made me more likely to lose).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I scored 3.5 out of 5.0, good enough for 6th place in my section and a rating boost to 1501 (a tournament performance of 1642).
I drew the game against the eventual winner of the section; I was losing the whole time, but he let me find a draw in the king-and-pawn endgame.
If I had won my last round I would have gotten 2nd place; instead I lost after playing the opening poorly and got no prize.
But it was still my best tournament to date!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_saturday"&gt;Saturday&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The first two rounds on Sunday were game in 90 minutes with a 10 second delay.
The remaining round and the two rounds on Sunday were game in 90 with a 30 second increment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_round_1_white"&gt;Round 1 (white)&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;All set for battle and my unrated opponent (his first USCF tournament, and his first otb tournament in a long time) made a blunder in the opening and I won in about 10 minutes.
Afterward he and I played a couple of games out in the hotel lobby; he won the first and I won the second.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;White to move and get a decisive advantage in the position below:&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;iframe width=600 height=371 src="https://lichess.org/study/embed/Dw5ZyWDz/UJ2ZwMKq?theme=blue#10" frameborder=0&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;My brother-in-law&amp;#8217;s first game went on for about 3 hours&amp;#8230;&amp;#8203; so I had plenty of time to wander around and do some knitting before lunch and Round 2.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_round_2_black"&gt;Round 2 (black)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;My opponent in this round was the highest rated player in our section and would go on to win.
A friend from my local chess group warned me that he liked to play in a very aggressive style; I was definitely on my back foot the entire time and felt lucky to get a draw.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;iframe width=600 height=371 src="https://lichess.org/study/embed/Dw5ZyWDz/JRPjc3yk?theme=blue" frameborder=0&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_round_3_white"&gt;Round 3 (white)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;My turn to play against the French.
My opponent made a knight sacrifice on move 11 which scared me at first, but I eventually saw what he missed: that I could just block the follow-up check and I&amp;#8217;m fine.
I not only held on to my material advantage after that, but managed to find a tactic and win another piece, and then his queen.
At that point I forgot that I had a bishop and kept missing checkmates.
My opponent finally resigned rather than wait any longer for me to figure out how to win.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;iframe width=600 height=371 src="https://lichess.org/study/embed/Dw5ZyWDz/3KuvJtpH?theme=blue" frameborder=0&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_sunday"&gt;Sunday&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_round_4_black"&gt;Round 4 (black)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I have the black pieces and play the French, and my opponent just let&amp;#8217;s me control the center giving me a comfortable position.
They then blundered a bishop and I took my time to convert for the win.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;iframe width=600 height=371 src="https://lichess.org/study/embed/Dw5ZyWDz/ul3dP7cU?theme=blue" frameborder=0&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_round_5_white"&gt;Round 5 (white)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If I win this I get prize money.
If I draw or lose, I get nothing.
My opponent is from Russia (I think?) and has no USCF rating.
He plays the Pirc defense, and I put my pieces where he can chase them with his pawns and then continue with the initiative for the entire game.
I spent a lot of time trying to dig myself out of the resulting bad position, unsuccessfully, and ended up playing a losing endgame on increment.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;iframe width=600 height=371 src="https://lichess.org/study/embed/Dw5ZyWDz/1sA5KQTi?theme=blue" frameborder=0&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_other_reports"&gt;Other reports&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://denverchess.com/news/article/2202"&gt;Denver Chess Club report&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
    <summary type="html">A report from my fourth classical chess tournament at the 2022 Denver Chess Club Fall Classic. I finished with 3.5 points out of 5 games for 6th place in my section and a new provisional USCF rating of 1501.</summary>
  </entry>
  <entry>
    <id>tag:catswhisker.xyz,2022-10-22:/log/2022/10/21/race_report_imogene_pass_run_2022/</id>
    <title type="html">Race Report: Imogene Pass Run 2022</title>
    <published>2022-10-22T02:45:46Z</published>
    <updated>2022-10-22T02:45:46Z</updated>
    <link rel="alternate" href="http://catswhisker.xyz/log/2022/10/21/race_report_imogene_pass_run_2022/" type="text/html"/>
    <content type="html">&lt;div class="sect1"&gt;
&lt;h2 id="_race_information"&gt;Race Information&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/-o8yvxJoPM0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The &lt;a href="http://live-raceresults.com/imogene/"&gt;Imogene Pass Run&lt;/a&gt; is a 17.1 mile mountain race between the Colorado towns of Ouray and Telluride by way of a 13,134 foot pass (climbing over 5,000 feet in the first ten miles).
&lt;a href="/log/2018/9/28/race_report_imogene_pass_run_2018/"&gt;The first time I ran it was in 2018&lt;/a&gt;.
I was already in training for &lt;a href="/log/2018/10/16/race_report_louisville_trail_half_marathon_2018/"&gt;my hometown marathon&lt;/a&gt; that fall, so I was in good shape and finished it in about 3h20m.
I ran it again in 2019; I&amp;#8217;d done less running since my marathon and my little sister beat me to the top of the pass that year.
I had to race her all the to the finish. 3h30m.
The 2020 race was canceled for Covid and I skipped 2021 because I was even further out of shape (though my sisters ran it!).
I came back this September to try to beat my 2018 time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="http://live-raceresults.com/imogene/wp-content/uploads/2018/04/profil1.gif"&gt;&lt;img src="/log/2022/10/21/race_report_imogene_pass_run_2022/profil1.gif" alt="Imogene Pass Run Course Profile"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 1. The race with only one hill&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_pre_race"&gt;Pre-race&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The weather forecast was looking good early in the week, but by the night before the race it was calling for possible snow in the morning at the pass and thunderstorms wall afternoon.
I brought a handheld water bottle, one birthday cake flavor Gu packet, a jacket, a hat, and gloves in a running vest; I did put my gloves on near the top when my hands got cold (and kept them on all the way down to protect my hands if I fell), but we ended up having another year with clear weather for the entire race!
Except there was some smoke (from fires in Wyoming?) which I didn&amp;#8217;t notice but was bothering some of the runners.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I don&amp;#8217;t know my splits for my previous runs, so I wasn&amp;#8217;t sure what my strategy should be, but for whatever reason I had in mind &amp;#8220;60 minutes to Lower Camp Bird, 90 minutes to Upper Camp Bird, 1h15m to the pass.&amp;#8221;
If I managed that pace, I thought a 3h05m finish might be possible&amp;#8201;&amp;#8212;&amp;#8201;though my real goal was just to beat my 3h20m PR.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_start_to_lower_camp_bird_aid_station_mile_5"&gt;Start to Lower Camp Bird aid station (mile 5)&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I thought I started more toward the front of the crowd this year, but I got stuck in standstill traffic at the first offroad shortcut.
My chip time was 18 seconds after the gun time at the start.
Next time I will start even closer to the front.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But otherwise I felt great to the Lower Camp Bird aid station at about 8km.
I got there in about 53 minutes; I&amp;#8217;m sure that must be much faster than previous years (and 7 minutes ahead of my mental schedule).
I was constantly being surprised by how much &lt;em&gt;downhill&lt;/em&gt; there is in the first 10K.
(I think I wrote that same thing in my 2018 race report&amp;#8201;&amp;#8212;&amp;#8201;apparently I forgot.)
I grabbed a cookie at the aid station and kept going.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Beyond the aid station there was a ranger warning us that a moose kept crossing the road just ahead and told us not to yell at it.
I never saw the moose, but my sister&amp;#8217;s boyfriend (who was already several minutes ahead of me) did!
He said it was a huge bull; when he saw it, it was looking down at the road wanting to cross but unsure of all the runners.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_lower_camp_bird_to_upper_camp_bird_aid_station_mile_7_6"&gt;Lower Camp Bird to Upper Camp Bird aid station (mile 7.6)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;With the steeper sections up to Upper Camp Bird I quickly went from feeling good to feeling like my legs were very heavy.
I walked much more than I wanted to, but I couldn&amp;#8217;t get myself to run even on some of the shallower grades when I thought I would be able to.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This section was a little bit discouraging; I had done more mountain running this year than in any of my previous Imogene Pass Runs, but my legs were evidently not ready for the steep hills after running hard for the first 10K.
But I still made it to Upper Camp Bird in 91 minutes, still about on schedule!
(I think about the same time I got there in 2018, so I already lost all my gains by running the first 10k faster.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I got some m&amp;amp;ms from the food table and kept going to see how quickly I could get to the pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_upper_camp_bird_to_imogene_pass_summit_mile_10_0"&gt;Upper Camp Bird to Imogene Pass Summit (mile 10.0)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;From Upper Camp Bird to the summit was purely a hike, except at the few downhill bits.
I didn&amp;#8217;t even pretend to be on a run.
My lungs felt surprisingly good&amp;#8201;&amp;#8212;&amp;#8201;the whole hike felt much easier than previous years (yay for actually training at altitude this year!).
But my legs were so tired that it still took me 52 minutes to get to the pass (only a minute faster than my slow 2019 year and probably a couple of minutes slower than my 2018 run).
If I was going to beat my 2018 time it would have to be by beating my previous downhill time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;At the pass I drank some electrolyte drink, ate my gu (which was not easy with my cold hands), then headed down the hill.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_the_descent_summit_to_finish_line_mile_17_1"&gt;The Descent: Summit to Finish Line (mile 17.1)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The downhill felt much faster than I expected.
In previous years I had to brake most of the first few miles; this year I just ran over the rocks.
My legs felt tired, and I&amp;#8217;m sure my form wasn&amp;#8217;t great, but I never felt like I had to slow down to avoid falling.
Maybe another benefit of doing several mountain runs in preparation this year?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Unfortunately it didn&amp;#8217;t last.
After about 5k I could feel my quadriceps, especially my right leg, twitch a few times and threaten to cramp.
It got progressively worse.
With 5k to go my right calf was also on the verge of cramping.
I slowed way down in an attempt to prevent cramping and being forced to walk.
I did some calculations and knew if I could hold my current pace I would be close to my PR.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;By the time I hit the streets of Telluride I tried to speed up for a final sprint and my right calf and quads immediately started to cramp.
I slowed to a jog to the finish line.
If it had been a few hundred meters further I might not have made it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Disappointing because of how well the descent started. I definitely pushed my legs to the limits of what I had trained them for (and probably didn&amp;#8217;t eat enough&amp;#8201;&amp;#8212;&amp;#8201;it&amp;#8217;s only 17 miles, but I forget that it is over 3 hours so I should treat it more like a marathon), but I still finished in 3:19:29&amp;#8230;&amp;#8203; a new PR by a few seconds!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
    <summary type="html">I ran the 49th annual Imogene Pass Run (September 10, 2022)</summary>
  </entry>
  <entry>
    <id>tag:catswhisker.xyz,2021-08-23:/log/2021/8/23/quit_your_job_like_andrew_kelley/</id>
    <title type="html">Quit Your Job Like Andrew Kelley</title>
    <published>2021-08-23T14:11:59Z</published>
    <updated>2021-08-23T14:11:59Z</updated>
    <link rel="alternate" href="http://catswhisker.xyz/log/2021/8/23/quit_your_job_like_andrew_kelley/" type="text/html"/>
    <content type="html">&lt;div class="paragraph"&gt;
&lt;p&gt;The CoRecursive podcast has a great recent interview with Andrew Kelley, the creator of the &lt;a href="https://en.wikipedia.org/wiki/Zig_(programming_language)"&gt;Zig programming language&lt;/a&gt;, where he talks about quitting his job and working on open source full time (&lt;a href="https://corecursive.com/067-zig-with-andrew-kelley/"&gt;Episode #67&lt;/a&gt;):&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Adam&lt;/strong&gt;: Once you did quit, was it everything that you thought it would be?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Andrew&lt;/strong&gt;: First of all, I&amp;#8217;ve never been happier. Second of all, I realized that the freedom that I have has allowed me to open my mind up to just other, even just different politics and ways of thinking about society and how the world works. It’s harder to think about maybe more radical ways that society could run when you have to play the game, and you’re spending 40 or plus hours per week clocked in and just like doing the labor.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Not only was it everything I thought I would be, but once I tasted this freedom, I know I will never have a boss again. I will go start a farm if I have to. My sense of self-worth has just skyrocketed and I just, I don’t even want to be subject to another person’s domain anymore. I want everyone to feel this way. I want everyone to feel they get to decide what they do with their life and no one&amp;#8217;s going to tell them what they have to do.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Adam&lt;/strong&gt;: Did you have a really bad boss?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;strong&gt;Andrew&lt;/strong&gt;: Actually, no. [&amp;#8230;&amp;#8203;] I think that&amp;#8217;s why I realized that I never want to have a boss again is that I had a good one and I still really hated it.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;</content>
    <summary type="html">An excerpt from a recent interview with Andrew Kelley, creator of the Zig programming language, about quitting his job.</summary>
  </entry>
  <entry>
    <id>tag:catswhisker.xyz,2021-08-22:/log/2021/8/22/magento_sucks/</id>
    <title type="html">I Hate Magento</title>
    <published>2021-08-22T13:30:18Z</published>
    <updated>2021-09-07T18:15:55Z</updated>
    <link rel="alternate" href="http://catswhisker.xyz/log/2021/8/22/magento_sucks/" type="text/html"/>
    <content type="html">&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
Sometimes I think I hate Magento for being so overly complex, slow, resource-intensive, and feature-poor yet bloat-rich that only Adobe could be interested in it. Then I think of the poor people paying me to maintain and write extensions for it.
&lt;/blockquote&gt;
&lt;div class="attribution"&gt;
&amp;#8212; Comment seen on hacker news
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I&amp;#8217;ve inherited the maintenance duties for a retail shop&amp;#8217;s website which is powered by some open-source PHP software called &lt;a href="https://en.wikipedia.org/wiki/Magento"&gt;Magento&lt;/a&gt;. (Magento was purchased by Adobe a few years ago and they offer value-added commercial and hosted versions called &lt;a href="https://magento.com/products/magento-commerce"&gt;Adobe Commerce&lt;/a&gt;).
According to the marketing copy, &amp;#8220;Magento is a feature-rich eCommerce platform solution that offers merchants complete flexibility and control over the functionality of their online channel. Magento’s search engine optimization, catalog management, and powerful marketing tools give merchants the ability to create sites that provide an unrivaled shopping experience for their customers.&amp;#8221;
And according to Wikipedia, &amp;#8220;More than 100,000 online stores have been created on this platform. The platform code has been downloaded more than 2.5 million times, and $155 billion worth of goods have been sold through Magento-based systems in 2019. Two years ago, Magento accounted for about 30% of the total market share.&amp;#8221;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I&amp;#8217;ve now had time to work with this Magento site from several perspectives over the span of a few years (including a less-than-smooth migration from Magento 1.9 to Magento 2.3)&amp;#8201;&amp;#8212;&amp;#8201;as a consultant managing product data via the Admin interface, as a sysadmin deploying and hosting a Magento-based site, as a developer making minor modifications and fixes as needed by my client, as a user of the customer-facing site&amp;#8201;&amp;#8212;&amp;#8201;and it has continually impressed me: I&amp;#8217;ve never before used software that provides such a poor experience to administrators, developers, and users alike.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Where I&amp;#8217;d expect an eCommerce framework to provide a simple frontend interface that implements basic shopping cart functionality as a starting point to build on, Magento provides a default theme with a product description page which requests over 4MB of HTML/CSS/JS including 200+ JavaScript files (really). Modifying the theme, like all Magento customization (see below), is cumbersome to an unreasonable degree. As far as I can tell, the only sane way to have a performant and maintainable Magento website would be to write a complete frontend using a modern framework and communicate with Magento solely through its REST API. In fact the general rule of successful Magento deployment seems to be to use as little of Magento as possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Where I&amp;#8217;d expect a catalog management interface with an emphasis on importing and exporting product data, Magento provides a painfully slow product browser and editor for torturing copywriters and an anemic and convoluted product export tool unsuitable for any real reporting or feed generation. My solution lately has been to write programs which get data from the REST API to update reports in Google Sheets rather than trying to use or extend the Admin panel. (Magento&amp;#8217;s product import tool is fine.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Where I&amp;#8217;d expect a &amp;#8220;feature-rich eCommerce platform solution that offers merchants complete flexibility and control over the functionality of their online channel&amp;#8221; to have an ergonomic and well-documented extension interfaces, Magento provides an over-engineered and convoluted plugin system wired together with XML files (with little reference documentation) and PHP code generated from classes you provide which interact with the core system&amp;#8217;s classes (which have no reference documentation).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Where I&amp;#8217;d expect to find at the morally murky nexus of a commercial online retail platform that barely works out of the box, preoccupation with marketing and &amp;#8220;SEO&amp;#8221;, and the extraction of labour from programmers in developing countries (including under the guise of &amp;#8220;open source&amp;#8221;) an ecosystem of commercial plugins that are both expensive and risky to install, Magento delivers. So if the base install of Magento seems too stable, secure, and inexpensive to you, you could always head over to the &lt;a href="https://marketplace.magento.com/"&gt;Magento Marketplace&lt;/a&gt; and find any extension you need written by software developers questioning their career choices.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I don&amp;#8217;t mean to denigrate the hard work of the open-source contributors who have helped create Magento.
In fact while I don&amp;#8217;t understand what motivates them, I admire, in some ways, the sheer tenacity and self-denial it must take to continue to spend time on such a project.
From what I can tell by browsing github and the &lt;a href="https://magento.stackexchange.com/"&gt;Magento StackExchange&lt;/a&gt; (which&amp;#8201;&amp;#8212;&amp;#8201;and I know this is going to sound hyperbolic&amp;#8201;&amp;#8212;&amp;#8201;is probably the lowest quality stackexchange site I&amp;#8217;ve seen), many developers are Indian or otherwise work outside of North America, so I&amp;#8217;m guessing the fragility of Magento has created some demand for affordable PHP developers.
And I know it is some sort of broken windows fallacy, but if Magento&amp;#8217;s convoluted architecture can provide some paying gigs or job security to those developers I guess that&amp;#8217;s something positive, at least.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I think most of Magento&amp;#8217;s issues&amp;#8201;&amp;#8212;&amp;#8201;including its poor performance, poor security record, and high cost to customize and maintain&amp;#8201;&amp;#8212;&amp;#8201;stem from two core defects: a lack of documentation and a fundamentally flawed software architecture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If Magento had good documentation, then almost no matter how terrible its design, developers would be able to figure out to make it do what they need. Now, the &lt;em&gt;organization&lt;/em&gt; of its documentation has improved since Adobe took over (see &lt;a href="https://devdocs.magento.com/" class="bare"&gt;https://devdocs.magento.com/&lt;/a&gt;). But from the perspective of a PHP developer, &lt;em&gt;what&lt;/em&gt; is documented is severely lacking. Lots of mostly useless high level descriptions, a few code examples, but no real documentation of the Magento source code and the classes/interfaces it provides.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Unlike the documentation, which Adobe &lt;em&gt;could&lt;/em&gt; improve if they cared (but if they did, then I think they would have by now), the architecture of Magento cannot even be fixed.
The entire framework is based around convoluted (which makes its lack of documentation hit harder) XML configuration files and a dynamic &lt;a href="https://devdocs.magento.com/guides/v2.4/extension-dev-guide/depend-inj.html"&gt;dependency injection&lt;/a&gt; system.
The way it works is that plugins declare dependencies on PHP interfaces and then the Magento code generator (the &lt;code&gt;bin/magento setup:di:compile&lt;/code&gt; command) generates the actual plugin code with the dependencies instantiated.
It&amp;#8217;s the sort of overkill system that makes large enterprise Java applications, developed by teams using a statically typed language with excellent tooling, difficult to reason about and maintain; to adopt that architecture for a PHP shopping cart application is utter madness.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I have not taken the time to investigate its performance bottlenecks, and I hope I never do, but the generated PHP code which supports such a dynamic plugin system no doubt contributes to how slow Magento is.
And Magento &lt;strong&gt;is&lt;/strong&gt; slow. Behind an asynchronous reverse proxy on an over-sized ec2 instance, I&amp;#8217;m pretty sure my client&amp;#8217;s website could be DoS&amp;#8217;d by any mischievous kid with a cable modem if it weren&amp;#8217;t for Cloudflare. Even with Cloudflare&amp;#8217;s firewall a single malicious bot can bring the site to a crawl.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The &amp;#8216;solution&amp;#8217; Magento offers to its performance problems is more and more layers of cache. First, the administrator must generate static files (CSS, etc.) with the &lt;a href="https://devdocs.magento.com/guides/v2.4/config-guide/cli/config-cli-subcommands-static-view.html"&gt;bin/magento setup:static-content:deploy&lt;/a&gt; command. Then there is &lt;a href="https://devdocs.magento.com/guides/v2.4/config-guide/cli/config-cli-subcommands-cache.html"&gt;a cache system&lt;/a&gt; for various bits of data Magento calculates and which often, inexplicably, needs to be manually refreshed. But it is still slow so it is usually recommend that you also run Magento behind a caching reverse-proxy like Varnish and/or a dedicated key-value cache based on redis.
It would be funny if it weren&amp;#8217;t real software that I have to maintain.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Worse, the unnecessary complexity makes it more difficult both to understand code execution paths and to make changes to the code base: a recipe for &lt;a href="https://www.cvedetails.com/product/31613/Magento-Magento.html?vendor_id=15393"&gt;security vulnerabilities&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There are some good things about Magento, of course.
Its one saving grace, in my opinion, is its Swagger-based REST API which makes it possible to implement most required functionality outside of Magento itself. And Swagger/OpenAPI is self-documenting, so the Magento devs are not able to make it as difficult as they&amp;#8217;ve made the PHP API.
But even that has been a source of suffering. In fact my main use-case for it, reporting on current inventory quantity for all products, is not even possible by default because the &lt;code&gt;/V1/products&lt;/code&gt; endpoint does not return stock information despite what the documentation claims.
That bug has been reported several times (eg &lt;a href="https://github.com/magento/magento2/issues/24418"&gt;#24418&lt;/a&gt;), but the response from the maintainers is that the correct way to get stock information is to make a call to &lt;code&gt;/V1/products&lt;/code&gt; and then make an additional http request for each returned product (thousands or tens of thousands in my case).
(Luckily there are some workarounds. I wrote &lt;a href="https://github.com/cristoper/mage_qtyext"&gt;cristoper/mage_qtyext&lt;/a&gt;, a very simple plugin which adds a &amp;#8220;qty&amp;#8221; field to the product results; I also found &lt;a href="https://github.com/menacoders/Stock-Info-API-searchCriteria"&gt;menacoders/Stock-Info-API-searchCriteria&lt;/a&gt; which adds all stock information to the results.)
There are also SOAP and GraphQL APIs which I&amp;#8217;ve not investigated (except to find out that the GraphQL API by default also does not offer a way to get stock information for the entire inventory).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Personally, the prospect of developing solutions for my Magento-bound client confronts me as a depressing time sink. I&amp;#8217;m convinced Magento will never be anything but expensive to maintain, slow, and insecure. I don&amp;#8217;t recommend it for new projects.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I found this 2015 article from the Magento 1 days which complains about mostly the same things: &lt;a href="https://medium.com/@salvoadriano/magento-why-complex-doesn-t-mean-good-1f15992202de"&gt;Magento: why complex doesn’t mean good&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;See also for Spotify users: &lt;a href="https://open.spotify.com/playlist/5YMtRCWJxAw2MBxQBrBtlF?si=163a29ca0dc14a5b"&gt;Magento 2 Rage Tracks&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</content>
    <summary type="html">A rant about an open-source ecommerce platform.</summary>
  </entry>
  <entry>
    <id>tag:catswhisker.xyz,2020-12-07:/log/2020/12/7/deranged_sinterklaas/</id>
    <title type="html">Deranged Sinterklaas: The Math and Algorithms of Secret Santa</title>
    <published>2020-12-07T07:00:00Z</published>
    <updated>2021-02-04T23:01:43Z</updated>
    <link rel="alternate" href="http://catswhisker.xyz/log/2020/12/7/deranged_sinterklaas/" type="text/html"/>
    <content type="html">&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2020/12/7/deranged_sinterklaas/XmasStory.png" alt="XmasStory"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_secret_santa"&gt;Secret Santa&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Secret_Santa"&gt;Secret Santa&lt;/a&gt; is a traditional Christmas gift exchanging scheme in which each member of a group is randomly and anonymously assigned another member to give a Christmas gift to (usually by drawing names from a container). It is not valid for a person to be assigned to themself (if someone were to draw their own name, for example, all the names should be returned to the jar and the drawing process restarted).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Given a group of a certain size, how many different ways are there to make valid assignments? What is the probability that at least one person will draw their own name? What is the probability that two people will draw each other&amp;#8217;s names? What is a good way to have a computer make the assignments while guaranteeing they are generated with equal probability among all possible assignments?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;It turns out that these questions about secret santa present good motivation for exploring some of the fundamental concepts in combinatorics (the math of counting).
In the sections below we will take a look at a bit of that math and algorithms that allow us to answer the questions we posed above.
The final section presents a simple command-line &lt;a href="https://github.com/cristoper/sinterbot"&gt;program&lt;/a&gt; that allows generating and anonymously sending secret santa assignments via email so that we no longer need to go through the tedious ordeal of drawing names from a hat.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="toc" class="toc"&gt;
&lt;div id="toctitle" class="title"&gt;Table of Contents&lt;/div&gt;
&lt;ul class="sectlevel1"&gt;
&lt;li&gt;&lt;a href="#_secret_santa"&gt;Secret Santa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_math"&gt;Math&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_permutations"&gt;Permutations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_derangements"&gt;Derangements&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#_algorithms"&gt;Algorithms&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_utilities"&gt;Utilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_how_not_to_generate_derangements"&gt;How not to generate derangements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_how_to_generate_derangements"&gt;How to generate derangements&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#software"&gt;Sinterbot2020&lt;/a&gt;
&lt;ul class="sectlevel2"&gt;
&lt;li&gt;&lt;a href="#_installation"&gt;Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#_usage"&gt;Usage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_math"&gt;Math&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_permutations"&gt;Permutations&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;As an example let&amp;#8217;s take a group of five friends who we will represent by the first initial of their names as a set: \(\{\mathrm{\,S, C, A, L, M\,}\}\). The elements of this set of people, like the elements of any set, can be arranged in different orders. For example, the order of the elements as we just happened to write them \((\mathrm{S\; C\; A\; L\; M})\) is one arrangement, and we can also shuffle them around to get a different arrangement like \((\mathrm{C\; A\; M\; L\; S})\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Each ordered arrangement is called a permutation of the set. How many permutations can be made from a set with \(n\) elements? It is straight-forward to count. We can choose any element of the set to be in the first position of the permutation, so there are \(n\) choices, which leaves \(n-1\) choices for the second position, \(n-2\) choices for the third position, and so on until for the \(n\text{th}\) (and therefore last) position of the permutation there is only one element of the set remaining to choose from.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Multiplying the number of choices for each position of the permutation gives the total number of possible permutations: \(n(n-1)(n-2)\dots(1).\) In other words, the product of all positive integers less than or equal to \(n\). That product is known as the &lt;a href="https://en.wikipedia.org/wiki/Factorial"&gt;factorial&lt;/a&gt; of \(n\) and is written \(n!\):&lt;/p&gt;
&lt;/div&gt;
&lt;div class="stemblock"&gt;
&lt;div class="content"&gt;
\[\begin{align*}
  n! &amp;amp;= n(n-1)(n-2)\cdots (n-(n-1))\\
     &amp;amp;= 1 \cdot 2 \cdots n\\
\end{align*}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So there are \(5! = 5 \cdot 4 \cdot 3 \cdot 2 \cdot 1 = 120\) ways to permute a set of five friends. Writing any two of those permutations in &lt;a href="http://groupprops.subwiki.org/wiki/Two-line_notation_for_permutations"&gt;two-line notation&lt;/a&gt; with one above the other allows us to read off a secret santa assignment for the group:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="stemblock"&gt;
&lt;div class="content"&gt;
\[\begin{equation}
  \label{eq:perm}
  \begin{pmatrix}
    \mathrm{S} &amp;amp; \mathrm{C} &amp;amp; \mathrm{A} &amp;amp; \mathrm{L} &amp;amp; \mathrm{M} \\
    \mathrm{C} &amp;amp; \mathrm{A} &amp;amp; \mathrm{M} &amp;amp; \mathrm{L} &amp;amp; \mathrm{S} \\
  \end{pmatrix}
\end{equation}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If we read the top line of as the list of gift givers and the bottom line as the gift recipients, then each santa is assigned to give a gift to the person in the bottom line directly beneath them. So \(\mathrm{S}\) gives a gift to \(\mathrm{C}\) who gives a gift to \(\mathrm{A}\) and so forth.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="permgraph" class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="dotperm.svg"&gt;&lt;img src="/log/2020/12/7/deranged_sinterklaas/dotperm.png" alt="TODO Figure &amp;lt;&amp;lt;permgraph&amp;gt;&amp;gt; illustrates the cycles."&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 1. Graphical representation of the cycles of the permutation \(\eqref{eq:perm}\). Arrows point from santas to gift recipients.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A permutation of santas (or anything else) can be represented as a directed graph, as in &lt;a href="#permgraph"&gt;Figure 1&lt;/a&gt;, or more compactly by listing its cycles: \((\mathrm{S\; C\; A\; M})(\mathrm{L})\). To see that the cycle notation is equivalent to the graph, read each cycle from left to right and insert the implied arrow from the last element back to the first: \((\mathrm{S \to C \to A \to M \to S})(\mathrm{L \to L})\). Note that any 1-cycles can be implied and are usually left out when writing a permutation in cycle notation, so an equivalent way to write our example permutation is simply as \((\mathrm{S\; C\; A\; M})\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But note also that a permutation containing any 1-cycles defines an invalid secret santa assignment! The example permutation above has \(\mathrm{L}\) giving a gift to herself, which is against the rules.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_derangements"&gt;Derangements&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A permutation with no 1-cycles&amp;#8201;&amp;#8212;&amp;#8201;in other words, a permutation in which no element is left in its original position so that the entire set has been de-arranged&amp;#8201;&amp;#8212;&amp;#8201;is called a &lt;a href="https://en.wikipedia.org/wiki/Derangement"&gt;derangement&lt;/a&gt;. One way to derange our example group of secret santas is&lt;/p&gt;
&lt;/div&gt;
&lt;div class="stemblock"&gt;
&lt;div class="content"&gt;
\[\begin{equation}
  \label{eq:der}
  \begin{pmatrix}
    \mathrm{S} &amp;amp; \mathrm{C} &amp;amp; \mathrm{A} &amp;amp; \mathrm{L} &amp;amp; \mathrm{M} \\
    \mathrm{C} &amp;amp; \mathrm{A} &amp;amp; \mathrm{S} &amp;amp; \mathrm{M} &amp;amp; \mathrm{L} \\
  \end{pmatrix}
\end{equation}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Or equivalently, decomposed into its cycles, \((\mathrm{S\; C\; A})(\mathrm{M\; L})\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;So the problem of generating a valid secret santa assignment is equivalent to generating a derangement. Some algorithms for uniformly generating random derangements are presented in the next section. But first we need a way to calculate \(D_n\), the number of derangements that can be made from a set with \(n\) elements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Counting derangements is a trickier than counting unrestricted permutations. We proceed by counting the permutations with at least one 1-cycle, the &lt;em&gt;non&lt;/em&gt;-derangements. First we&amp;#8217;ll define the subsets \(H_p\) to contain all of the permutations on \(n\) with the \(p^{\text{th}}\) element fixed in its original position (an element that stays in its original position in a permutation is called a &amp;#8220;fixed point&amp;#8221;). This gives \(n\) such subsets \(\mathrm{(}H_1 \ldots H_n\mathrm{)}\) each containing \((n-1)!\) permutations (because with one element fixed, there are \((n-1)!\) ways to permute the remaining elements).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We know that the subsets \(H_p\) contain only non-derangements since every member has a fixed point. And since together the \(H_p\) contain every non-derangement with the \(p^{\text{th}}\) element fixed, we know that they contain &lt;em&gt;all&lt;/em&gt; possible non-derangements.
That means to find \(D_n\) we just need to subtract the size of the union of all the \(H_p\) subsets from the total number of permutations (which we know is \(n!\)):&lt;/p&gt;
&lt;/div&gt;
&lt;div class="stemblock"&gt;
&lt;div class="content"&gt;
\[\begin{equation}
  \label{eq:up}
  D_n = n! - \left\lvert \bigcup H_p \right\rvert \\
\end{equation}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But finding the size of \(\cup H_p\) is not straightforward.
If we simply multiply the number of subsets by their size \(n\cdot(n-1)!\) we over count because the subsets \(H_p\) are not disjoint: some non-derangements belong to more than one subset. Specifically, every pair of subsets of \(H_p\) share \((n-2)!\) permutations with at least two fixed points; every 3-tuple of subsets share \((n-3)!\) permutations with at least three fixed points; and so on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To visualize this, it helps to draw out each \(H_p\) for a small set. The table below shows each \(H_p\) subset for the set \(\{\,a, b, c, d\,\}\):&lt;/p&gt;
&lt;/div&gt;
&lt;table class="tableblock frame-all grid-all stretch"&gt;
&lt;colgroup&gt;
&lt;col style="width: 25%;"&gt;
&lt;col style="width: 25%;"&gt;
&lt;col style="width: 25%;"&gt;
&lt;col style="width: 25%;"&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;\(H_1\)&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;\(H_2\)&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;\(H_3\)&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;\(H_4\)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;abcd&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;abcd&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;abcd&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;abcd&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;abdc&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;abdc&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;adcb&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;acbd&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;acbd&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;cbad&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;bacd&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;bacd&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;acdb&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;cbda&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;bdca&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;bcad&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;adbc&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;dbac&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;dacb&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;cabd&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;adcb&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;dbca&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;dbca&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;cbad&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Notice that the first column, \(H_1\), has "a" fixed in the first position; the second column has "b" fixed in the second position; etc. Note also that the \(H_1\) and \(H_2\) columns share every permutation with the first and second position fixed ("abcd" and "abdc").&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;To weed out the duplicates, we need to subtract the number of permutations with at least two fixed points multiplied by the number of pairs of \(H_p\) subsets. But that will leave us with an &lt;em&gt;under&lt;/em&gt; count because it will result in some permutations with three or more fixed points being excluded, so we must add those back in. We need to continue this &lt;a href="https://en.wikipedia.org/wiki/Inclusion%E2%80%93exclusion_principle"&gt;inclusion-exclusion&lt;/a&gt; process until we&amp;#8217;ve considered the number of permutations which fix all \(n\) elements in \(H_p\) taken \(n\) at a time:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="stemblock"&gt;
&lt;div class="content"&gt;
\[\begin{equation*}
\label{eq:binom}
  \left\lvert \bigcup H_p \right\rvert = \binom{n}{1}(n-1)! - \binom{n}{2}(n-2)! + \binom{n}{3}(n-3)! - \cdots (-1)^n \binom{n}{n}(n-n)!
\end{equation*}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;where \(\binom{n}{k}\) gives the &lt;a href="https://en.wikipedia.org/wiki/Binomial_coefficient"&gt;binomial coefficients&lt;/a&gt; which you may remember from math class can be interpreted as the number of ways to choose \(k\) objects from a set of \(n\) objects when order doesn&amp;#8217;t matter. It can be written in terms of factorials:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="stemblock"&gt;
&lt;div class="content"&gt;
\[\begin{equation*}
\binom{n}{k} = \frac{n!}{(n-k)!k!}
\end{equation*}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Now we can calculate the number of possible &lt;em&gt;non&lt;/em&gt;-deranged permutations. To get \(D_n\), we just subtract it from the total number of possible permutations.
When we substitute the expression for \(\lvert \bigcup H_p \rvert\) into equation \eqref{eq:up} then expand the binomial coefficients and factorials, this becomes:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="stemblock"&gt;
&lt;div class="content"&gt;
\[\begin{eqnarray}
  \notag
  D_n &amp;amp; = &amp;amp; n! - \frac{n!}{1!} + \frac{n!}{2!} - \frac{n!}{3!} + \cdots + (-1)^n \\
  \notag
      &amp;amp; = &amp;amp; n!\left(1 - \frac{1}{1!} + \frac{1}{2!} - \frac{1}{3!} + \cdots + (-1)^n \frac{1}{n!}\right) \\
  \label{eq:dn}
      &amp;amp; = &amp;amp; n!\sum_{k=0}^n(-1)^k\frac{1}{k!}
\end{eqnarray}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;And we&amp;#8217;ve answered our first question: &lt;strong&gt;Given a group of size \(n\), there are \(D_n =n!\sum_{k=0}^n(-1)^k\frac{1}{k!}\) ways to make a valid secret santa assignment.&lt;/strong&gt; To calculate the number of valid assignments between our five example friends, then, we have&lt;/p&gt;
&lt;/div&gt;
&lt;div class="stemblock"&gt;
&lt;div class="content"&gt;
\[\begin{eqnarray*}
  D_5 &amp;amp; = &amp;amp; 5!\left(1 - \frac{1}{1!} + \frac{1}{2!} - \frac{1}{3!} + \frac{1}{4!} - \frac{1}{5!}\right) \\
      &amp;amp; = &amp;amp; 120 \left(1 - 1 + \frac{1}{2} - \frac{1}{6} + \frac{1}{24} - \frac{1}{120}\right) \\
      &amp;amp; = &amp;amp; 120 \left(\frac{44}{120}\right) \\
      &amp;amp; = &amp;amp; 44
\end{eqnarray*}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The first nine values of \(D_n\) are listed in the table below.&lt;/p&gt;
&lt;/div&gt;
&lt;table class="tableblock frame-all grid-all stretch"&gt;
&lt;colgroup&gt;
&lt;col style="width: 10%;"&gt;
&lt;col style="width: 10%;"&gt;
&lt;col style="width: 10%;"&gt;
&lt;col style="width: 10%;"&gt;
&lt;col style="width: 10%;"&gt;
&lt;col style="width: 10%;"&gt;
&lt;col style="width: 10%;"&gt;
&lt;col style="width: 10%;"&gt;
&lt;col style="width: 10%;"&gt;
&lt;col style="width: 10%;"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class="tableblock halign-left valign-top"&gt;\(n\)&lt;/th&gt;
&lt;th class="tableblock halign-left valign-top"&gt;1&lt;/th&gt;
&lt;th class="tableblock halign-left valign-top"&gt;2&lt;/th&gt;
&lt;th class="tableblock halign-left valign-top"&gt;3&lt;/th&gt;
&lt;th class="tableblock halign-left valign-top"&gt;4&lt;/th&gt;
&lt;th class="tableblock halign-left valign-top"&gt;5&lt;/th&gt;
&lt;th class="tableblock halign-left valign-top"&gt;6&lt;/th&gt;
&lt;th class="tableblock halign-left valign-top"&gt;7&lt;/th&gt;
&lt;th class="tableblock halign-left valign-top"&gt;8&lt;/th&gt;
&lt;th class="tableblock halign-left valign-top"&gt;9&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;&lt;strong&gt;\(D_n\)&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;0&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;2&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;9&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;44&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;265&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;1,854&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;14,833&lt;/p&gt;&lt;/td&gt;
&lt;td class="tableblock halign-left valign-top"&gt;&lt;p class="tableblock"&gt;133,496&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This is OEIS sequence &lt;a href="https://oeis.org/A000166"&gt;A000166&lt;/a&gt;.
The number \(D_n\) is known as the &lt;a href="http://mathworld.wolfram.com/Subfactorial.html"&gt;subfactorial&lt;/a&gt; of \(n\) (usually written \(!n\)). It is also a special case of the &lt;a href="https://en.wikipedia.org/wiki/Rencontres_numbers"&gt;rencontres numbers&lt;/a&gt; which enumerate partial derangements (derangements with specified numbers of 1-cycles).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Notice that the summation in equation \(\eqref{eq:dn}\) is the \(n^{\text{th}}\) partial &lt;a href="https://en.wikipedia.org/wiki/Taylor_series"&gt;Maclaurin expansion&lt;/a&gt; of \(e^{-1}\), so that&lt;/p&gt;
&lt;/div&gt;
&lt;div class="stemblock"&gt;
&lt;div class="content"&gt;
\[\begin{equation*}
  \lim_{n \to \infty} D_n = \frac{n!}{e}
\end{equation*}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Because the series converges rather quickly, \(\frac{n!}{e}\) is a good approximation even for even small values of \(n\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The probability that a permutation is a derangement is \(D_n\) divided by the number of all possible permutations \(n!\). This answers the second question asked in the introduction: &lt;strong&gt;The probability that at least one secret santa participant will draw their own name is&lt;/strong&gt; \(1 - \frac{D_n}{n!} \approx 1 - \frac{1}{e} \approx 63\%\). That may seem high, but the mean of the &lt;a href="https://en.wikipedia.org/wiki/Geometric_distribution"&gt;geometric distribution&lt;/a&gt; is \(e\) so you can expect to draw a valid derangement after 2 or 3 attempts (restarting each time someone draws their own name). There is a nearly 99% chance of having drawn a derangement after 10 attempts \((1 - (1 - \frac{1}{e})^{10} \approx 98.9\%)\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Beyond counting mere derangements there are more elaborate constraints and questions we could consider, the sorts of things investigated by &lt;a href="https://en.wikipedia.org/wiki/Random_permutation_statistics"&gt;statistics of random permutations&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Generating_function"&gt;generating functions&lt;/a&gt;.
We haven&amp;#8217;t even answered the third question from the introduction yet (&amp;#8220;What is the probability that two people will draw each other&amp;#8217;s names?&amp;#8221;).
I hope to return to this article in the future when I have more time and a better grasp of combinatoric tools to look into some of those questions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If my explanation above of how to derive \(D_n\) was not clear, don&amp;#8217;t worry. Counting derangements is frequently used as an example application of the inclusion-exclusion principle, so better explanations can be found on the web and in almost any introductory combinatorics textbook. See, for example, Professor Howard Haber&amp;#8217;s &lt;a href="http://scipp.ucsc.edu/~haber/ph116C/InclusionExclusion.pdf"&gt;handout on the inclusion-exclusion principle [PDF]&lt;/a&gt;. There are also several other methods for deriving and proving the formula for \(D_n\), including those that first derive the recurrence relation \(D_n = (n-1)(D_{n-1} + D_{n-2})\) and then solve it by iteration or by the method of generating functions. For a solution via generating functions see Jean Pierre Mutanguha&amp;#8217;s &lt;a href="http://euler.genepeer.com/the-power-of-generating-functions/"&gt;&amp;#8220;The Power of Generating Functions&amp;#8221;&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_algorithms"&gt;Algorithms&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
[A]lmost as many algorithms have been published for unsorting as for sorting!
&lt;/blockquote&gt;
&lt;div class="attribution"&gt;
&amp;#8212; Donald Knuth
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We&amp;#8217;ll use Python to explore some algorithms for generating random derangements.
The functions given below are sometimes simplified to get the main ideas across; the complete versions can be found in &lt;a href="https://github.com/cristoper/sinterbot/blob/master/sinterbot/algorithms.py"&gt;alogrithms.py in the github repository&lt;/a&gt;.
To keep things simple, all of the functions operate only on permutations of the set of integers from 0 to n-1. If we&amp;#8217;d like to permute a set of some other n objects (like santas) we can then use those integers as indexes into the list of our other objects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_utilities"&gt;Utilities&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There are a few utility functions that we might want while exploring and debugging our algorithms. First of all, the ability to calculate \(D_n\), the number of derangements in a set of size \(n\). Here is a straightforward translation of \(\eqref{eq:dn}\) to Python:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="title"&gt;Dn()&lt;/div&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="python"&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; &lt;span class="include"&gt;math&lt;/span&gt;
&lt;span class="keyword"&gt;from&lt;/span&gt; &lt;span class="include"&gt;decimal&lt;/span&gt; &lt;span class="keyword"&gt;import&lt;/span&gt; &lt;span class="include"&gt;Decimal&lt;/span&gt;

&lt;span class="keyword"&gt;def&lt;/span&gt; &lt;span class="function"&gt;Dn&lt;/span&gt;(n: &lt;span class="predefined"&gt;int&lt;/span&gt;):
    &lt;span class="comment"&gt;# Use Decimal to handle large n accurately&lt;/span&gt;
    &lt;span class="comment"&gt;# (by large, I mean n&amp;gt;13 or so...&lt;/span&gt;
    &lt;span class="comment"&gt;# factorials get big fast!)&lt;/span&gt;
    s = &lt;span class="integer"&gt;0&lt;/span&gt;
    &lt;span class="keyword"&gt;for&lt;/span&gt; k &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="predefined"&gt;range&lt;/span&gt;(n+&lt;span class="integer"&gt;1&lt;/span&gt;):
        s += (-&lt;span class="integer"&gt;1&lt;/span&gt;)**k/Decimal(math.factorial(k))
    result = math.factorial(n) * s
    &lt;span class="keyword"&gt;return&lt;/span&gt; Decimal.to_integral_exact(result)

[&lt;span class="predefined"&gt;int&lt;/span&gt;(Dn(i)) &lt;span class="keyword"&gt;for&lt;/span&gt; i &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="predefined"&gt;range&lt;/span&gt;(&lt;span class="integer"&gt;9&lt;/span&gt;)]
&amp;gt;&amp;gt; [&lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="integer"&gt;0&lt;/span&gt;, &lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="integer"&gt;2&lt;/span&gt;, &lt;span class="integer"&gt;9&lt;/span&gt;, &lt;span class="integer"&gt;44&lt;/span&gt;, &lt;span class="integer"&gt;265&lt;/span&gt;, &lt;span class="integer"&gt;1854&lt;/span&gt;, &lt;span class="integer"&gt;14833&lt;/span&gt;]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Next up is a way to generate all \(n!\) permutations of a set.
Several algorithms for generating permutations are well-known. Most classic is an algorithm which produces permutations in lexicographical order described by Knuth in &lt;a href="https://www.kcats.org/csci/464/doc/knuth/fascicles/fasc2b.pdf"&gt;7.2.1.2 Algorithm L&lt;/a&gt;. Other techniques produce all permutations by only swapping one pair of elements at a time (see the &lt;a href="https://en.wikipedia.org/wiki/Steinhaus%E2%80%93Johnson%E2%80%93Trotter_algorithm"&gt;Steinhaus-Johnson-Trotter algorithm&lt;/a&gt; which Knuth gives as Algorithm P).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But in our case the Python standard library provides a function for generating permutations (in lexicographical order) so we&amp;#8217;ll just use that:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="python"&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; &lt;span class="include"&gt;itertools&lt;/span&gt;
&lt;span class="predefined"&gt;list&lt;/span&gt;(itertools.permutations([&lt;span class="integer"&gt;0&lt;/span&gt;,&lt;span class="integer"&gt;1&lt;/span&gt;,&lt;span class="integer"&gt;2&lt;/span&gt;]))

&amp;gt;&amp;gt; [(&lt;span class="integer"&gt;0&lt;/span&gt;, &lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="integer"&gt;2&lt;/span&gt;), (&lt;span class="integer"&gt;0&lt;/span&gt;, &lt;span class="integer"&gt;2&lt;/span&gt;, &lt;span class="integer"&gt;1&lt;/span&gt;), (&lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="integer"&gt;0&lt;/span&gt;, &lt;span class="integer"&gt;2&lt;/span&gt;), (&lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="integer"&gt;2&lt;/span&gt;, &lt;span class="integer"&gt;0&lt;/span&gt;), (&lt;span class="integer"&gt;2&lt;/span&gt;, &lt;span class="integer"&gt;0&lt;/span&gt;, &lt;span class="integer"&gt;1&lt;/span&gt;), (&lt;span class="integer"&gt;2&lt;/span&gt;, &lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="integer"&gt;0&lt;/span&gt;)]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Another helpful function would be a way to decompose permutations into their cycles to make them easier to visualize (taking \((0, 1, 2,\cdots, n-1)\) to be the identity permutation).
To find the cycles in a permutation, start with the first element and then visit the element it points to (the element in its position in the identity permutation), and then visit the element that one points to and so on until we get back to the first element. That completes a cycle containing each of the elements visited, add it to a list. Now start over with the first unvisited element. Repeat until there are no more unvisited elements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Below is an implementation of that algorithm.
It requires storage for the list of cycles (the &lt;code&gt;cycles&lt;/code&gt; variable), a way to keep track of unvisited elements (the &lt;code&gt;unvisited&lt;/code&gt; variable, which starts as a copy of the input but has elements removed as they are visited), and a way to keep track of the first element in a cycle so that we know when we&amp;#8217;ve returned to it (the variable called &lt;code&gt;first&lt;/code&gt; below):&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="title"&gt;decompose()&lt;/div&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="python"&gt;&lt;span class="keyword"&gt;def&lt;/span&gt; &lt;span class="function"&gt;decompose&lt;/span&gt;(perm):
    cycles = []
    unvisited = &lt;span class="predefined"&gt;list&lt;/span&gt;(perm)

    &lt;span class="keyword"&gt;while&lt;/span&gt; &lt;span class="predefined"&gt;len&lt;/span&gt;(unvisited):
        first = unvisited.pop(&lt;span class="integer"&gt;0&lt;/span&gt;)
        cur = [first]
        nextval = perm[first]
        &lt;span class="keyword"&gt;while&lt;/span&gt; nextval != first:
            cur.append(nextval)
            &lt;span class="comment"&gt;# Remove each element from unvisited&lt;/span&gt;
            &lt;span class="comment"&gt;# once we visit it&lt;/span&gt;
            unvisited.pop(unvisited.index(nextval))
            nextval = perm[nextval]
        cycles.append(cur)

    &lt;span class="keyword"&gt;return&lt;/span&gt; cycles&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;As an example, let&amp;#8217;s see the cycles in \(\{1, 2, 4, 3, 0\}\mathrm{:}\)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="python"&gt;decompose([&lt;span class="integer"&gt;1&lt;/span&gt;,&lt;span class="integer"&gt;2&lt;/span&gt;,&lt;span class="integer"&gt;4&lt;/span&gt;,&lt;span class="integer"&gt;3&lt;/span&gt;,&lt;span class="integer"&gt;0&lt;/span&gt;])

&amp;gt;&amp;gt; [[&lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="integer"&gt;2&lt;/span&gt;, &lt;span class="integer"&gt;4&lt;/span&gt;, &lt;span class="integer"&gt;0&lt;/span&gt;], [&lt;span class="integer"&gt;3&lt;/span&gt;]]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Notice this agrees with the same cycles we found way back in our first example of a permutation (where \(\mathrm{S}=0, \mathrm{C}=1, \mathrm{A}=2, \mathrm{L}=3, \mathrm{M}=4\)) \(\eqref{eq:perm}\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Finally, it will be handy to have a function that can test whether a permutation is a derangement or not.
One way to do that would be to call &lt;code&gt;decompose()&lt;/code&gt; on the permutation and then check if there are any 1-cycles in the decomposition.
The nice thing about that method is that it generalizes so we could use it to check if the permutation contains any cycles \(\leq m\) for any \(m\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But if we only care about derangements (the case where \(m=1\)), it is simpler (and faster) to just iterate over the elements of the permutation and check if they are in their original position. If any are, we can immediately return &lt;code&gt;False&lt;/code&gt;, the permutation is not a derangement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="title"&gt;check_deranged()&lt;/div&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="python"&gt;&lt;span class="keyword"&gt;def&lt;/span&gt; &lt;span class="function"&gt;check_deranged&lt;/span&gt;(perm):
    &lt;span class="keyword"&gt;for&lt;/span&gt; i, el &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="predefined"&gt;enumerate&lt;/span&gt;(perm):
        &lt;span class="keyword"&gt;if&lt;/span&gt; el == i: &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="predefined-constant"&gt;False&lt;/span&gt;
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="predefined-constant"&gt;True&lt;/span&gt;


check_deranged([&lt;span class="integer"&gt;1&lt;/span&gt;,&lt;span class="integer"&gt;2&lt;/span&gt;,&lt;span class="integer"&gt;4&lt;/span&gt;,&lt;span class="integer"&gt;3&lt;/span&gt;,&lt;span class="integer"&gt;0&lt;/span&gt;])
&amp;gt;&amp;gt; &lt;span class="predefined-constant"&gt;False&lt;/span&gt;

decompose([&lt;span class="integer"&gt;1&lt;/span&gt;,&lt;span class="integer"&gt;3&lt;/span&gt;,&lt;span class="integer"&gt;4&lt;/span&gt;,&lt;span class="integer"&gt;2&lt;/span&gt;,&lt;span class="integer"&gt;0&lt;/span&gt;])
&amp;gt;&amp;gt; [[&lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="integer"&gt;3&lt;/span&gt;, &lt;span class="integer"&gt;2&lt;/span&gt;, &lt;span class="integer"&gt;4&lt;/span&gt;, &lt;span class="integer"&gt;0&lt;/span&gt;]] &lt;span class="comment"&gt;# Notice no 1-cycles&lt;/span&gt;

check_deranged([&lt;span class="integer"&gt;1&lt;/span&gt;,&lt;span class="integer"&gt;3&lt;/span&gt;,&lt;span class="integer"&gt;4&lt;/span&gt;,&lt;span class="integer"&gt;2&lt;/span&gt;,&lt;span class="integer"&gt;0&lt;/span&gt;])
&amp;gt;&amp;gt; &lt;span class="predefined-constant"&gt;True&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_how_not_to_generate_derangements"&gt;How not to generate derangements&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The first time I sat down to write a secret santa algorithm, my instinct was to try a &lt;a href="https://en.wikipedia.org/wiki/Backtracking"&gt;backtracking&lt;/a&gt; approach and ended up with something like the code below. The idea behind the backtracker is to iteratively build a derangement by randomly selecting an element from the identity arrangement, and then checking if the resulting partial permutation is a derangement. If it is not a derangement, undo (backtrack) the last choice and try again. If it is a derangement, randomly choose one of the remaining elements and check again. Repeat until you&amp;#8217;ve deranged all \(n\) elements:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="title"&gt;backtracker()&lt;/div&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="python"&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; &lt;span class="include"&gt;random&lt;/span&gt;
&lt;span class="keyword"&gt;def&lt;/span&gt; &lt;span class="function"&gt;backtracker&lt;/span&gt;(n):
    &lt;span class="keyword"&gt;if&lt;/span&gt; n == &lt;span class="integer"&gt;0&lt;/span&gt;: &lt;span class="keyword"&gt;return&lt;/span&gt; []
    remaining = &lt;span class="predefined"&gt;list&lt;/span&gt;(&lt;span class="predefined"&gt;range&lt;/span&gt;(n))
    perm = []

    &lt;span class="comment"&gt;# backtrack until solution&lt;/span&gt;
    &lt;span class="keyword"&gt;while&lt;/span&gt; &lt;span class="predefined"&gt;len&lt;/span&gt;(perm) &amp;lt; n:
        perm.append(random.choice(remaining))
        &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="keyword"&gt;not&lt;/span&gt; check_deranged(perm):
            &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="predefined"&gt;len&lt;/span&gt;(remaining) == &lt;span class="integer"&gt;1&lt;/span&gt;:
                &lt;span class="comment"&gt;# we're down to the last two elements&lt;/span&gt;
                &lt;span class="comment"&gt;# just swap them to get a derangement&lt;/span&gt;
                perm[-&lt;span class="integer"&gt;1&lt;/span&gt;], perm[-&lt;span class="integer"&gt;2&lt;/span&gt;] = perm[-&lt;span class="integer"&gt;2&lt;/span&gt;], perm[-&lt;span class="integer"&gt;1&lt;/span&gt;]
                &lt;span class="keyword"&gt;return&lt;/span&gt; perm
            &lt;span class="comment"&gt;# undo last choice&lt;/span&gt;
            perm.pop(-&lt;span class="integer"&gt;1&lt;/span&gt;)
        &lt;span class="keyword"&gt;else&lt;/span&gt;:
            remaining.remove(perm[-&lt;span class="integer"&gt;1&lt;/span&gt;])
    &lt;span class="keyword"&gt;return&lt;/span&gt; perm

&lt;span class="comment"&gt;# Use it to generate a derangement and view the cycles:&lt;/span&gt;
perm = backtracker(&lt;span class="integer"&gt;5&lt;/span&gt;)
perm, decompose(perm)
&amp;gt;&amp;gt; ([&lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="integer"&gt;2&lt;/span&gt;, &lt;span class="integer"&gt;0&lt;/span&gt;, &lt;span class="integer"&gt;4&lt;/span&gt;, &lt;span class="integer"&gt;3&lt;/span&gt;], [[&lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="integer"&gt;2&lt;/span&gt;, &lt;span class="integer"&gt;0&lt;/span&gt;], [&lt;span class="integer"&gt;4&lt;/span&gt;, &lt;span class="integer"&gt;3&lt;/span&gt;]])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;As written, &lt;code&gt;backtracker()&lt;/code&gt; is fast and will produce any possible derangement (and in only ~20 lines of Python), so it &lt;em&gt;could&lt;/em&gt; be used for secret santa. However, as the decades fly by your friends might begin to suspect that the same assignments seem to be &amp;#8216;randomly&amp;#8217; generated fairly often.
They would be right: &lt;code&gt;backtracker()&lt;/code&gt; does not produce derangements with uniform probability.
Even though each element in the derangement is chosen from the remaining elements of the input set with uniform probability, the number of possible derangements is dependant on which numbers happen to have been chosen first.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For example, let&amp;#8217;s look at the probability that &lt;code&gt;backtracker()&lt;/code&gt; will produce \((5, 0, 1, 2, 3, 4).\)
The first number can be anything but 0, so there are \(6-1=5\) ways to choose that.
The second number can be any of the remaining 5 numbers except 1, so there are 4 ways to choose that.
The third number can be any of the remaining 4 numbers except 2 which leaves 3 possibilities.
The fourth element can be any of the remaining numbers except for 2 which leaves 2 possibilities.
The fifth element can not be 4, so there is only one way to derange the last two elements.
If we take the product of those probabilities we get \(\frac{1}{5} \cdot \frac{1}{4} \cdot \frac{1}{3} \cdot \frac{1}{2} = \frac{1}{120}.\)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If you do a similar calculation for the probability that &lt;code&gt;backtracker()&lt;/code&gt; would produce \((2, 3, 5, 4, 0, 1)\) you should get \(\frac{1}{360}.\)
Not only are the probabilities for generating those two derangements significantly different from each other but they also both differ from the expected probability of \(\frac{1}{265}\) if every one of the \(D_6\) derangements had an equal probability of being generated.
I generated 10,000 derangements of length 6 with &lt;code&gt;backtracker()&lt;/code&gt;, and sure enough \((5, 0, 1, 2, 3, 4)\) was generated 94 times while \((2, 3, 5, 4, 0, 1)\) was generated only 20 times.
The graph below shows a plot of counts for every 6-derangement over the 10,000 runs:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2020/12/7/deranged_sinterklaas/generate_backtrack.png" alt="A bar chart showing the frequency of each derangement produced in 10,000 trials. The backtracker algorithm is clearly not choosing derangements uniformly."&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 2. Count of each derangement produced after running backtracker() 10,000 times with \(n = 6\). It is clearly not choosing derangements uniformly. The grey line shows the expected count if each derangement were generated with uniform probability (\(1/D_6\cdot 10000 \approx 37.7\))&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Instead of building derangements by randomly selecting elements and checking if the result is a derangement, we could simply generate all possible permutations, filter out the non-derangements, and then randomly select one of the derangements to return.
The nice thing about that approach is that we could enforce any other constraints we want in the filter step (maybe we want a minimum cycle length or have a &amp;#8220;blacklist&amp;#8221; of people who should not be assigned to each other) and we can still be confident we would select a valid secret santa assignment with uniform probability (since we have generated all of them it is easy to select one at random).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="title"&gt;generate_all()&lt;/div&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="python"&gt;&lt;span class="keyword"&gt;import&lt;/span&gt; &lt;span class="include"&gt;random&lt;/span&gt;
&lt;span class="keyword"&gt;def&lt;/span&gt; &lt;span class="function"&gt;generate_all&lt;/span&gt;(n):
    potential = []
    perms = itertools.permutations(&lt;span class="predefined"&gt;range&lt;/span&gt;(n))
    &lt;span class="keyword"&gt;for&lt;/span&gt; p &lt;span class="keyword"&gt;in&lt;/span&gt; perms:
        &lt;span class="keyword"&gt;if&lt;/span&gt; check_constraints(p, m, bl):
            potential.append(p)
    &lt;span class="keyword"&gt;return&lt;/span&gt; random.choice(potential)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Below you can see a bar graph of the counts after producing 10,000 derangements of length 6 with &lt;code&gt;generate_all()&lt;/code&gt;.
It &lt;em&gt;looks&lt;/em&gt; much more uniform than &lt;code&gt;backtracker()&lt;/code&gt; at least.
One tool we can use to gauge how closely our counts match what we should expect from a uniform distribution is the &lt;a href="https://en.wikipedia.org/wiki/Chi-squared_test"&gt;chi-squared statistic&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="stemblock"&gt;
&lt;div class="content"&gt;
\[\begin{equation*}
  \chi^2 = \sum\frac{(O_i - E_i)^2}{E_i}
\end{equation*}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;where \(O_i\) are our observed counts and \(E_i\) are the expected counts for each derangement (which in our case is \(1/D_6\cdot 10000 \approx 37.7\)).
For my data I calculated \(\chi^2 \approx 261.75\).
If we check that against the chi-squared cumulative distribution function with k-1 degrees of freedom (where k is the number of data points, 265 in this case), we get a p-value of about 0.53.
The p-value is the probability that our \(\chi^2\) value would be least 261.75 if our counts were uniformly distributed.
Usually if p&amp;lt;0.05 it would be prudent to question whether the data fits a uniform distribution.
On the other hand if p&amp;gt;0.99 or so we could be confident it is uniform, but we might question whether it is random.
A p-value of 0.53 should leave us confident that &lt;code&gt;generate_all()&lt;/code&gt; randomly generates derangements with uniform or very nearly uniform probability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2020/12/7/deranged_sinterklaas/generate_all.png" alt="A bar chart showing the frequency of each derangement produced in 10,000 trials. The generate_all algorithm appears to be uniform"&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 3. Count of each derangement produced after running generate_all() 10,000 times with \(n = 6\). \(\chi^2 \approx 261.75\) and the chi-squared test p-value ≈ 0.53. The grey line shows the expected count if each derangement were generated with uniform probability (\(\approx 37.7\))&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But there are two major problems with &lt;code&gt;generate_all()&lt;/code&gt;: it is slow (because we have to generate all \(n!\) permutations), and it uses a lot of memory (because we have to store all \(D_n\) derangements).
\(D_{12} = 176,214,841\), for example, so even if we implemented our permutations in some memory efficient way (say an array of one byte per element), we would need over 1GB of memory just to store all of the derangements before returning one.
Running &lt;code&gt;generate_all()&lt;/code&gt; with \(n&amp;gt;11\) runs my desktop out of RAM after about a minute and crashes the Python interpreter.
And in the grand scheme of things 12 is not such a huge number.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_how_to_generate_derangements"&gt;How to generate derangements&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;We can do better than the &lt;code&gt;backtracker&lt;/code&gt; and &lt;code&gt;generate_all&lt;/code&gt; algorithms above by combining the best aspects of each: generate a single random permutation and check if it is a derangement. If it is, return it; otherwise, try again by generating another random permutation.
That should be much more efficient than generating and storing all possible derangements, and as long as we can generate permutations with uniform probability we will also generate derangements with uniform probability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A well-known algorithm for creating a random permutation by shuffling a given arrangement is to simply select one of the elements at random, set that as the leftmost element of the permutation, and then repeat by selecting one of the remaining elements at random until all of the elements have been selected.
This is known as the &lt;a href="https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle"&gt;Fisher-Yates shuffle&lt;/a&gt; named for two statisticians who described a paper-and-pen method for shuffling a sequence in 1938.
The computer version of the algorithm&amp;#8201;&amp;#8212;&amp;#8201;popularized in Chapter 3 of Knuth&amp;#8217;s &lt;em&gt;The Art of Computer Programming&lt;/em&gt; (&amp;#8220;Algorithm P (Shuffling)&amp;#8221;)&amp;#8201;&amp;#8212;&amp;#8201;usually shuffles an array in place.
It does this by iterating through the array from left to right swapping the element at the index with a random element to the right of the index.
Once an element has been swapped left it is in its position in the generated permutation.
Repeat to the end.
For a good visualization of Fisher-Yates (and how it compares to less efficient algorithms) see Mike Bostock&amp;#8217;s &lt;a href="https://bost.ocks.org/mike/shuffle/"&gt;Fisher-Yates Shuffle&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The &lt;code&gt;shuffle_rejection()&lt;/code&gt; algorithm below repeatedly shuffles a list using Fisher-Yates until the resulting permutation is a derangement:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="title"&gt;shuffle_rejection()&lt;/div&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="python"&gt;&lt;span class="keyword"&gt;def&lt;/span&gt; &lt;span class="function"&gt;shuffle_rejection&lt;/span&gt;(n):
    perm = &lt;span class="predefined"&gt;list&lt;/span&gt;(&lt;span class="predefined"&gt;range&lt;/span&gt;(n))
    &lt;span class="keyword"&gt;while&lt;/span&gt; &lt;span class="keyword"&gt;not&lt;/span&gt; check_deranged(perm):
      &lt;span class="comment"&gt;# Fisher-Yates shuffle:&lt;/span&gt;
      &lt;span class="keyword"&gt;for&lt;/span&gt; i &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="predefined"&gt;range&lt;/span&gt;(n):
          k = random.randrange(n-i)+i &lt;span class="comment"&gt;# i &amp;lt;= k &amp;lt; n&lt;/span&gt;
          perm[i], perm[k] = perm[k], perm[i]
    &lt;span class="keyword"&gt;return&lt;/span&gt; perm&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Notice that in the Fisher-Yates algorithm the range of the random index &lt;code&gt;k&lt;/code&gt; includes the index of the current element &lt;code&gt;i&lt;/code&gt;. In other words, elements can swap with themselves creating a 1-cycle.
That is necessary, of course, to generate all possible permutations.
If the algorithm is changed so that &lt;code&gt;k&lt;/code&gt; ranges only from \(i &amp;lt; k &amp;lt; n\) so that it does not include &lt;code&gt;i&lt;/code&gt;, then the algorithm will produce only permutations with a single n-cycle.
This is known as &lt;a href="https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Sattolo&amp;#8217;s_algorithm"&gt;Sattolo&amp;#8217;s algorithm&lt;/a&gt;, and it generates n-cycles with uniform probability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The bar graph above summarizes the results of generating 10,000 derangements of size 6 with &lt;code&gt;shuffle_rejection()&lt;/code&gt;.
It appears to be uniform as expected. It is also fast and simple, which makes it perfectly suitable for generating secret santa assignments (and is, in fact, what I use in &lt;a href="#_software"&gt;sinterbot&lt;/a&gt;, my secret santa tool).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2020/12/7/deranged_sinterklaas/generate_rejection.png" alt="A bar chart showing the frequency of each derangement produced in 10,000 trials. shuffle_rejection algorithm appears to be uniform"&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 4. Count of each derangement produced after running shuffle_rejection() 10,000 times with \(n = 6\). \(\chi^2 \approx 278.9\) and the chi-squared test p-value ≈ 0.25.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;One inelegance of &lt;code&gt;shuffle_rejection()&lt;/code&gt; is that it generates any number of random permutations just to throw them away.
It is possible that it would never actually generate a derangement and just keep generating and rejecting permutations all day.
In reality derangements are common enough that that is not a practical concern (it finds close to 20,000 derangements of length 6 per second on my old desktop).
But is there a way to directly generate derangements with uniform probability without needing to backtrack or reject non-deranged permutations?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Yes. In 2008 Martínez et al. published one such algorithm (&lt;a href="https://doc.lagout.org/science/0_Computer%20Science/2_Algorithms/Proceedings%20of%20the%20Tenth%20Workshop%20on%20Algorithm%20Engineering%20and%20Experiments%20and%20the%20Fifth%20Workshop%20on%20Analytic%20Algorithmics%20and%20Combinatorics%20%5BMunro%20et%20al.%202008-05-30%5D.pdf"&gt;&amp;#8220;Generating Random Derangements,&amp;#8221;&lt;/a&gt; 234-240).
It is similar to Sattolo&amp;#8217;s algorithm, but instead of joining every element into a single n-cycle, it will randomly close cycles at a specific probability which ensures a uniform generation of derangements.
&lt;a href="https://www.cs.upc.edu/~conrado/research/talks/analco08.pdf"&gt;Here is a nice set of slides&lt;/a&gt; that goes through their algorithm step by step.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Jörg Arndt provides an easier to follow (in my opinion) version of the algorithm in his 2010 thesis &lt;a href="https://maths-people.anu.edu.au/~brent/pd/Arndt-thesis.pdf"&gt;&lt;em&gt;Generating Random Permutations&lt;/em&gt;&lt;/a&gt;. (It&amp;#8217;s a short book that includes several useful algorithms.)
This Python implementation more closely follows his version:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="title"&gt;rand_derangement()&lt;/div&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="python"&gt;&lt;span class="keyword"&gt;def&lt;/span&gt; &lt;span class="function"&gt;rand_derangement&lt;/span&gt;(n):
    perm = &lt;span class="predefined"&gt;list&lt;/span&gt;(&lt;span class="predefined"&gt;range&lt;/span&gt;(n))
    remaining = &lt;span class="predefined"&gt;list&lt;/span&gt;(perm)
    &lt;span class="keyword"&gt;while&lt;/span&gt; (&lt;span class="predefined"&gt;len&lt;/span&gt;(remaining)&amp;gt;&lt;span class="integer"&gt;1&lt;/span&gt;):
        &lt;span class="comment"&gt;# random index &amp;lt; last:&lt;/span&gt;
        rand_i = random.randrange(&lt;span class="predefined"&gt;len&lt;/span&gt;(remaining)-&lt;span class="integer"&gt;1&lt;/span&gt;)
        rand = remaining[rand_i]
        last = remaining[-&lt;span class="integer"&gt;1&lt;/span&gt;]

        &lt;span class="comment"&gt;# swap to join cycles&lt;/span&gt;
        perm[last], perm[rand] = perm[rand], perm[last]

        &lt;span class="comment"&gt;# remove last from remaining&lt;/span&gt;
        remaining.pop(-&lt;span class="integer"&gt;1&lt;/span&gt;)

        p = random.random() &lt;span class="comment"&gt;# uniform [0, 1)&lt;/span&gt;
        r = &lt;span class="predefined"&gt;len&lt;/span&gt;(remaining)
        prob = r * Dn(r-&lt;span class="integer"&gt;1&lt;/span&gt;)/Dn(r+&lt;span class="integer"&gt;1&lt;/span&gt;)
        &lt;span class="keyword"&gt;if&lt;/span&gt; p &amp;lt; prob:
            &lt;span class="comment"&gt;# Close the cycle&lt;/span&gt;
            remaining.pop(rand_i)
    &lt;span class="keyword"&gt;return&lt;/span&gt; perm&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2020/12/7/deranged_sinterklaas/rand_derangement.png" alt="A bar chart showing the frequency of each derangement produced in 10,000 trials. The rand_derangement() algorithm appears to be uniform."&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 5. Count of each derangement produced after running rand_derangement() 10,000 times with \(n = 6\). \(\chi^2 \approx 261.1\) and the chi-squared test p-value ≈ 0.54.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Arndt&amp;#8217;s implementation is in C with a precomputed lookup table for the ratio calculated on the &lt;code&gt;prob = r * Dn(r-1)/Dn(r+1)&lt;/code&gt; line. Even then he reports it is only slightly faster than the rejection method. This Python implementation is actually about twice as slow as the rejection method in my tests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;But one advantage of generating derangements directly as in &lt;code&gt;rand_derangement()&lt;/code&gt; is that it can be generalized to generate derangements with minimum cycle lengths. Arndt shows how that can be done in his thesis.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;There are other ways to generate random derangements that I&amp;#8217;ve not covered in this post.
Earlier this year J. Ricardo G. Mendonça published two new algorithms for [almost-]uniformly generating random derangements: &lt;a href="https://arxiv.org/pdf/1809.04571.pdf"&gt;&amp;#8220;Efficient generation of random derangements with the expected distribution of cycle lengths,&amp;#8221;&lt;/a&gt; &lt;em&gt;Computational and Applied Mathematics&lt;/em&gt; 39, no. 3 (2020): 1-15.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="software"&gt;Sinterbot2020&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;sinterbot&lt;/code&gt; is a little command line program (Python 3.5+) that helps to manage secret santa assignments. With &lt;code&gt;sinterbot&lt;/code&gt; you can generate a valid secret santa assignment for a list of people and email each person their assigned gift recipient without ever revealing to anybody (including the operator of &lt;code&gt;sinterbot&lt;/code&gt;) the full secret list of assignments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Source code and more usage instructions: &lt;a href="https://github.com/cristoper/sinterbot" class="bare"&gt;https://github.com/cristoper/sinterbot&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;sinterbot&lt;/code&gt; allows specifying some extra constraints such as minimum cycle length or a blacklist of people who should not be assigned to each other.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_installation"&gt;Installation&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="sh"&gt;pip install sinterbot&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_usage"&gt;Usage&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;First create a config file with a list of participants' names and email addresses. The config file may also specify constraints for minimum cycle length and a blacklist. See &lt;a href="https://github.com/cristoper/sinterbot/blob/master/sample.conf"&gt;sample.conf&lt;/a&gt; for a full example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="xmas2020.conf"&gt;# xmas2020.conf
Santa A: user1@email.tld
Santa B: user2@email.tld
Santa C: user3@email.tld
Santa D: user4@email.tld
Santa E: user5@email.tld&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The format is &lt;code&gt;Name: emailaddress&lt;/code&gt;. Only the email addresses need to be unique.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then run &lt;code&gt;sinterbot derange&lt;/code&gt; to compute a valid assignment and save it to the config file:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="sh"&gt;$ sinterbot derange xmas2020.conf
Derangement info successfully added to config file.
Use `sinterbot send sample.conf -c smtp.conf` to send emails!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;&lt;code&gt;sinterbot&lt;/code&gt; will not allow you to re-derange a config file without passing the &lt;code&gt;--force&lt;/code&gt; flag.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Now if you want you can view the secret santa assignments with &lt;code&gt;sinterbot view xmas2020.conf&lt;/code&gt;. However, if you&amp;#8217;re a participant that would ruin the suprise for you! Instead you can email each person their assignment without ever seeing them yourself.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;First create a file to specify your SMTP credentials:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="sh"&gt;# smtp.conf
SMTPEmail: yourname@gmail.com
SMTPPass: yourgmailpassword
SMTPServer: smtp.gmail.com
SMTPPort: 587&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;(If you do not know what SMTP server to use but you have a gmail account, you can &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-use-google-s-smtp-server"&gt;use gmail&amp;#8217;s SMTP server&lt;/a&gt;) using values like those exemplified above.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Then run the &lt;code&gt;sinterbot send&lt;/code&gt; command, giving it the smtp credentials file with the &lt;code&gt;-c&lt;/code&gt; option, to send the emails:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre class="CodeRay highlight"&gt;&lt;code data-lang="sh"&gt;$ sinterbot send xmas2020.conf -c smtp.conf
Send message to user1@email.tld!
Send message to user2@email.tld!
Send message to user3@email.tld!
Send message to user4@email.tld!
Send message to user5@email.tld!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
    <summary type="html">How to generate uniformly random derangement for secret santa purposes.</summary>
  </entry>
  <entry>
    <id>tag:catswhisker.xyz,2019-12-04:/log/2019/12/3/fo_december/</id>
    <title type="html">FO Roundup December 2019</title>
    <published>2019-12-04T04:48:59Z</published>
    <updated>2019-12-04T04:48:59Z</updated>
    <link rel="alternate" href="http://catswhisker.xyz/log/2019/12/3/fo_december/" type="text/html"/>
    <content type="html">&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2019/12/3/fo_december/verbatim/hat-small.webp" alt="hat small"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I&amp;#8217;m a slow knitter.
My ravelry.com account is nine years old today, and I&amp;#8217;ve just posted my first projects (and design!)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_socks"&gt;Socks&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="socks.jpg"&gt;&lt;img src="/log/2019/12/3/fo_december/socks-thumb.jpg" alt="socks thumb"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I wanted to try something with some more shape than my usual hats and scarves. I didn&amp;#8217;t follow any pattern, but I read about different ways to do heels and toes. I found the various &amp;#8220;sock recipes&amp;#8221; you can find online to be helpful (like Vickie Howell&amp;#8217;s &lt;a href="https://vickiehowell.com/2018/06/how-to-knit-socks"&gt;How to Knit Socks&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I ended up working cuff down: a few inches of ribbing with a 9" circumference, a heel flap, what I think is a &lt;a href="https://pieceworkmagazine.com/french-heels-versus-dutch/"&gt;French heel&lt;/a&gt; or similar, a gusset, the foot tube until it fit my feet, decrease for the toe, and then Kirchner stitch to finish the toe.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I used the magic loop method, and got a bit turned around after finishing the heel, but figured out a way to proceed. I&amp;#8217;m sure there&amp;#8217;s lots of ways to handle socks on a magic loop.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;They are comfortable! I like the self-striping yarn. No one believes me, but I intentionally did not start the socks at the same place in the striping.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;More details on my Ravelry Project: &lt;a href="https://www.ravelry.com/projects/cristoperb/learning-socks"&gt;Learning Socks&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_dad_cable_hat"&gt;Dad Cable Hat&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="cabled.jpg"&gt;&lt;img src="/log/2019/12/3/fo_december/cabled-thumb.jpg" alt="cabled thumb"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;After having made several very simple stockinette hats, I wanted to try something a bit fancier looking. So I tried this &lt;a href="https://www.knitdarling.com/patterns/cabled-dad-hat/"&gt;&amp;#8220;Cabled Dad Hat&amp;#8221;&lt;/a&gt; pattern by Alexis Winslow. Mine turned out with rather stiff peaks at the decreases, I think because of the yarn I used, but I like the pattern: the twists give it nice texture without looking too cable-heavy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry project: &lt;a href="https://www.ravelry.com/projects/cristoperb/cabled-dad-hat"&gt;Cabled Dad Hat&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_ombre_hat"&gt;Ombre Hat&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="openblock float-group"&gt;
&lt;div class="content"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="ombre.jpg"&gt;&lt;img src="/log/2019/12/3/fo_december/ombre-thumb.jpg" alt="ombre thumb"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;I also wanted to try one with a little bit of color work. Emily Dormier&amp;#8217;s &lt;a href="https://www.ravelry.com/patterns/library/quick-ombre-hat"&gt;Quick Ombré Hat&lt;/a&gt; is a simple two-color pattern with a nice fade effect.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Ravelry project: &lt;a href="https://www.ravelry.com/projects/cristoperb/quick-ombre-hat"&gt;Quick Ombré Hat&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_hats_for_the_homeless_and_a_simple_crochet_cap_pattern"&gt;Hats for the Homeless and a Simple Crochet Cap Pattern&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="imageblock left"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="hats.jpg"&gt;&lt;img src="/log/2019/12/3/fo_december/hats-thumb.jpg" alt="hats thumb"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Years ago, when my Ravelry account was still young and blank, a friend taught me how to crochet a simple beanie as part of a "hats for the homeless" event she organized.
I&amp;#8217;ve written down that pattern along with some notes for the beginner: &lt;a href="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/"&gt;Simple Crochet Beanie Cap Pattern and Notes&lt;/a&gt;.
I also re-discovered some of the hats we created at that event, added a few more, and (finally) donated them to &lt;a href="http://www.stbenedicthealthandhealing.org/"&gt;a local charity&lt;/a&gt; that distributes them at its free health clinics and soup kitchens.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The &lt;a href="https://warmupamerica.org/"&gt;Warm Up America! Foundation&lt;/a&gt; coordinates the collection of knit/crochet goods for similar charities throughout the country.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
    <summary type="html">I've started knitting again.</summary>
  </entry>
  <entry>
    <id>tag:catswhisker.xyz,2019-12-03:/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/</id>
    <title type="html">Crochet Your First Hat: Simple Beanie Cap Pattern and Notes</title>
    <published>2019-12-03T22:32:05Z</published>
    <updated>2022-01-28T18:47:23Z</updated>
    <link rel="alternate" href="http://catswhisker.xyz/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/" type="text/html"/>
    <content type="html">&lt;div class="imageblock right"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="finished.jpg"&gt;&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/transparent.png" alt="transparent" width="350"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;A friend organized a project to crochet hats for the homeless (or other cold people) one winter. She gave us a simple hat pattern to learn and these notes are my attempt to make sense of it and explain to other beginning crocheters, including a schematic diagram.
So this is not my original design (it&amp;#8217;s so simple that it and similar designs have likely been independently made many times)&amp;#8201;&amp;#8212;&amp;#8201;though I did make a small modification to remove the seam the original pattern left down the entire length of the hat.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This pattern is also available on Ravelry: &lt;a href="https://www.ravelry.com/patterns/library/simple-crochet-beanie-4"&gt;Simple Crochet Beanie&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;a href="http://www.ravelry.com/badges/redirect?p=simple-crochet-beanie-4"&gt;&lt;img src="https://api.ravelry.com/badges/projects?p=simple-crochet-beanie-4&amp;t=.svg" style="border: none;" /&gt;&lt;/a&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_yarn_hook_size_sizing"&gt;Yarn, hook size, sizing&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Use a medium/worsted weight yarn.
Acrylic yarn is inexpensive and nonallergic, but it does not retain heat when it gets wet and it melts when exposed to open flame which could pose a safety concern.
Wool stays warm even when it is wet and does not melt, but it is expensive and some people are allergic to it.
All of the hats pictured in these pattern notes are made with 100% acrylic yarn.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;As presented below this pattern is for an adult-sized cap of about 20" circumference.
The exact hook size gauge is not critical, but aim for 14 hdc per 4".
The size can be adjusted both by changing hook size and by changing the number of increase rows performed at the beginning of the pattern.
Anything from size H to J (5.0-6.0mm) hooks should work well with worsted yarn.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_pattern"&gt;Pattern&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Here is how to make the basic hat, presented as a typically terse crochet pattern. It is explained in detail in the notes below.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sidebarblock"&gt;
&lt;div class="content"&gt;
&lt;div class="title"&gt;Key&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For an overview of reading crochet patterns (and other tips on getting started) see the Craft Yarn Council&amp;#8217;s &lt;a href="https://www.craftyarncouncil.com/standards/how-to-read-crochet-pattern"&gt;&amp;#8220;How to Read a Crochet Pattern&amp;#8221;&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="hdlist"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Hdc
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Half-double crochet stitch (called half-treble crochet in the UK) &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote."&gt;1&lt;/a&gt;]&lt;/sup&gt;. This is the stitch which is used throughout the entire pattern.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Sc
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Single crochet stitch (called double crochet in the UK).&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Join
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Join rows with a slip stitch &lt;sup class="footnote"&gt;[&lt;a id="_footnoteref_2" class="footnote" href="#_footnotedef_2" title="View footnote."&gt;2&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
(&amp;#160;)&amp;#160;repeat
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;repeat the instructions in the parenthesis the number of times specified.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
(#)
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Number in parenthesis at end of row denotes the total number of stitches you should have on the circumference of the hat after completing that row.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hdlist"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Row 0
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Chain 1. This first loop will be the center of the hat.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Row 1
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Chain 2 (so you now have 3 chains), make 8 hdc in third chain from hook. Join. (9)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Row 2
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Chain 2, hdc in same stitch, 2 hdc in each remaining stitch. (18)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Row 3
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Chain 2, hdc in same stitch, 1 hdc in next stitch, (2 hdc in next stitch, 1 hdc in next stitch) repeat to end of round. Join. (27)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Row 4
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Chain 2, hdc in same stitch, 1 hdc in next two stitches, (2 hdc in next stitch, 1 hdc in next two stitches) repeat to end of round. Join. (36)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Rows 5-7
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Continue increasing as in Row 4. Each row will have an additional hdc between every increase: chain 2, hdc in same stitch, 1 hdc in next Row#-2 stitches (that&amp;#8217;s the row number minus two), (2 hdc in next stitch, 1 hdc in next Row#-2 stitches) repeat to end of round. Join. (72)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Row 8
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Chain 2, hdc in same stitch, 1 hdc in next six stitches, (2 hdc in next stitch, 1 hdc in next six stitches) repeat to end of round. Do not join! (72)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Rows 9-end
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Hdc in next stitch (instead of slip), continue around making one hdc in each stitch until hat is of desired length.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Finish
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Make last two stitches as sc to reduce the offset caused by the spiral. Cut yarn and pull through last stitch to secure.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_pattern_schematic_diagram"&gt;Pattern Schematic Diagram&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;See below for a detailed textual description of the pattern.
But it can also be useful to look at a blueprint diagram to understand the structure of a crochet pattern.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sidebarblock"&gt;
&lt;div class="content"&gt;
&lt;div class="title"&gt;Key&lt;/div&gt;
&lt;div class="hdlist"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
&lt;span class="image"&gt;&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/hdc-image.png" alt="hdc image"&gt;&lt;/span&gt;
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Half-double crochet (hdc)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
&lt;span class="image"&gt;&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/chain-image.png" alt="chain image"&gt;&lt;/span&gt;
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Chain&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
&lt;span class="image"&gt;&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/slip-image.png" alt="slip image"&gt;&lt;/span&gt;
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;Slip stitch&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Resources for reading crochet diagrams:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&amp;#8220;How to Follow a Stitch Diagram in Crochet&amp;#8221;: &lt;a href="http://www.dummies.com/how-to/content/how-to-follow-a-stitch-diagram-in-crochet.html" class="bare"&gt;http://www.dummies.com/how-to/content/how-to-follow-a-stitch-diagram-in-crochet.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;#8220;Crochet chart symbols&amp;#8221;: &lt;a href="http://www.craftyarncouncil.com/chart_crochet.html" class="bare"&gt;http://www.craftyarncouncil.com/chart_crochet.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;#8220;Annie&amp;#8217;s Stitch Guide&amp;#8221;: &lt;a href="https://www.anniescatalog.com/crochet/content.html?content_id=708&amp;amp;type_id=S&amp;amp;scat_id=3" class="bare"&gt;https://www.anniescatalog.com/crochet/content.html?content_id=708&amp;amp;type_id=S&amp;amp;scat_id=3&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/schematic-spiral.png" alt="Schematic of hat Pattern"&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 1. Schematic of Hat Pattern&lt;/div&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;(&lt;a href="schematic-spiral.svg"&gt;SVGversion&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The above image shows a graphic representation of the hat pattern. Each row is a different color to make it easier to follow. Read it like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="olist arabic"&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;
&lt;p&gt;The base chain 3 is the red chain in the center. Start there and then read counterclockwise (left-handed crocheters will read counterclockwise, but actually work clockwise).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Work around Row 1 (black), making 8 hdc through the first loop of the base chain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When you get back around, make a slip stitch (the solid circle symbol) into the top loop of the base chain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Move up to the next row (green): chain 2. Continue around to the left of that chain making 17 hdc (two into each of the hdc of the previous row), then joining to the starting chain with a slip stitch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;#8230;&amp;#8203; and so on until you get to the last row shown in the schematic (bright green). In this row notice you only make one hdc in each stitch of the previous row. Repeat this row until the hat is the desired length.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The diagram only increases to 63 stitches for a smaller hat. Add one more row of increasing for a larger hat.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;By looking at the schematic you can see:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How the turning chain 2 of each row acts like an hdc in the pattern&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Where each increase is made&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Each increase is made on the first stitch of the increase directly below it&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The seam formed by the slip stitch and turning chain of each row&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_notes_on_pattern"&gt;Notes on Pattern&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_to_the_beginner"&gt;To the beginner&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This is a beginner-friendly pattern (which assumes you know or can look up the basics of chaining, slip stitches, and crochet stitches) &lt;em&gt;except&lt;/em&gt; for the first two rounds.
It starts off by putting 8 stitches through a single loop which gets quite crowded and can be very difficult to see what&amp;#8217;s going on.
Having an experienced crocheter on hand to help you get the hat started can save lots of frustration.
Using a lightweight and light-colored yarn, a larger hook, and having good lighting will make these first rows easier.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_row_0_chain_1"&gt;Row 0: Chain 1&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The first step is to attach the yarn to the hook with a slipknot.
Maybe leave the loop formed by the slipknot a little loose rather than cinching it close to the hook in order to make the first row easier (this loop is where you&amp;#8217;ll make the first 8 stitches).
Then make one chain stitch, which will be the center of the top of the hat. You&amp;#8217;ll make the first 8 stitches through that loop which, when joined, will form a circle. The next rows then work around that circle increasing its diameter for the crown of the hat.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If the tail end of the yarn is getting in your way, you can cut it short.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_alternatives_for_center_loop"&gt;Alternatives for center loop&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The first few rows are the most difficult because it is hard to see what is happening and where the next stitch is. The first row is especially difficult since you can lose track of the center loop before finishing the 8 stitches. Here are two alternative methods of beginning which give a bigger first loop to make all 8 initial stitches into so it is easier to work with.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect4"&gt;
&lt;h5 id="_chain_loop"&gt;Chain Loop&lt;/h5&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;First chain five or six. Then slip stitch into the first chain you made to join into a ring. Then continue the pattern from Row 1. The difference is that you will make all 8 stitches in Row 1 into the center of the ring of chains you made instead of trying to do them all through a single chain stitch.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect4"&gt;
&lt;h5 id="_base_adjustable_ring_magic_ring"&gt;Base Adjustable Ring ("Magic Ring")&lt;/h5&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Another way to begin with a bigger base ring for making the first 8 stitches in is to make a loop of yarn, make all 8 stitches into it, and then pull to close the loop. The advantage is that it is easier to stitch the 8 first stitches into a large ring, and you can then pull the ring closed so that hat won&amp;#8217;t have a big hole at the top.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Good written instructions for the magic ring can be found in &lt;a href="http://vividkreations.com.au/tutorial-the-double-magic-circle/"&gt;this tutorial by Vivid Kreations&lt;/a&gt;.
Both of these alternative methods are also demonstrated in many YouTube videos, such as &lt;a href="https://www.youtube.com/watch?v=PXciky2GvOI"&gt;this one&lt;/a&gt; by  B.Hooked Crochet &amp;amp; Knitting:&lt;/p&gt;
&lt;/div&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/PXciky2GvOI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_row_1_chain_2_make_8_hdc_in_third_chain_from_hook_join_9"&gt;Row 1: Chain 2, make 8 hdc in third chain from hook. Join. (9)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;You are going to make 8 hdc stitches into the first chain you made (the one furthest from the hook), which you will then join together into a circle.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The chain 2 you make at the beginning of every row counts as an hdc stitch. Two chains equals the height of one half-double crochet stitch, and you will always chain 2 at the beginning of every row while increasing. So when you complete Row 1 you&amp;#8217;ll have 9 stitches on the circumference: 8 hdc + the chain. You should be able to count 9 V-shaped stitches which you will work into on the next row.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/row1.jpg" alt="row1"&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 2. The first row of 8 hdc joined to the initial turning chain. This little circle will become the top of the hat.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_half_double_crochet_hdc"&gt;Half-Double Crochet (HDC)&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The entire hat is made out of half-double crochet stitches which creates a slightly more dense (and warm) fabric than double crochet, but builds up faster than using single crochet:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="olist arabic"&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;
&lt;p&gt;Wrap the yarn over the hook towards your body. This is called yarn over (often abbreviated to yo in patterns). You should now have 2 loops on the hook.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Insert hook through the next stitch to be worked. For Row 1 this means to insert the hook through the center loop for all 8 hdc. For other rows, insert beneath both strands that form the V shape of the top of each stitch. (You can instead insert through the two strands to only pick up one of them; this will result in a more flexible fabric.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yarn over hook.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use the tip of the hook to pull the yarn up through stitch. You should now have 3 loops on the hook.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yarn over hook. You should now have 4 loops on the hook.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull the loop closest to the tip of the hook through all 3 other loops on hook. That completes the half-double stitch (you should be left with one loop on the hook, and you can start again into the next stitch to be worked).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect3"&gt;
&lt;h4 id="_joining_rows"&gt;Joining rows&lt;/h4&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;At the end of each of the first 8 rows, join to the beginning of the row by making a slip stitch into the top loop of the turning chain you started the row with:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="olist arabic"&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;
&lt;p&gt;Insert the hook through the stitch (the top turning chain loop).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yarn over.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull the yarn up through both the stitch and the loop already on the crochet hook. You should be left with a single loop on the crochet hook ready to chain.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;When inserting the hook into the chain stitch, don&amp;#8217;t just insert it in the space beneath the chain. That will result in a more-visible seam on the hat. Instead insert it beneath the V of the top loop of the chain like you do every other stitch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;After joining a row, you will begin a new row by chaining 2. The purpose of
joining and chaining is to bring the next row to the proper height for a hdc
without stretching the stitch. However, the line of join and turning chains is often visible as a seam-like line in the finished work. For that reason, after the increases in the crown of the hat have been completed this pattern no longer calls for joining and chaining between rows. Instead make the first stitch of the new row directly on the first stitch of the previous row. The distortion of an hdc directly spanning rows is minimal, and this allows creating the main part of the hat with no visible join seam.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_row_2_chain_2_hdc_in_same_stitch_2_hdc_in_each_remaining_stitch_18"&gt;Row 2: Chain 2, hdc in same stitch, 2 hdc in each remaining stitch. (18)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In this row we make two hdc stitches in each of the 9 stitches from Row 1, which doubles the size of the circle.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Remember, the chain 2 you do at the start of each row counts as an hdc stitch, so only make one actual hdc stitch into the same stitch you chained from (that&amp;#8217;s why the pattern reads: chain 2, hdc in &amp;#8216;same&amp;#8217; stitch)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Don&amp;#8217;t worry, it gets easier to see what you&amp;#8217;re doing and where to make stitches after this row.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/row2.jpg" alt="row2"&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 3. The circle after round 2&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_rows_3_7_chain_2_hdc_in_same_stitch_1_hdc_in_next_row_2_stitches_2_hdc_in_next_stitch_1_hdc_in_next_row_2_stitches_repeat_to_end_of_round_join"&gt;Rows 3-7 Chain 2, hdc in same stitch, 1 hdc in next Row#-2 stitches, (2 hdc in next stitch, 1 hdc in next Row#-2 stitches) repeat to end of round. Join.&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;These rows uniformly increase the size of the circle. Working two hdc into the same stitch is called an &amp;#8216;increase&amp;#8217; and effectively adds one stitch to the circumference of the hat. On each of Rows 3-8 you&amp;#8217;ll increase 9 times.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Each of Rows 3-8 begins with a chain 2, which counts as an hdc, followed by an hdc in that same stitch. So every row begins with an increase. The remaining 8 increases are spread evenly around the row. On Row 3 you make a single hdc in the next stitch after each increase. On Row 4, you make a single hdc in the next &amp;#8216;two&amp;#8217; stitches after each increase. And so on. So the number of hdc you make in each stitch around the hat follows this pattern (remember the first 2 consists of the chain + the first hdc):&lt;/p&gt;
&lt;/div&gt;
&lt;div class="hdlist"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Row 3
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;2, 1, 2, 1&amp;#8230;&amp;#8203; 2, 1&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Row 4
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;2, 1, 1, 2, 1, 1&amp;#8230;&amp;#8203; 2, 1, 1&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Row 5
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;2, 1, 1, 1, 2, 1, 1, 1&amp;#8230;&amp;#8203; 2, 1, 1, 1&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Row 6
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;2, 1, 1, 1, 1, 2, 1, 1, 1, 1&amp;#8230;&amp;#8203; 2, 1, 1, 1, 1&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="hdlist1"&gt;
Row 7
&lt;/td&gt;
&lt;td class="hdlist2"&gt;
&lt;p&gt;&amp;#8230;&amp;#8203; and so on&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Notice every row ends in a single hdc. That is a good way to test if you counted correctly for that row.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;How do you know where to make the next increase if you lose count? Every increase is made exactly above the stitch formed by the increase made in the previous row. It is possible to examine the previous rows to find where to make the next increase. You can also count the stitches you&amp;#8217;ve already made.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;What if you don&amp;#8217;t make the increase in the correct spot? It doesn&amp;#8217;t really matter. You may end up with a slightly less round circle, or without exactly 72 stitches on the circumference, but it will probably not be noticeable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;If, however, you consistently make too many or too few increases, you&amp;#8217;ll end up with a hat that is too big or too small.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;For a smaller hat, stop increasing after row 7 and go on to Row 9. This gives a circumference of 63 stitches instead of 72.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/row6.jpg" alt="row6"&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 4. Ready to join after Round 6&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_row_8_chain_2_hdc_in_same_stitch_1_hdc_in_next_six_stitches_2_hdc_in_next_stitch_1_hdc_in_next_six_stitches_repeat_to_end_of_round_do_not_join_72"&gt;Row 8: Chain 2, hdc in same stitch, 1 hdc in next six stitches, (2 hdc in next stitch, 1 hdc in next six stitches) repeat to end of round. Do not join! (72)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;This is the last increase row. When you get to the end of the row you should have 72 stitches on the outside of your circle. Do not join with a slip stitch; instead you will begin the next row with a hdc&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/row8.jpg" alt="row8"&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 5. Row 8 is complete, and the first stitch of Row 9 (an hdc and not a chain) has been made&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_rows_9_end_chain_2_hdc_in_the_next_and_every_stitch_around_72"&gt;Rows 9-end: Chain 2, hdc in the &lt;strong&gt;next&lt;/strong&gt; and every stitch around. (72)&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Now you&amp;#8217;re done increasing.
Keep crocheting a single hdc in each stitch all the way around each row until the hat has the length that you want. Try it on every now and then to see how it fits.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/progress.jpg" alt="progress"&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 6. Making progress&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_finish_make_last_two_stitches_as_sc_to_reduce_the_offset_caused_by_the_spiral_cut_yarn_and_pull_through_last_stitch_to_secure"&gt;Finish: Make last two stitches as sc to reduce the offset caused by the spiral. Cut yarn and pull through last stitch to secure.&lt;/h3&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Once the hat is long enough (I like it to cover my ears), finish off with a couple single crochet stitches which will create a less pronounced step between the last and second-to-last rounds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Cut the yarn leaving a few inches and pull the end through the last loop on the hook.
Pull to secure. To make it more secure, weave the end under a few strands on the inside of the hat and then trim it off.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="finished.jpg"&gt;&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/finished-thumb.jpg" alt="finished thumb"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 7. Completed hat&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_variations_and_next"&gt;Variations and Next&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Try using this basic pattern as a platform for experimentation. Do the whole hat in double crochet. Switch yarn colors every few rounds to make a striped hat. Add a &lt;a href="https://www.youtube.com/watch?v=xsEPLeUSwmg"&gt;single crochet ribbed brim to the hat&lt;/a&gt;. Try adding non-increasing rows between the initial increasing rows to give the hat a longer shape.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;The &lt;a href="https://warmupamerica.org/make/current-needs/"&gt;Warm Up America Foundation&lt;/a&gt; collects donated hand knit and chrochet items to distribute to people who need them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="ribbed-full.jpg"&gt;&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/ribbed-thumb.jpg" alt="ribbed thumb"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 8. Hat with double crochet brim&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="color-full.jpg"&gt;&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/color.jpg" alt="color"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 9. Hat with multiple yarn colors&lt;/div&gt;
&lt;/div&gt;
&lt;div class="imageblock"&gt;
&lt;div class="content"&gt;
&lt;a class="image" href="https://www.ravelry.com/projects/cristoperb/simple-crochet-beanie-2"&gt;&lt;img src="/log/2019/12/3/simple_crochet_beanie_cap_pattern_and_notes/brimhat.jpg" alt="brimhat"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="title"&gt;Figure 10. Striped hat with knit rib. Made with a 6mm hook, I changed between two balls of yarn every row (brown and a variegated pink/grey). I stopped the hat once it was about 6" long and picked up the stitches on 5mm 16" circular knitting needles to knit the k1p1 ribbed brim.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_similar_patterns"&gt;Similar Patterns&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=U8IICUqmuFI"&gt;Basic Men&amp;#8217;s Beanie Free Pattern Workshop by Deja Joy&lt;/a&gt; - basically the same pattern; designd for a bigger hook so works up even faster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Kf-h3MDN0N0"&gt;Easy Breezy Beginner&amp;#8217;s Crochet Beanie by Bonnie Barker&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://yayforyarn.com/seamless-double-crochet-hat-with-the-invisible-join-method---free-crochet-pattern/"&gt;Seamless Double-Crochet Hat with the Invisible Join Method&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="footnotes"&gt;
&lt;hr&gt;
&lt;div class="footnote" id="_footnotedef_1"&gt;
&lt;a href="#_footnoteref_1"&gt;1&lt;/a&gt;. Half-double crochet instructions w/photos: &lt;a href="https://web.archive.org/web/20120415065415/http://renee-blixt.suite101.com/the-half-double-crochet-stitch-a40770" class="bare"&gt;https://web.archive.org/web/20120415065415/http://renee-blixt.suite101.com/the-half-double-crochet-stitch-a40770&lt;/a&gt;
&lt;/div&gt;
&lt;div class="footnote" id="_footnotedef_2"&gt;
&lt;a href="#_footnoteref_2"&gt;2&lt;/a&gt;. &lt;a href="http://crochet.about.com/od/learnbasics/qt/slst.htm" class="bare"&gt;http://crochet.about.com/od/learnbasics/qt/slst.htm&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
    <summary type="html">A friend organized a project to crochet hats for the homeless (or other cold people) this winter. She gave us a simple hat pattern to learn and these notes are my attempt to make sense of it and explain to other beginning crocheters, including a schematic diagram.</summary>
  </entry>
</feed>

