From this ACM paper, On the Dangers of Stochastic Parrots, the hypothesis is maybe these LLMs are parroting back what we already know and aren’t learning. We can probably, maybe, safely say that is no longer the case.
- Stochastic ParrotsPosted
- A Surprise "May" Be AfootPosted
📍 Location: San Carlos, CA
This month’s newsletter is purposefully shorter because I got married this month! I decided to take off time from work and other obligations to embrace the moment. There’s times in our lives we want to cherish the experience over spending time lost in our devices, so I dedicated two weeks to wedding preparation, having the wedding, and enjoying a much needed break on our honeymoon.

Walking away from the altar I hope you all are doing wonderful and looking forward to starting something fresh in June!
- 2024 Week 22 - Weekly NotesPosted
After a month long break, we’re back! The reason for my absence is I got married! 💒

At the altar It’s been one crazy month. Everything leading up to the wedding was a whirlwind. Everything after the wedding has been nice and calm. We spent our honeymoon in Maui, then all of last week after our return, we spent on the couch sick with COVID-19.
This week, we’re back. I’m coming back at you all with some links that I found for the entire month. After this update, I’m going to overhaul a few things about the weekly notes.
Link Roll
The goal of a book isn’t to get to the last page, it’s to expand your thinking.
— Dave RupertEveryone is waiting for that one post, that one video, that one podcast from someone that explains things is just such a way they can understand.
— Jim Nielsen- People to follow:
- Helpful Tailwind color index: Overview of Tailwind CSS Colors
- Also: Tailwind Tints: Tailwind CSS 11-color Palette Generator and API
- To make a test website? Eleventy is a simpler static site generator
- Also, I want to use a project with Fly.io - Deploy app servers close to your users · Fly
- Jon Christensen writing on Every - The Death of Code as Craft
- I’m pretty mad about this article. What I’m taking away from it is the low level details don’t matter for human comprehension. That’s really not true. Many times, assumptions are made early on that take a codebase one way, then later on, the requirements change and logic needs to be adjusted.
- I’m not sure this person has spent enough time with LLMs on how messy the code they write is. Like it’s fairly unoptimized and feels extremely hacky. Yes, the code will be better in the future, but today’s LLMs don’t have this yet. And to expect a CEO to determine how this code is run is terrible because the nuances of what needs to be comprehended is not there.
- Instead, the work of an engineer isn’t to read prompting with the LLMs output is but to decide if the code is maintainable. The idea of configuration over convention increases cognitive exercise, not decreases it. The article assumes the LLM output can read and write through the code and the engineer is lazy and doesn’t want to read through technical details. The best engineers are the ones who read through those technical details and understands those nuances.
- I agree though in that businesses don’t care about code craft. They have other priorities - and it boils down to being able to make money (in a for-profit anyway).
- Wood chips or the material cut from a book can be used as bonus material
- I just realized TikTok and short form video appeal is when you’re reading articles and books on behalf of an audience. Like duh. People don’t read and it’s easier than reading
- Serious Eats - Oklahoma-Style Onion Burgers Recipe
- X Thread - Nick Gray on going to Japan with a blind date
- Delia Cai presents Hate Read
- An absolutely hateful series of newsletters that’s actually a great read and showcases the real oddities of the Internet
- Mainstream Publications
- CNBC - AI engineers face burnout in ‘rat race’ to stay competitive hits tech 👀
- Notable NYT Articles
- BBC - North Yorkshire Council to phase out apostrophe use on street signs
- St. Mary’s Walk ➡️ St Marys Walk
- The Guardian - Man linked to viral dress pleads guilty to endangering wife’s life
- Josh Watzman on Cord - Exploring LLM Weirdness: How We Built It & What I Learned
- The Hybrid Hacker’s Nicola Ballotta - Practical Learning Strategies for Engineers
- Nabeel S. Qureshi - How To Understand Things
- Conor Barnes - 100 Tips For A Better Life
- William Brown - Passkeys: A Shattered Dream
- Dylan Huang on Konfig - I Reviewed 1,000s of Opinions on HTMX
- Tim Spann on Cloudera - Small Language Models (SML) for the Win
- Doug Turnbull - Dont have F-You money? Build an F-You Network.
- Tim Fisken - Avoiding the soft delete anti-pattern
- Deb Liu - Make the First 90 Days Count
- Hollywood Reporter - Kino Lorber New Streaming Service
- Flood Map: Elevation Map, Sea Level Rise Map
- Indian Paintbrush founder Steven Rales buys Criterion, Janus Films
Obits
- Bernard Hill, Actor in ‘Titanic’ and ‘Lord of the Rings,’ Dies at 79
- Roger Corman, Producer of Low-Budget Horror Films, Dies at 98
- Morgan Spurlock Dead: ‘Super Size Me’ Director Was 53
Highlighted Videos
One creator I didn’t know I was missing from my life was Van Neistat. His philosophy about the spirited man really speaks to me in a way I wish I found earlier. One of his videos surfaced about screws. It’s not a comprehensive look at them more than a practical one. I spent a lot of time with my dad at Home Depot, and screws have always fascinated me on our 3-hour long trips there.
Also from Colin and Samir interviewing Van. On why digital tools don’t translate for him. His brain is wired different.
- 2024 Week 18 - Weekly NotesPosted
- FTC votes to ban noncompete clauses that bar employees from working for competitors
- FDA Takes Action Aimed at Helping to Ensure the Safety and Effectiveness of Laboratory Developed Tests
- No one buys books - by Elle Griffin - The Elysian
- The New York Times - Pro-Palestinian Encampments Spread, Leading to Hundreds of Arrests
- The Register - ByteDance would rather torpedo TikTok than sell it
- Jeff Geerling - Corporate Open Source is Dead - Response to IBM buying Hashicorp
- Nicky Case - How To Remember Anything Forever-ish
- A good primer to spaced repetition
- The New York Times - Marrying the One Who Almost Got Away
- Kevin Kelly on The Technium - 101 Additional Advices
- Nick Wignall - 7 Rules for Emotional Health
- Bahaa Zidan - A brief history of web development. And why your framework doesn’t matter.
- CNBC - Venice’s new entrance fee shows world at its overtourism tipping point
- AP News - Change Healthcare cyberattack was due to a lack of multifactor authentication, UnitedHealth CEO says
- CTV News - London Drugs updates: Stores remain closed after ‘cybersecurity incident’
- Google killed Jamboard - Google shutting down Jamboard whiteboard app, hardware
- Ness Labs - The science of decision-making: why smart people do dumb things
- The Pragmatic Engineer - Is the “AI developer”a threat to jobs – or a marketing stunt?
- Irina Stanescu - 3 Critical Skills You Need to Grow Beyond Senior Levels in Engineering
Layoffs and Obits
- Hacker News - Google lays off its Python team
- The New York Times - Tesla Fires Charger Team Amid Hundreds of Layoffs
- The New York Times - Farewell, and Thanks, to a Man Who Kept Kids Safe
- The New York Times - Olga Fikotova Connolly, Olympian in a Cold War Romance, Dies at 91
- The New York Times - Norman Kansfield, 83, Dies; Defrocked for His Daughter’s Same-Sex Wedding
Highlighted Videos
-
From The Progressive: Students Have the Right to Protest Apartheid. My lovely fiancé wrote a piece about the student protests for Palestine.
While the Republican-led Congress has used its power to condemn any protests on behalf of Palestinians, where was the same outrage and zealousness when white nationalists came to college campuses?
- What Works TodayPosted
I think about the Shiny Toy Syndrome every so often. A few years ago, I was being interviewed on a live stream, and the chat kept bringing up more technology I’ve heard of but haven’t used yet. It’s one of those nagging things in the back of your mind that you must catch up with the latest and greatest. However, having worked in software for the past decade, the latest and greatest is oftentimes obfuscated with what is known to work and what doesn’t. Best practices take time to discover. Many corner cases are not covered. And sometimes the new shiny thing is hidden from your readers or customers, so you are cranking widgets over creating value.
I love playing with new toys. But there comes a point where to get anything done with that toy, you have to learn from YouTube tutorials, blog posts, and Reddit threads. After mindlessly scrolling through this, your brain is too tired to start. (I’m looking at you Anki). Sometimes, it’s best to get started with what you already know today, and later pick up the tool if it meets your criteria.
If you know how to use Postgres and SQLite, use them! Are those new databases fun to play with? Yeah, I bet they are, but you know that will be time spent on learning that new tool. I’ve been in tutorial hell since starting my programming journey, and I realize it’s better to pick up a new tool when you’ve got a project in mind. But be warned, it should be the only new variable. If you try to stack new technologies together, you’re in for one hell of a ride. Like if you want to use a new Database, caching layer, and server framework, good luck to you. I don’t have the time or patience for that. I’d rather spend my evenings working on enough knowns.
That brings me to the Should vs. Must. In Elle Luna’s book, The Crossroads of Should and Must, she describes this pull of doing what you know in your gut is right. For her, it was painting on canvases in her private studio. I rarely think my pull is to learn R for the fun of it. It’s typically with a different goal in mind, like using R for statistical methods to run on a specific dataset to help me determine statistical significance. With a more specific goal in mind, I’m able to let go of my brain’s tendency to try and understand everything before getting started. An old co-worker of mine thinks about this like inertia. You need a certain amount of activation energy to get you started. When that goal is clearer in my mind, I’m able to lower that activation energy and get the ball rolling faster.
- Don’t know enough breadth? Call an expert to get you started.
- Don’t know how all of these technologies might go together? Oh boy, there’s an exciting new thing called Large Language Models that might be able to help make you a scaffold.
And many times, the technical aspects are the easiest. The harder part is the context in which you’re creating something. And understanding the market to validate your ideas. Or interviewing your customers to understand the needs of the customer.
Stick with the boring stack. In a recent episode of the Changelog, Kelvin Omereshone (K.O.O) talked about SAILS and being a boring stack. SAILS is a full-stack framework that’s been around for over a decade. It’s reliable. It’s using technology that’s been around for a while, hence “boring”. But that’s the point of being boring. It shouldn’t be there to stop you from what you’re doing. It should liberate you to think about the next thing.
Just start. In An Invocation for Beginnings, Ze Frank talks about all the little ways we start or don’t start. Starting looks different to different people. What you should steer away from is how an idealized version of starting should look like. Embrace the mess. Start with a brainstorm, a post-it note, or a lot of Post-it notes. Fill your desk and reject the idea everything has to be perfect-looking. Life is not a super well-organized bullet journal with neatly made gridlines. It’s imperfect and full of unknowns and assumptions. Start the process before making the template. Don’t edge towards a premature optimization. Just start.
Then, once it’s up and running, we talk about what will work tomorrow.
- April 2024 UpdatesPosted
Switch Flipping
📍 Location: San Jose, CA
The weather in the Bay Area during this season is like Mother Nature flipping the switch between cold and hot. She can’t make up her mind if it’s ready for full blown summer or cold rainy days. This comes as I think if lavender bushes will bloom for my wedding next month 🤞🏼. Like most things in life, these forces are outside our control. You prepare as much as you can and let the rest play out.
As with the previous months, I come with some website updates.
Inspirations
I carved my own space of curated inspirations. A table of websites that should technically be a mood board of the vibes I think could go with CraftByZen’s website.
For the past few years, I’ve kept a note of inspirational websites. These websites include blogs that I continue to follow, creatives showing their talents, and web design that makes me wonder.
In the future, I want to expand this to other types of inspirations. It’s driven by my own curiosity attractors.
The Stream
I created a separate feed called “The Stream”. I wrote a short blog about it.
The stream is a personal feed of my thoughts on things I’m working on, interested in, or a random shower thought that might be worth putting some additional thought into. The stream is a form of expression, posting something spur of the moment, without the crowdedness of a social network like Twitter or Facebook. Don’t get me wrong, those places are great for comment and reply interactions. But I also need my own trail of what I’m writing and thinking about that’s not hammered by likes, comments, and other social features that I find distracting.
Classifieds
As part of an ongoing effort to engage my network, I want to use this opportunity for anyone to advertise on my newsletters. If you’ve got a big launch, trying to look for work, maybe find that missed connection, feel free to reach out to me.
Closing thoughts
As mentioned in the last newsletter, I’ve been practicing something along the lines of my theme, “The year of renewal”. In March, it was testing out different activities to break my dopamine addiction. A dopamine detox if you will. I realized how strong my pulls were and it will take more than a month to break those addictions, like doomscrolling and a constant feed of consumption. During April, I’m experimenting with renewed interests in language learning. I’m almost half a year with my streaks on Duolingo!
I hope you are all doing well and enjoy this lovely spring transition!
- 2024 Week 17 - Weekly NotesPosted
With the protests happening on US university and college campuses, I want to give some time and pause to reflect on what’s going on nationwide. There’s a lot of political discourse and turmoil over the past month, and I might mix some politics with the next few weekly notes.
Note: this week and next week my notes might be late due to some last minute wedding planning.
- The Guardian - How Neopets’ nostalgic revival tripled users in six months - I did wonder if my Neopets have survived since 2001. One has to wonder, and I no longer have access to those accounts.
- A Few Thoughts on Cryptographic Engineering (Matthew Green) - A quick post on Chen’s algorithm. A primer on Chen’s algorithm for quantum cryptography, although as of this writing, a bug has been discovered within it.
- A checklist to setup for larger projects by Alex Kladov - Basic Things
- Nadia Asparouhova writing in Asterisk - Manufacturing Bliss. I read her book, Working in Public. This seems to be a wildly different article about jhanas meditation and some Bay Area practitioners. Interesting read.
- Mackenzie Morehead - Is Attention All You Need?
- Ash Newman - Stop Acting Like You’re Famous - It’s a practice I think about when starting a small project
- The New York Times - How TikTok Changed America
- Dear President Biden - Great letter. Terrible ending. He didn’t listen to the TikTok ban. Welp.
- The New York Times - A High School Reunion Reignites a 50-Year Crush
- The Atlantic - Jung’s Five Pillars of a Good Life
- Sequoia Capital - The Arc Product-Market Fit Framework
- Max Hertan on X - Dave Pascoe is 61. Yet his epigenetic age is only 37. He’s aging at an annual rate of 0.66, narrowly outpacing Bryan Johnson. Here’s a breakdown of his biohacking protocol and how much it costs (it’s WAY less than you think
- Sleep - get 8 hours of sleep. No alarm. Previously using supplements: BIOOptimizers Sleep Breakthrough
- Exercise - Multiple times a day to remove cellular waste buildup and improve glucose and insulin regulation
- BEMER (bio-electric-magnetics-energy-regulation) mat session to improve blood flow
- Followed by circuit, then late morning CAROL (CARdiovascular. Optimization Logic) bike sprint, P90X, and TapoutXT for core
- Evening balance board for body balance
- Nutrition - clean foods, proteolytic enzymes for enhanced digestion and nutrient absorption
- Supplementation - the man takes over 150 supplements daily. Holy crap!
- Limited environmental exposure
- Filtered water and air
- No toxins from daily use products, cookware
- Limit exposure to exhaust, fumes, air fresheners, etc.
- Infrared Sauna - 25-45 minutes
- Cold Exposure - cold plunges and cold living spaces to reduce inflammation and improve immunity
- The New York Times - Golden Visa Programs, Once a Boon, Lose Their Luster - Spain to remove their Golden Visa program
- Chip Huyen - Measuring personal growth
- Benedict Evans - Looking for AI use-cases
- wesbos/hot-tips: The code behind my hot tips - I’m thinking of creating something similar. I started it called magic sand
- Val Town - Val Town is a social website to write and deploy TypeScript. Build APIs and schedule functions from your browser.
- The (Frontend||UI||UX) Developer/Engineer Handbook 2024
- Alex Steffen - The Snap Forward - Ruggedize Your Life.
- The New York Times - Scenes of Protests at Columbia, Yale, M.I.T. and N.Y.U.
- The Atlantic - The Campus-Left Occupation That Broke Higher Education
- The Irish Times - Gazans venting anger against Hamas in wake of death and destruction
- Americans’ New TV Habit: Subscribe. Watch. Cancel. Repeat. - For some reason, I thought I was the only diligent one. Looks like others have caught on.
- Engineer’s Codex - 4 Software Design Principles I Learned the Hard Way
- Michał Poczwardowski - On Generating Ideas
- Daniel Hooper - Good Ideas in Computer Science
- Vicki Boykis - Redis is forked
- Syntax #759 - How to Easily Explore Coding Ideas
- The Cinematrix: Vulture’s Daily Movies Grid Game
- The Guardian - McKinsey reportedly under US criminal investigation over opioid industry work
- Edward Zitron - The Man Who Killed Google Search
- Reuters - IBM to buy HashiCorp in $6.4 billion deal to expand in cloud - Welp Terraform
- NessLabs - 4 science-backed ways to build your own mental gym
There are still islands that are fake being debunked in the last decade?
- TIL importmapPosted
I forked a small demo from Wes Bos and ran in on my own sandbox. It seems much cleaner than using a script tag per each dependency, and works on all major browsers.
In my little demo app, I placed the importmap in the head of the document. I’m using react as well as my own utils file to test out the functionality.
<script type="importmap"> { "imports": { "react-dom": "https://esm.sh/react-dom", "react": "https://esm.sh/react", "utils": "./utils.js" } } </script>Read more about importmap on MDN
From there, I imported these libraries in a script module.
<body> <div id="app"></div> <script type="module"> /* eslint-disable */ import { useState } from "react"; import { createRoot } from "react-dom"; import { formatMoney } from "utils"; createRoot(document.querySelector(`#app`)).render(formatMoney(100.2365)); </script> </body>I had a hiccup with [plugin:vite
] as I found countless others have, so I wrote a custom bun server to host this project. Hopefully there’s a better setup I can find with Vite using importmap in the future. -
Luxon datetime library defaults
startOfandendOfmethods to UTC. But this isn’t great for end users who don’t live in UTC / GMT. To offset this, we need to grab the time zone offset from the user’s system.const systemTimeZoneOffsetInMinutes = new Date().getTimezoneOffset(); const systemTimeZoneOffsetInHours = systemTimeZoneOffset / 60;Then we can add the offset to the Luxon datetime object.
const now = DateTime.now(); const startOfLocalDay = now.startOf('day').plus({ hours: systemTimeZoneOffsetInHours }); const endOfLocalDay = now.endOf('day').plus({ hours: systemTimeZoneOffsetInHours }); - 2024 Week 16 - Weekly NotesPosted
I’ve become a lot more cognizant of how those first six words might be the only thing that show up in the notification panel on their phone, so I need to make sure that those words are a succinct and accurate overview in their own right.
— Eleanor Konik, Prompt Engineering Gave Me Empathy for My Bosses
This past week, I’ve been busy at work finishing up loose ends for the next major project. At home, we’re three weeks left until my wedding. We’ve got all major purchases out of the way for the event, as well as booking tickets to Maui for our honeymoon. 💒
- Jason Liu - Advice to Young People, The Lies I Tell Myself
- Eva Parish - What I think about when I edit
- CNBC - Rich Americans get second passports, citing risk of instability
- Signs things are not going well in the US.
- Also: The New York Times - Golden Visa Programs, Once a Boon, Lose Their Luster
- Spain to follow suit
The golden visa program brought Spain billions of euros in investments. But property prices paid by rich foreigners are well beyond the earning power of locals.
- Spain to follow suit
- React, Solid, htmx | bobae kang
- Sign posting: How to reduce cognitive load for your reader
- Load Balancing
- An excellent visualization of different load balancing strategies
- Hackaday - Why X86 Needs To Die
- Yorick Peterse - How to write a code formatter
- The invisible seafaring industry that keeps the internet afloat
- The visuals of the article are amazing
- Figma Blog - What We Launched at Framework 2024
- Today, I have my caps lock key remapped to escape. Hyperkey is an interesting proposition to have the cmd + option + control + shift key down at the same time to unlock more shortcut keys. I’m tempted.
- The Boring JavaScript Stack 🥱 - This week’s JS Party episode is convincing me maybe build something using the SAILS stack and bring your own database. Easy JS development
- The Numbers - Where Data and the Movie Business Meet - How did I not know this was a great resource! Holy crap!
- Steve Klabnik - How Does BlueSky Work?
- Nat Bennett - Why you need a “WTF Notebook”
- This goes beyond site incident reports. I used to do this for testing as a quick way to determine if we had any weird testing debug outputs. But of course, Sentry bugs should fall under this too. We need to write this in.
- No Mercy / No Malice - Prof K on Ketamine Therapy and Ketamine Seizures
🪦 Obit-like. Layoffs, of course
Notable Videos of the Week
He talks about the hyperkey!
- The "Boring" StackPosted
I was listening to this podcast: The boring JavaScript stack featuring Kelvin Omereshone (K.O.O) (JS Party #319). My takeaway is I should be using a boring stack to build my business ideas. Leave the shiny new toys for tinkering and use something stable.
While Kelvin talks about the benefits of using Sails, I was thinking about the other “boring” things that constitute a boring stack. It goes beyond tecnologies, like how to run a business, how to organize your team, and how to market the product. And when those things are boring, they are unsexy and oftentimes neglected.
Related: Kelsey Hightower’s nocode
The best way to write secure and reliable applications. Write nothing; deploy nowhere.
- Flag management in practicePosted
What is Feature Management?
A feature flag is a decision point in your code that can change the behavior of your application.
Temporary flags are often used to safely deploy changes to your application or to test new behaviors against old ones. After a new behavior is being used by 100% of your users, the flag is intended to be removed.
Traffic light showing a green light. Unsplash - Eliobed Suarez
Permanent flags give you a way to control the behavior of your application at any time. You might use a permanent flag to create a kill-switch or to reveal functionality only to specific users.
Traffic light showing a green light. Unsplash - Eliobed Suarez
Feature Flags Are Context Sensitive
The code path token can change based on the context provided; for example, the user’s identity, the plan they’ve paid for, or any other data.
Feature Flags Are Deployment Agnostic
Feature flags can be used to control which users can see each change. This decouples the act of deploying from the act of releasing.
Use Cases for Flags
- Release - A temporary flag that initially serves false to all targets, then progressively rolls out true to targets until it reaches 100%
- Kill Switch - A permanent safety mechanism used to shut off non-core functionality or third-party tools in an emergency
- Experiment - A flag to test a hypothesis and provide continuous optimization using beta users and A/B tests
- Migration - A temporary flag used to migrate data or systems while keeping your application available and disruption free
These are the ones advertised by LaunchDarkly. There are many more use cases, and they allow for customization.
What is LaunchDarkly?
- LaunchDarkly is a company that provides feature flags as a service.
- At work, flags are served and managed by LaunchDarkly’s services.
- LaunchDarkly is integrated through streaming via web sockets, meaning each web app user session receives messages only when necessary. Changes can be pushed out to clients in real time.
A diagram showing the end-to-end connection between LaunchDarkly’s flag delivery network and your application.
Source
How I use flags in practice
In our codebase, we have a custom React hook wrapped around the SDK that returns the flag value that we can use programmatically.
const [specificFlag] = useFeatureFlags([ { flag: "specificFlagKey", defaultValue: false, }, ]);From here, we usually add conditional logic to toggle the flag logic to the target code. We can also use the same method to do the same on the server-side as well.
Adding User Context
LaunchDarkly uses context to target which flags should be on or off. The user’s context, known in LaunchDarkly as identity, must be used when initializing the application.
Anonymous Users
On initialization, a user session will be identified as an anonymous user. This is because in the initialization, the user’s session token (access token) has not been verified yet. Because we want to use flags for public users as well, i.e. those not logged into the app, we initialize the Provider before the token check.
An anonymous user has two attributes:
- key - a unique identifier for the anonymous user and a field on the ldUser type.
- anonymous - a field on the ldUser type that notes if a user is anonymous or not. Stored as a Boolean.
Authenticated Users
Once the user authenticates, and the application has retrieved the user context, we identifies the user using the
ldClient.identifyfunction. In this identify function, we pass along the following information about our user:key: Our user’s unique identifier (as a uuid)anonymous: falseemail: the user’s email address
In addition, we pass along some custom fields that we can use to narrow down the user’s targeting. This includes their role and their organization, since our app is a multi-tenant.
If this user has already been added to LaunchDarkly, their flag profile will be returned.
If this user is new, LaunchDarkly will automatically create this user, create their flag profile, and be returned.
Logout
On logout, the application re-identifies the user using the
ldClient.identifyfunction. Since the application has a logout hook, we add a handler to identify the user to be an anonymous user again. This resets all flags to switch over for anonymous users.When do we change our flags?
- Per Release - For each release, our release team has a list of flags to modify, including toggling targeting and changing rules and segments per rules.
- On Market Support - There may be a request to make a non-release changes. These include new customer onboarding and turning on a feature for an existing customer.
Deployments
There are different types of deployments:
- Canary Releases - User groups who would like to opt in
- Ring Deployments - Different user segments at a time - e.g. beta or power users
- Percentage-based Deployments - Start with low percentage, then move to higher. For operational changes
Each of these can be implemented using feature flags.
Feature flags and blue/green deploys are complementary techniques. Although there are areas of overlap, each approach has distinct benefits, and the best strategy is to use both.
Testing
It isn’t necessary (or even possible) to test every combination of feature flags. Testing each variation of a flag in isolation (using default values for the other flags) is usually enough, unless there’s some known interaction between certain flags.
Here’s an example using jest and LaunchDarkly’s mock testing library.
import { mockFlags } from 'jest-launchdarkly-mock'; it('tests with the flag on' , () => { mockFlags({ [FLAG_IN_QUESTION]: true, }); // Write your test here }); it('tests with the flag off' , () => { mockFlags({ [FLAG_IN_QUESTION]: false, }); // Write your test here });Flag Maintenance
Cleaning up flags aggressively is the key to preventing technical debt from building up. There’s no royal road to flag cleanup, but there are some processes that make it manageable.
A stale flag is a temporary flag that is no longer in use and has not been cleaned up. Too many stale flags are a form of technical debt and an antipattern that you should avoid.
At work, we follow a practice to do it prior to any major release. This is about every 3 to 4 months.
Questions you should be able to answer now
What is feature management?
A decision point in your code that can change the behavior of your application.
What is the difference between a temporary vs. a permanent flag?
A temporary flag will ultimately be removed from the application. A permanent won’t and will stay as a kill switch.
How do flags configured in LaunchDarkly get delivered to our applications?
LaunchDarkly uses streaming via web sockets.
How can flag management be resilient to failures?
LaunchDarkly has multiple fallbacks. If their CDN goes down, it goes to their service. If their service goes down, you can route it to an external service like their relay proxy. If all of those go down, then there will be cached results from the last sucessful response. And if this is a first time request, then a fallback default value is used.
Learn More
-
I wrote a script that updates my daily notes to add properties. Since I’ve been using Obsidian for awhile, properties was introduced much later. I’ll walk through my code.
// Get the current file title, which is in a common date format: YYYY-MM-DD const currentFileTitle = tp.file.title; // Set folder you want to get latest file for here const folder = "Calendar/Personal Reviews/journal and daily review/2022"; // Get all files in that folder, including nested folders const filesInFolder = app.vault.getMarkdownFiles().filter(file => { return file.path.startsWith(folder); }); // Sort files by file name filesInFolder.sort((a, b) => a.basename < b.basename ? 1 : -1); // Get the index of the current file const currentIndex = filesInFolder.findIndex(file => file.basename === currentFileTitle); // Get basename of previous and next TFiles to be used in link let previousEntry = ''; let nextEntry = ''; // Wrap it around a try catch block in case there's something wrong with getting these basenames try { previousEntry = `[[${filesInFolder[currentIndex + 1].basename}]]` } catch (err) { console.error(err); } try { nextEntry = `[[${filesInFolder[currentIndex - 1].basename}]]` } catch (err) { console.error(err); }Here’s my template that the templater plugin uses in markdown.
<%*This is where the JS code above is inserted-%> --- tags: - logs/daily created: <% currentFileTitle %> previousEntry: - "<% previousEntry %>" nextEntry: - "<% nextEntry %>" ---I’ve had to modify this depending if the file already has properties or not.
- 2024 Week 15 - Weekly NotesPosted
I’ve been enjoying micro-blogging a lot more than I anticipated. It lowers the barrier for writing a quick post and sharing it. An essay is something that is a much heavier lift, and goes through many edits before I publish.
- Film finds:
- Eastern European Movies in English Online - I didn’t know there was a subscription service. Plus, there are separate services for Soviet and Asian movies.
- Same goes for 35mm.online
- Criterion Channel presents: Criterion24/7
- Reminding us all it can be like cable all over again :)
- Readwise got a major facelift. Loom: Using the new left panel on web
- A true WTF moment with Suno AI - Bob Ross Love Letter
- I didn’t realize where we were with AI-generated music.
- Besides the Fuzzy Search, VSCode also now has locked scrolling when you have two windows side by side
- I’ve been listening to the podcast, Shit You Don’t Learn in School. There are a lot of gems, especially around finding business ideas. I might take the patent one at some point
- Also, if anyone would like to collaborate with me for a potential business idea brainstorm, let me know
- There’s a waitlist for Ali Abdaal’s Productivity Lab. I’m debating it
- untrack.link - Privacy Link Redirect
- Pi-hole – Network-wide Ad Blocking - Someone let me know how this worked for them
- The American Prospect - Suicide Mission - What Boeing did to all the guys who remember how to build a plane
- Age Gap Relationships: The Case for Marrying an Older Man
- I’m not entirely sure how I feel about this. Comments are a brutal
- The lifecycle of a code AI completion
- I’m going to use this as a reference article for some AI apps I want to build
- High-Functioning Workaholism
- I love the design of this website. I’m going to add it for my inspiration list.
- I collect Hacker News threads, and this one I came across really irked me, but something I can relate to.
- The New York Times - How Tech Giants Cut Corners to Harvest Data for A.I.
- And its follow-up: Four Takeaways on the Race to Amass Data for A.I.
- The Library of Consciousness
- Releasing Common Corpus: the largest public domain dataset for training LLMs
- Managing Up: How to Meet The Unspoken Needs of Your Manager - Irina’s Version
- Ben Morris - How to make architecture decisions
- Duolingo - What Is the Right Level of Difficulty in the Language You’re Learning?
- I’m tempted to try it.
- Addy Osmani - The Debugger’s Toolkit
- Alexey Guzey - lifehacks
- Commoncog - The Tacit Knowledge Series
- About the Component Gallery
- Stephen Hay - I don’t care what Airbnb is doing. (And neither should you.)
- Martin Heinz - Shell History Is Your Best Productivity Tool
- The Rise and Impending Fall of the Dental Cavity
- I gotta give these extremely niche articles
- Podcast: Solicited Advice with Alison Roman
- Pew Research Center - Americans increasingly using ChatGPT, but few trust its 2024 election information
- NPR - Consumer Reports asks USDA to pull Lunchables from school lunch menus
- Decoding Auto-GPT - Maarten Grootendorst
- The UX of UUIDs | Unkey
Weekly Obits 🪦
Videos
- I’m really tempted to write a short history of middle class travel and travelogues.
- Film finds:

