Deterministic identifier is the bit I would do first because it is ten minutes and it makes the rest of the debugging honest. As long as the id changes per attempt you cannot tell a duplicate from a genuine second task.
Rueben Alsop
@rueben_alsop
I run a two-van window cleaning outfit and do all the scheduling, invoicing and hiring myself. Ask me about payroll headaches before you have employees, not after.
117 credit Trusted
- From answers
- 0
- From questions
- 117
It also invalidates every other token in existence, so you log out your entire user base to ban one person. It works in the sense that a fire alarm works on burnt toast.
There is a narrow real version of this - key rotation with a key id so you can retire one key while others stay valid - but that is a key management design, not a ban button.
You made this trade deliberately when you picked stateless tokens: one database read per request in exchange for revocation being eventually consistent. It is a fine trade. It is just a trade, and you are now paying the part you did not price in.
The standard shape is a short access token, 5 to 10 minutes, plus a refresh token that does hit the database. Revocation then has a bounded window equal to the access token life. On top of that, a denylist keyed by jti in Redis or KV with a TTL equal to the token's remaining life, so entries clean themselves up and the set stays tiny.
The honest thing to check first: how many of your requests already read the database for user data? If it is most of them, you do not have stateless sessions, you have server sessions with an extra signature verification step and worse revocation. In that case going back is not a defeat, it is just noticing.
Remember the claim outlives the membership. Remove someone from an org and their existing token still says they belong until it expires. Short TTL, or re-check membership on writes, or both. This is the same revocation conversation as bans, just with a different noun.
Post the decisions, include the number that made the decision, skip the days where there is nothing. Consistency matters less than being worth reading.
I split my list in the end. Paid a plumber for the toilet, an electrician for the switch, and did the shelves and patching myself over two weekends. It cost less and took three weeks instead of one day, which is exactly the trade you are choosing between.
Lumpiness rather than average is the framing I needed. We could absorb a slow drip and a roof would mean borrowing.
Not knowing who to call is a cost I had not priced. The render is the bit that worries me most about the new one.
And the unbilled hours are the horrible ones. Nobody minds doing the actual work at 9pm. Everybody minds writing the third polite email about an invoice at 9pm.
Once images are handled, the next tier of things that cost frames in a List row:
AnyViewanywhere in the row. It erases the type, so the diffing machinery cannot tell that the structure is unchanged and re-evaluates more than it needs to.- Formatters constructed in body. A
DateFormattercreated per row per redraw is genuinely expensive - hoist it to a static. - Deeply chained modifiers, particularly stacked
.frame,.paddingand.backgroundcombinations that each add a layout pass. - Any computed property on your model that does real work and is read in body.
Measure with the SwiftUI template in Instruments rather than guessing. The "View Body" track shows you which view's body is slow and how often it runs, and "Long View Body Updates" points at the specific offender. It is a much better use of an hour than shotgunning modifiers.
Long lists with images are the case where SwiftUI still is not there. Wrap a UICollectionView with UIViewRepresentable and you get proper prefetching and cell reuse. Fighting the framework on this costs more time than the bridge does.
The other half of that win is asking your backend for a thumbnail URL. Downsampling client-side is the right fix for images you cannot control, but if you own the server, shipping a 1200px image to draw at 60pt is wasting the user's data as well as their CPU.
Very much so, and having cellar access makes you lucky. Mineral wool batts held up with netting stapled to the joists is the standard approach: leave an air gap and don't block any subfloor vents, because those keep the timber dry.
Completely normal and it's a moisture cycle, not a fault. Timber gives up water when the heating is on and takes it back in the humid months, and it moves across the grain far more than along it. On a 150mm board a 5mm swing is unremarkable.
Do not fill them with anything rigid. Filler, resin or wood glue in a gap that moves seasonally will either crack out or, worse, hold the boards apart so they can't close in summer and then split them somewhere else. The traditional answers are slivers of matching timber tapped in and glued to one side only, or a rope-and-caulk method, or accepting the gaps and dealing with the draught underneath instead.
Honestly, in a room you want warm, insulating between the joists from below and draught-proofing the perimeter does far more than filling gaps ever will.
Change the name, not just the domain. If you leave __Host- in place and add a Domain, the browser rejects the whole thing and you end up with the identical bug plus the confidence that you fixed it, which is a worse state than where you started.
Month three is exactly where he is, now that you say it. He started in the spring.
Definitely hollow either side of two of the cracks, solid on the third.
There's a bedroom above so no loft access. Do the washers show through afterwards?
Regardless of what you decide, do this today: stop letting the provider's user id be your primary key.
Own a users table with your own id, and a provider_subject column holding theirs. Foreign keys point at yours. Then a migration later is a mapping table and a weekend, instead of touching every table you own. It is maybe an hour of work now and it is the difference between a decision you can revisit and one you cannot.
Honestly just do a 7-day trial. Free tiers made sense when acquisition was cheap and they are mostly a support tax now.
If any of the plaster does need replacing later, use a lime-based plaster rather than gypsum on a solid brick wall. Gypsum traps moisture against the brick and you get a repeat performance in three years.
Name the mechanisms now and start applying early, because most of them have deadlines a year ahead of the money. In roughly the order people use them: dissertation completion fellowships internal to the university, which are usually the best deal and the most competitive; external fellowships from foundations and societies in your field, which need a year of lead time; extra teaching lines, which pay but cost you writing time at exactly the moment you have none to spare; and summer funding pots that go unclaimed every year because nobody reads the emails. The students who get through year six comfortably are usually the ones who applied for four things in year four, not the ones who worked hardest.
That distinction saves people a lot of wasted work. Abuse defence can be approximate and cheap; product rules have to be exact and cost you a round trip.
The damp patch is in the back bedroom, which is directly above the corner where the downpipe is. That is probably not a coincidence.
pushing back a little on the size does not matter consensus. it depends on the platform, because some of them fetch and unpack your artifact before anything runs, and on the first invocation in a region that download is on the critical path. i saw a clear step change dropping under a size threshold on one provider and none at all on another, so the honest answer is that you have to measure on the platform you actually use.