Full Width [alt+shift+f] Shortcuts [alt+shift+k]
Sign Up [alt+shift+s] Log In [alt+shift+l]
27

Pentagonal antiprism planter with drip tray, 2023

from Liz Denys [alt+shift+b] in programming

Aged leather / dazzle camouflage / coming together? pushing apart?
13th Sep 2023

Stay updated

Get a weekly newsletter with the top 5 articles worth reading every week.

More from Liz Denys

Lilypad mini quilt

While on a short road trip and then recovering from surgery, I hand quilted and hand embroidered a linen lilypad quilt. And yes, I did make this little quilt for my Frinos plush from Hades II to have a nice place to rest.

5th Jul 2026 • 1 votes
Things to consider when choosing a community ceramics studio, partial list

I've worked out of a handful of different community studios at this point, so I figured I'd share a (probably incomplete) list of you might want to consider when picking a community ceramics studio for your practice. Cost, location, value: I'm not going to comment too much on this as costs vary highly depend on what city/metro area/etc. you're in and you best understand what value you'll get and what you can afford. That said, if you live somewhere walkable and are planning on making at home, you might want somewhere you can walk to or get to with fewer transfers or shorter walking to make transporting fragile greenware simpler. Regardless of your budget, it's good to know all the costs up front: class tuition, membership fees, open studio time fees, firing fees, materials costs, etc. Also, if you live somewhere with a high demand for community ceramics studio access, you may not get to be that picky if you want to start sooner! Equipment and space: What equipment is provided? What condition is it in? How many wheels? How many wheels per member? How many wheels per student? Is there a slab roller? What size? Do they have dedicated canvases or mats for different color clay bodies? Which do you use if you use a non-studio claybody (if you're allowed). Is there an extruder? Which extruder dies does the studio have? Can you use your own if you buy more or make custom dies? What are the policies for who gets to use what equipment and training? Stricter policies usually means equipment will be in good condition, but only if it's enforced. Ask about how often equipment has needed repair and how to report issues, even if they have good policies. What do the workspaces look like? How much space is generally available per person? What kinds of chairs and stools are provided? Are stools at wheels adjustable? Are there bricks or similar available for resting feet on if that helps your wheel positioning? Are handbuilding and glaze area seats comfortable for you? What height are those work areas/chairs? This may not seem very important, but standing height tables can be much less comfortable if you're primarily going to sit. What does your storage space look like? Are shelves shared or do you get dedicated space? How much capacity and weight work on the shelves and how does that fit into your practice? Remember you may be storing tools and clay/reclaim as well as works in progress. There can be lots of politics around shelves - ideal ones are neither too high nor too low, all else equal, and can be very competitive to get. Highest shelves may also be highly coveted since you may be able to stack things very high and store more! How easy is it to move around the studio? How easy is it to get your pieces from the storage space to the working areas to the places where you set them to fire? Are there separate spaces for members and students? Even if there are dedicated student classrooms, do additional classes spill over into other areas or shared areas? How frequently? Is this information easy to find out before you get to the studio? Does the studio provide bats and wareboards? Remember, even if bats and wareboards are provided, you may want to bring your own that you can keep in better condition or have different properties. Are there shared studio tools? What condition are they in? Is there communal newspaper? Communal plastic for slowing down drying? Newspaper is easy to get yourself, but dry cleaning bags are hard to buy in individual-use quantities. Materials: What are the studio claybodies? Do they fit well in your practice? Are they smooth or groggy enough? Which colors of claybodies are available? How durable and food safe are they? Will they reach vitrification and achieve low absorption rates if you're making dinnerware or other vessels intended to hold water? Is clay communal or do you purchase your own? If so, does the studio reclaim for you or is it communal practice? What is done to ensure reclaim isn't short? If clay is not provided, can you buy it at the studio? 25 pound blocks of clay are heavy and annoying to transport if you walk, bike, and take transit everywhere like I do, so this can be a big deal! Can you do agateware/neriage/nerikomi? (Make sure you're doing this with compatible clays, of course.) This question is especially relevant if clay is communal as you cannot simply throw blended clay blocks into reclaim bins for a single clay as this would create a new claybody unexpectedly. Maybe you are required to reclaim yourself, maybe there's a miscellaneous reclaim, or maybe they accept a small amount of loss (remember you can minimize this by ensuring you use all your blocks up - the end can usually be wedged up into a new claybody and made into a little pinch cup or bowl worst case). Can you use outside claybodies? If yes, what's the approval process? Even if you are not personally interested in using outside claybodies, it's good to ask as free-for-alls can result in low fire clays melting all over shelves and ruin other people's work at hotter temperatures. Does the studio provide decorating slips and underglaze? If they don't provide, can you bring your own in? What's the approval process? Can you make your own decorating slips or colored claybodies with Mason stains or oxides? What's the approval process? What are the studio glazes? Are they clearly labeled as food safe vs. not? If multiple claybodies are common in the studio, how many glazes fit each and is this clearly labeled? Are there test tiles for every studio glaze on each studio claybody? Are there any test tiles for glaze combinations? Reminder that test tiles aren't a replacement for doing your own testing - different surface slopes, your dips may be longer or shorter - but they help give you a sense of what's compatible with which clay bodies and which are runny vs. stable. How and how often are studio glazes tested? Are new batches tested before they're put out for use? Are studio glazes typically kept in consistent conditions? Large buckets of glaze can change consistency over time. Is specific gravity monitored periodically so water can be added as needed? Are glazes flocculated well/kept well in suspension or are they often hard-panned? Can you use non-studio glazes? Typically, this means commercial glazes as homemade opens a gigantic can of worms. What's the approval process? Reminder that low fire materials used in higher temperature firings can mess up more work than just where they're used, so even if you're not planning on ever using non-studio glazes, it's good to know what checks are in place to avoid this issue. Does the studio provide wax? Wax brushes? What condition is it in? Does the studio provide oxide washes? Are you allowed to make your own if it doesn't? What's the approval process? Firings: What temperatures does the studio fire to? How does this match their claybodies? A lot of claybodies, especially commercial claybodies, claim to support a range of firing temperatures, but they're not fully vitrified at all of those temperatures, especially at the lower end of their ranges. If a studio fires to both cone 6 and cone 10 and you plan on working primarily with cone 6 glazes, either studio or commercial, and make food-safe pieces, is there an appropriate claybody that will reach vitrification or are they secretly really all meant for cone 10? If you're only interested in making non-functional work, this may not matter to you as much as someone making mugs or vases. Are there special firings, e.g. luster firings? If there are luster firings, make sure to inquire about their safety protocols around luster firings - even if you plan on never using luster, poor safety policies around luster can endanger the health of everyone in the studio. How quickly is work turned around? Faster isn't necessarily very important once you've settled in as you want to be in a flow that has work at all stages at all times so you always have something to do, but it can be helpful to plan your rhythm. What is being done to ensure quality materials and firings? Are cones used in every firing? Is work that is too wet or egregiously overglazed set aside or fired alongside everything else - causing frequent explosions and glaze mishaps that affect other people's work? Cleanliness and safety: How clean is the studio? If you can visit on a few different days, that might help. Do people generally clean up after themselves well? Don't forget to check glazing areas and the undersides of tables and such - lots of clay dust can hide there! Are people taught safe practices (wet cleanup, no dry sanding, etc.)? How often do they actually follow them? What supplemental cleaning does the studio staff do? How frequently? Are there air filters? What quality of cleaning do they provide and are they appropriately matched for the size of the studio? Are there air quality monitors? Note: this doesn't seem very common to find at community studios in my area, but it would be a good sign if the studio did! Access and security: Are there signups for specific space to use or is it a free for all? Signups can be frustrating, but you're guaranteed specific space at a specific time. I've noticed people are better at sticking to an appropriate amount of space for their work that's mindful of those around them when it's a space they have to sign up for, but the flexibility of being able to drop in whenever can be great, too! If studio time is signup-based, are new slots released at clear, consistent times that work for you or will you always be getting picks long after most others do? Do students and members have 24/7 access to the space or do they only access to the studio when it's staffed or it's their class or for times they've signed up for? When is the studio open? It can be especially helpful to check in on drying and potentially spray a piece with a little water if it's getting too dry before you're able to do work, even if it's not a time you can do work. It's also great for getting a sense of how quickly pieces dry at the beginning of new seasons/studio temperature and humidity conditions. Who's allowed in the studio? Are there video cameras? Staff on site? Studio flow: Getting a sense of a studio's flow is easiest by seeing and trying out the studio! Take a tour, attend a workshop, take a class! If you're interested in membership, it may still make sense to take a multiple-week class first, and at least in Brooklyn, a lot of studios require you to take a class at their studio before getting a membership to learn how their studio operates day to day. If you're interested in membership, note that membership flows and class flows might be different - different spaces, different open studio policies, different storage situations for work and tools, etc. for example, a studio I loved to work out of as a member was a terrible experience during a handbuilding class because it tried to cramp too many people in too small of a space, but members weren't in the member handbuilding areas as much all at once, so I could finally enjoy the studio. Also, students often share a communal shelf in my area, while members have more dedicated storage space, allowing for more projects at once and storing more tools and other items used in their practice. Community vibe: Is it more social? More get down to business? Loud? Quiet as a mouse? How do you vibe with the community? Does the studio have a code of conduct? Is it a good code of conduct? Does wearing headphones generally mean "don't bother me" or do people interrupt everyone frequently? How do the owners and staff interact with staff? How do owners and staff interact with students and members? What are their expectations of members? I've been at studios where the owners and staff really don't want to ever interact with you, but I also once worked out of a studio where the owner would roll in and interrupt whatever was going on to use whoever was at studio as their personal therapist... even though it was time those members and students were paying her to use the studio. While the latter is a pretty extreme example, I've heard from ceramist friends in many areas that it's sadly not that uncommon to encounter overbearing owners that sour the experience. Miscellaneous: Are you allowed to sell work you make there? Are there community shows/sales? Are there official or unofficial limits on the volume of work? Some studios only want potters who aren't making very small quantities of work or only small to medium sized pieces because they don't actually have the capacity for high throughput or larger work... but not all of them will have clear policies on this. If there's a limit but it's only an unofficial policy, it will likely be applied unevenly. Finally, while it's unlikely that every community studio, or perhaps even any community studio, will be a completely perfect fit for any given potter, I've personally found my practice to be enjoyable at every community studio I've been at with a good community vibe. The goal of this list isn't to find a reason to avoid any particular studio as much as knowing how a studio's choices or limitations might affect your practice so you know what to expect and how to adapt!

10th Mar 2026 • 1 votes
WWII watch cap crown shaping

Like so many other hat knitters, I've knitted the classic WWII watch cap, which is also known as Beanie no. 212, more than a handful of times. (You can find it on Ravelry here and here, respectively.) It's a charming, quick knit that's easy to resize, but I've never really liked the crown shaping on the original. I've knit a lot of these hats, and only one's had the original crown shaping for the decreases. I'm sharing two crown shaping variations I keep going back to below. I always knit this hat in the round, and my crown shaping patterns assume you will be knitting in the round, too. Alternate crown shaping 1 This alternate crown shaping follows the 6x2 ribbing of the previous section for the bulk of each round so that the ribbing continues throughout the entire hat. Written out: Divide stitches on 3 double pointed needles with stitches evenly divided among the three needles or mark out even sections with stitch markers if decreasing across 2 circular needles or with magic loop. (k1, ssk or skp, k if previous row was knit or p if previous row was purl until 3 stitches are left on the needle/before the next marker, k2tog, k) x3. Repeat step 1 until 4 stitches remain on each needle/in each marked section. Cut and draw yarn through the remaining 12 stitches 2-3 times. Tie off and weave in the ends. Alternate crown shaping 2 This alternate shaping both maintains the ribbing throughout the crown shaping and accentuates it by creating a sort of three-pointed star with 3 of the 2-stitch-wide purl parts from the previous 6x2 ribbed section. This shaping really only makes sense when making a size hat where the number of stitches is evenly divisible by 24, so I typically only do it on size "small" hats (cast on 96 stitches). You could adjust the needle size and gauge for a yarn that works well at that gauge to make this work for different sizes. Written out: Stop the last 6x2 ribbed row 1 stitch early and divide stitches on 3 double pointed needles with stitches evenly divided among the three needles or mark out even sections with stitch markers if decreasing across 2 circular needles or with magic loop. Ensure that each needle transition or marker has a single purl stitch on each side. (p1, ssk or skp, k if previous row was knit or p if previous row was purl until 3 stitches are left on the needle/before the next marker, k2tog, p) x3. Repeat step 1 until 4 stitches remain on each needle/in each marked section. Cut and draw yarn through the remaining 12 stitches 2-3 times. Tie off and weave in the ends. Additional project notes Needle: US 7 - 4.5 mm Gauge: 19 stitches and 24 rows = 4 inches in stockinette Hats made for me should generally be a small (cast on 96 stitches), and hats made for my partner Matt should generally be a medium (cast on 104 stitches). Footnotes Either of these will create a left-leaning decrease, use whichever one you prefer.↩ Ibid.↩

15th Dec 2025 • 1 votes
NYC Bike Rules for Drivers mini-zine

After five different drivers, including a school bus driver, aggressively close-passed me in Midwood last night and two of them threatened me just for being on the street, I realized there's a huge gap in educational outreach about bike rules in NYC: drivers. I decided to make a mini-zine that demystifies the behavior of law-abiding bicyclists like myself and helps drivers better understand what to expect when sharing the road: All text and illustrations in the mini-zine are my own. Many thanks to Matt Denys for help proofreading! This zine is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License, so you can copy and distribute this zine for noncommercial purposes in unadapted form as long as you give credit to me. Gas stations, car dealerships, auto repair shops, rental car offices, parking lots, book shops, restaurants, coffee shops, and other commercial establishments are welcome to give out these zines, too - as long as the zine itself is free! Check out the NYC Bike Rules for Drivers mini-zine on the web or download the pdf to print here!

21st Oct 2025 • 1 votes
How to fold a mini-zine

Here's how to fold a mini-zine, featuring my mini-zine So you want to make a public comment! Fold the printed mini-zine page in half, then half in again, and then in half again as shown. When you open the piece of paper, each of the pages should fit fully within a set of folds. With the mini-zine page completely open, fold it in half with short ends touching ("hamburger style") so the text is on the outside. Using scissors, cut a across the dotted line. When you reopen your paper, there will be a slit in the middle of the sheet. Fold the paper in half lengthwise with long ends touching ("hotdog style"), hold the paper at either end, and fold the sheet into itself to form an 8-page booklet. Make sure the cover is on the front!

15th Aug 2025 • 1 votes

More in programming

Clip of me singing Despard in Ruddigore in 2013

A clip of me singing a funny song from Gilbert and Sullivan’s Ruddigore back in 2013

11 hours ago • 1 votes
How and Why fork() Uses Copy-on-Write

In this video, we look at why fork() needs copy-on-write, how it works inside the kernel, and a memory usage problem that Instagram encountered with Python.

17 hours ago • 1 votes
What we lost when we lost comments

Comments require commitment, but they’re worth it.

23 hours ago • 1 votes
Two-Stack Sliding-Window Aggregation

An aggregation is some kind of summary of a set of data. This can be the sum, length, minimum, etc. It is quite common to want to calculate such a summary repeatedly, e.g. “the maximum noise level in dB for the past 30 seconds” for a nuisance detector. In such a case we say there is a sliding window over our data, and we want to aggregate over our window. If our aggregation is a binary operator with an inverse, like integer sums, there is a very easy solution using a double-ended queue: from collections import deque class SlidingWindowSum: def __init__(self): self.sum = 0 self.elems = deque() def push(self, x): self.sum += x self.elems.append(x) def pop(self): self.sum -= self.elems.popleft() def eval(self): return self.sum But what if our operator has no inverse? This is actually the case for most interesting summaries such as minimum, quantile, approximate unique count (for example using HyperLogLog), etc. In fact, even something as simple as a floating-point sum suffers from the fact that floating-point addition is not invertible. For example, if you ever have a NaN in your input data with the above naive algorithm your sum will forever remain NaN, even long after the bad value has left your window. Six years ago I came up with an algorithm for maintaining just the minimum/maximum in a sliding window and posted it to cs.stackexchange. I now consider this algorithm pointless, because it turns out there is a simple and efficient algorithm that solves this problem for a very wide class of aggregations. I’m writing this blog post to spread the word, because I feel it should be more widely known. Folklore I came across this algorithm while reading a far more advanced paper, Low-Latency Sliding-Window Aggregation in Worst-Case Constant Time by Tangwongsan et al. Why is this paper titled low-latency? Because it does the same as what I’m about to describe, but in O(1) time for each step. However, in it they also described a “two-stack” algorithm, which does it in amortized O(1), and is far, far simpler. Amortized O(1) means that across many operations the total amount of work per element is constant, but an individual operation can take much longer. This is almost always fine, unless you absolutely need a low upper bound on latency. Funnily enough that paper attributes this algorithm to “adamax” from a 2011 Stack Overflow post. They in turn credit a 2001 lecture note by D. Sleator for the inspiration. However, this lecture note does not describe a sliding window aggregate, it describes the classical two-stack algorithm for implementing a FIFO queue and does amortized analysis on it. Ultimately I would not be surprised to find that this algorithm was already described in an obscure paper from the 1970s, seeing how simple and brilliant it is. Two stacks Like the authors of the paper, I will generalize the two-stack algorithm to arbitrary associative aggregation functions. By abstracting the aggregation as a set of functions, empty(), unit(x), combine(x, y) and finalize(x), you can describe many possible aggregations, for example a mean: empty = lambda: (0, 0) unit = lambda x: (x, 1) combine = lambda x, y: (x[0] + y[0], x[1] + y[1]) finalize = lambda x: x[0] / x[1] if x[1] else None I’d like to note here that these functions have the following signatures: fn empty() -> Agg; fn unit(x: Value) -> Agg; fn combine(x: Agg, y: Agg) -> Agg; fn finalize(x: Agg) -> Out; I’m making a distinction here between Value, Agg and Out because while they seem superficially similar for something like an integer sum, for an approximate unique count on strings you would have (Value, Agg, Out) = (String, HyperLogLogSketch, u64), three wildly different types. Without further ado, the algorithm: class TwoStackAgg: def __init__(self): self.values = [] self.values_agg = empty() self.cum_aggs = [] def push(self, x): self.values.append(x) self.values_agg = combine(self.values_agg, unit(x)) def pop(self): if not self.cum_aggs: cum_agg = empty() while self.values: cum_agg = combine(unit(self.values.pop()), cum_agg) self.cum_aggs.append(cum_agg) self.values_agg = empty() self.cum_aggs.pop() def eval(self): return finalize( combine(self.cum_aggs[-1], self.values_agg) if self.cum_aggs else self.values_agg ) That’s it, the entire algorithm. There’s two stacks (values and cum_aggs) and one more aggregate, values_agg. At any point in time values_agg holds the aggregate of values, and cum_aggs contains the cumulative aggregates of all values in our window that aren’t in values, in reverse order. From this we can get the aggregate over our entire window in constant time by by combining the last value of cum_aggs with values_agg. The neat part is that (assuming w is our window size) every wth operation we drain all of values and maintain a running aggregate while pushing the partial cumulative aggregates onto cum_aggs. This is what makes it amortized O(1), doing O(w) internal operations every wth pop bounds the total amount of work per element to O(1), even though a singular operation might not be constant time. I think this is best visualized. Suppose we sum [1, 2, ..., 10] with a fixed-size sliding window of four elements, then the state on each eval() call would look like this (values_agg not shown as it is simply the aggregate of the values): cum_aggs values out [] [] = 0 [] [1] = 1 [] [1, 2] = 1 + 2 [] [1, 2, 3] = 1 + 2 + 3 [] [1, 2, 3, 4] = 1 + 2 + 3 + 4 [4, 3 + 4, 2 + 3 + 4] [5] = 2 + 3 + 4 + 5 [4, 3 + 4] [5, 6] = 3 + 4 + 5 + 6 [4] [5, 6, 7] = 4 + 5 + 6 + 7 [] [5, 6, 7, 8] = 5 + 6 + 7 + 8 [8, 7 + 8, 6 + 7 + 8] [9] = 6 + 7 + 8 + 9 [8, 7 + 8] [9, 10] = 7 + 8 + 9 + 10 [8] [9, 10] = 8 + 9 + 10 [] [9, 10] = 9 + 10 [10] [] = 10 [] [] = 0 In total the memory usage is O(w), where w is your maximum window size. Note that for simplicity of analysis and the example I assumed a fixed-size window w, but there is nothing about the two-stack algorithm that requires this. You can call push(x) and pop() as many times as you’d like between each eval(), growing and shrinking the window size as needed. Floating-point non-associativity Note that we required above that our aggregate combine is associative, meaning: combine(combine(x, y), z) = combine(x, combine(y, z)) Technically speaking, floating-point addition doesn’t respect this. Nevertheless, the above algorithm is still very useful because the results closely match the expected outcome, even more so if you use a compensated summation algorithm like Kahan summation. Another neat thing about the two-stack algorithm is that it doesn’t require commutativity, if you follow the above implementation precisely. The order of operands is maintained, which can matter for things like string concatenation. However, there is a second very useful property of the above algorithm. Each aggregate is strictly a combination of the elements in the window, and none outside the window. This means if your window contains a NaN or infinity (or some other outlier), that value only poisons the windows that contain it rather than the rest of your computation. But even without NaN or infinity it is useful, due to not propagating errors endlessly. E.g. if your sliding window starts with [1e20, 1], this is what would happen with a naive rolling sum: >>> 1e20 + 1 - 1e20 - 1 -1.0 Compensated summation will reduce these effects, but not making your result depend on values outside of the window will eliminate long-term error accumulation entirely.

23 hours ago • 1 votes
Lighthouse map

Lovely global map with animated lights sweeping the waters

yesterday • 1 votes
📚 BoredReading

You seem to be enjoying this.

Join free to unlock everything.

Create free account

Already have an account? Sign in