Ranked according to the following algorithm:Score = log10(U) + (S / D * 8600), U is Upvotes , S/D is time.
The RSS's url is : https://bearblog.dev/discover/feed/?type=rss
2024-10-27 23:39:00
what a month.
cohost went read-only on the first. i went to a user meetup / wake in northampton the following weekend. i continued my job hunt (successful, btw). i tried (and largely failed) to rest. i learned that i am extremely bad at being unemployed.
everyone i talked to told me that it's pretty normal to not do anything in that window, that it's normal and reasonable to need a break. unfortunately, it did not feel like i was resting, it just felt like i couldn't do anything (distinct! not fun!).
anyway. tomorrow i start a new job, which will give me some structure in my day again. i get novelty—meeting new people, working on new things, experiencing and solving new problems. i'm looking forward to it.
weird, rough month. i am tired. someday i will be able to rest, but it is not right now.
i want to actually keep up with this blog more. i hadn't really realized it had been nearly a month since my last post. time flies. when i have things to write about, i'll do it here. that's about all i can promise.
ok that's it bye
2024-10-25 21:58:00
It's a strange feeling, missing something you've never been a part of or even saw. And yet, that is what the end of "cohost" makes me feel.
There has been an influx of Bear Blog users that are from cohost. Who transferred over their blog from there, and so on, and lots of them have that little stamp saying, I was on cohost. It's sad because reading them it feels like a bygone era. Something is over now and I'll never get to see it but it sounded amazing and people have such fondness for what it was. It's heartbreaking almost.
And the most beautiful aspect of it to me is that no one seems bitter. Everyone that I've read talking about cohost expressed the same feeling of, I'm glad it was a thing, I'm glad it happened. It feels like something that had space to grow and that ended relatively smoothly. It didn't crash and burn, it didn't sour toward the end. It didn't leave a bad taste in people's mouth. At the end of the day, it will only be good memories. How rare and precious is that on the internet?
It reminds of me of a small period during which, YouTube would often, out of the blue, recommend me a video from someone that I've had never heard off as they were quitting. You'd go in there and hear their stories, see the people in the comments who's been there since the beginning. Serving as a touching reminder that there are small communities out there, outside of the massive YouTubers and that sometimes, things end because it's time to move on, that it doesn't always have to crash and burn. A YouTuber is ending their career on YouTube because they felt like it was to move on and not as a reaction to a massive scandal they're ultimately responsible for is sadly refreshing.
Good things go. But it doesn't always have to smell like cinder. It can leave you smiling, it can just be good memories. It's so rare on the internet to see something like that happen. Cohost didn't die from an illness. It wasn't murdered. It just did the best it could with what it had and now it's resting.
Compared to so many websites, it won't be remembered as a shadow of its former self. It happened too many times. You spend time on a website and it grows and grows until eventually it becomes this thing that it wasn't. It starts to suffer from enshtification. It gets worse and worse and by the end of it, when it finally dies, you're almost relieved that it's over. All of the fondness of what things used to be tainted by the rottenness of what became.
I'm sure that just by reading this, you've had at least something that was once meaningful to you come up in your head. For lots of people, I think places like Reddit would come to mind (even if there, oh boy, is there lots of awful shit to say about old Reddit). I think places like Tumblr would come up to. Mastodon, to some extent, I guess. Some people do miss Twitter and while I don't understand them at all, I do feel for them.
For me, it's a nebulous mixture of a lot of things that I used to care about and that now are just distant memories that I can barely remember the address to. It's the places in which I invested myself and then eventually backed out, out of fear of it happening again, like some fediverse spaces in which I was really active. It's this blog, which I'm making as a solution.
All though cohost had, from what I understand and what I saw, a static UI, it allowed for so many other ways of self-expression. The posts were full Markdown editor with full CSS compatibility too, which allowed users to do things that were really cool! I found an archive of that, there are lots of really cool things on it. In general, cohost looked like – and I'm sorry if that's offensive to someone because I know it has a big community – Tumblr, but much more self-expressive and also, not shit.
It was built by people who were looking for something that just wasn't there on the internet and they made it for other people like them. It knew what it wanted to be and from what I can see, it went its whole short life being that, never bowing to the temptation of mass appeal. Places like cohost highlights why I never was able to build a nest anywhere, why I can't trust Bluesky, why I can't find my place on Mastodon and why this place, plume.pink, now exists.
plume.pink is my blog, it's my website, and I care a lot about it. It is my baby, it's something I've always wanted to have and that now I finally do and I'm really proud of it. I finally have a space on the internet that is fully me, that is what I've always wanted it to be and that looks like what I envisioned in my head for the first time ever. I have control over it, so I know that I will never turn into something that I don't want it to, because I can control that. That's the reason why it exists.
Seeing people turn to such a small space as Bear Blog after the death of co-host and transferring what they had from cohost over here to start their own blog is reassuring to me because, yeah, I'll be able to do that as well. If Bear Blog ever goes to shit (Herman, please), if things happen, if I just want to leave Bear Blog for one reason or another, I can just take everything I did with me. These are simple markdown files and a simple CSS. It's not complex. And it's mine. Tomorrow I can just simply take that and make it a static site that I would self-host or whatever.
Seeing the people from cohost talking about it makes me sad because it makes me realize that, oh, that place I've always wanted to have, that spot on the internet that I've been looking for desperately for years before giving up and doing this, it existed. And now it's gone. Maybe if I had found it, this place here wouldn't be a thing. Because I did try Tumblr years ago but just didn't like it for various reasons, and what cohost described itself as being really appeals to the part of me that was seeking this.
However, even in all of this, even in all of this good, there is still something bitter about co-host. And that's the reason why it's shutting down. Which is mostly a lack of funding. The truth is that hosting a platform is expensive. Especially when you stick with the principle of having no ads, no tracking, and none of the bullshit that makes everything the people who were on cohost hate about the internet.
It's really hard to ask for people to donate because sadly the world we live in is one in which people to struggle to survive even in the richest countries on earth. Where a few bucks a month can be life changing money. And there are right ways to do ask for donation and wrong ways to do it (looking at you Wikipedia, I made the mistake of donating and you've been harassing me over emails and going on your website annoys the hell out of me at the moment due to how egregious you are about it). But at the end of the day, I'd ask everybody that can do it to please spare a few bucks for projects that are important for you.
But it's also a reminder that centralized platforms, even those with the best of intentions such as cohost, are a financial pit. The people behind it all had jobs outside of that, it was very much a passion project and due to the nature of it, while it did burn bright, it mostly burned fast. Financially, but also, for the developers who were burnt out on the project by the end of it. In this heartfelt last post from jae kaplan, one of the founders, they express their "hope to never be involved in running a social media platform again."
It feels like it was made by a bunch of people who just wanted to make something they truly believed in, because it was, but ended biting up more they can chew in their passion for it. There is an authenticity to its end, to its mistakes and to its "failure" that has become shockingly rare on the internet.
In their farewell to cohost, Jae writes "go do better than we did". That's very touching, to me.
When I see the blogs of people talking about cohosts, when I see Bear Blog, when I see my own blog, when I see my friend's blogs and when I see the newly opened blogs by people who come from cohost, when I see my partner trying to make her own, inspired by what she's seeing, it's heartwarming. It's what I want the internet to be.
I never want this to stop and I'll never get tired of clicking on a link and ending up on this fully custom page that is sometimes just some basic CSS with some color changes but that expresses and oozes personality from the person behind it. It's beautiful, it's so human. When the massive internet, the corpo internet that exists currently will inevitably crumble, amidst all the dust and ashes from it, these little blogs, these little personal websites will remain.
Everything that was once new gets to be new again. Everything can get a return. Let's make it happen. Please, if you are on cohost, if you have a small blog, a small personal website, please I'm asking you, don't stop. Don't give up on that internet dream. I'm right here. You're not shouting into the void. I'm reading what you're writing. I'm seeing what you're posting. I love it and I know I'm not alone. Don't ever stop. Don't bow down to these massive platforms who will never care about their users. Continue doing what you do. It's beautiful. It's artistic. It's amazing. I love seeing you out there and I want to see more of you.
So thanks to cohost and all of the people behind it. All of the people that made it what it was, that helped run it, but also all of its community. I've never been on it. Somehow, in my search for what seems to be exactly what cohost was, I missed it. I never landed on it. And despite all of this, I'll still have fond memories of it, through the memories of those who were there.
2024-10-26 01:53
2024-10-25 15:58
2024-10-25 20:32:00
What's the most effective way for one to become better? It’s a question that’s been on my mind for years, maybe even decades. With all the books, articles, and advice on personal growth that I’ve sifted through, it seems like there are endless ways to approach it, each promising the one and only answer you'll ever need.
But over time, I’ve noticed one thing that feels like a thread running through it all: the impact certain ideas have on me and, more importantly, my reactions to them.
I’ve come to believe that paying attention to these reactions might be the clearest guide to finding a growth path that feels genuinely “me.” When something strikes a nerve, when a passage or concept sticks with me long after reading it, it feels like a signal—an opportunity to dig deeper and uncover why it stirs something within me. In a sense, noticing these reactions helps me to understand what resonates most deeply and what might be worth pursuing further.
This is where Carl Jung’s ideas about the shadow self come in. Jung famously described our shadows as the parts of ourselves we tend to ignore or even outright reject. They are the traits, impulses, and feelings that we might not want to admit to, the parts that we feel uneasy about and often pretend don’t exist.
Yet Jung’s insight was that these shadows aren’t just random outliers or inconveniences to hide away; they’re actually essential. They hold a mirror to the things we need to address, and if we’re willing to face them, they offer valuable insights into who we really are.
When these shadows come up, they’re often uncomfortable—making us feel things that clash with how we see ourselves or with the values we think we hold dear.
But I’ve found that instead of being alarmed by these unsettling reactions, there’s power in acknowledging them, even welcoming them. By leaning in, I start to see that these shadows aren’t enemies. Instead, they’re part of a whole picture that reveals strengths, needs, and even gifts that I hadn’t fully seen before.
I’m slowly learning to view these triggered responses as my unconscious reaching out, trying to communicate. Rather than seeing the shadow as something to wrestle with or repress, I’m trying to treat it as an invitation to explore a part of me that’s been overlooked, perhaps with hidden potential I hadn’t previously considered.
It’s not always easy, and it takes work to hold space for things that feel contradictory or even a little unsettling. But every time I take a step back and pay attention to these reactions, I feel a little closer to what Carl Jung described as individuation—an integration of all the parts of oneself.
So, this journey of self-understanding continues, but with a more open mind to the unexpected and an appreciation for the complexities within. In the end, it’s less about finding a single “correct” path to personal growth and more about responding to my own reactions, allowing them to guide me toward a fuller, more genuine understanding of myself.
2024-10-27 22:10:00
So, I finally did it. I talked about it already in this post about my hair troubles and finally went through with it and cut all my hair off.
I did it because my illness/medication related hair loss just didn't stop for months now and I didn't like any of it. The hair on all my clothes, on the floor, in the bed, the shower and sink drains. I never had especially voluminous hair; I was on the lower average of the amount, and it was fine hair. But with now less than half left and no signs of slowing down, it was shitty to style, was constantly stringy even when it wasn't greasy, and had no volume at all. The edges of where my face met my hair were really thinning as well; thankfully no bald spots. I like having very long hair, but not when it is so little.
I also thought about the regrowth (which you can see, but it is small baby hair still, obviously) and how ridiculous that would be in the long run. I think you can wait out a little hair loss just fine, I did sometimes due to stress or illness before; but how was this gonna look like a year later, almost 3/4 of my hair growing out new on top and the 1/4 is almost down to my butt? No. And you can only wear headbands or beanies so much. I don't wanna be a less severe, feminine equivalent of the balding guy who is desperately combing over 3 hairs over his giant bald spot.
With no idea how bad it will still gonna get, I wanted to get ahead of it and stop it before it gets weird. And it was on my bucket list to do at least once in my life, anyway. I did it for useful reasons only, not thinking it would suit me… expected it to look shitty, but I actually like it!! Very unexpected because I love being very feminine with long hair.
I also see it as a sort of.. clean slate, new beginning, starting to feel better because my meds seem to be working. Also a way to make myself place less importance on having to fulfill certain beauty standards to be loved. Yes, there is pretty privilege and there are advantages if you follow gender roles and the "correct" gender presentation. I get rewarded for being very feminine, attractive, with long hair. I can't deny that or change that; but I sometimes feel so obligated to make sure I look good to be lovable, and it's unhealthy. I need to learn I am lovable and the people in my life won't turn away from me over something like this. It's not a natural law that women need to have long hair, we just decided that. I'm a lesbian anyway, and had an undercut 10 years prior.
A podcast I like, soju with sarah, talked about feeling overwhelmed in your 20s. One part of it was about being scared to let go of things - of feelings, places, jobs, people, possessions, styles, obligations, plans, dreams, goals, etc. but that we should, because we need to prioritize and we also need to create space for good things to come along. And I think the same applies here. Yes it's scary to let go of hair, especially such a length; it will surely take me at least 5 years. But it regrows. After a year, it should already be at an acceptable length again, and what are one or two years in a lifetime? With my thinning hair, I looked in the mirror and always felt negative about it, and wore it up so much to not be reminded and not shed hair everywhere all the time. I can't change the loss, I can just let go of it completely, of the negativity around it, the expectations of others, of gendered expectations especially. I don't need permission, I don't need to impress anyone, I don't need anyone's favours... and then there is space for even regrowth of beautiful, healthy hair.
Song: False Perspectives by Dounia
Published {{ post_published_date }}, edited {{ post_last_modified }} ago
2024-10-28 12:29:00
I used to struggle with explaining why some of my friends or family members didn’t quite fit into any of the 16 MBTI personality types. A friend of mine seemed like an INFP but had traits of an ISTJ, and my cousin felt like an ESFP, yet was as considerate as an ESFJ.
Then I stumbled upon Personality Ninja (or "NXT"), which uses 32 types instead of just 16. Suddenly, things started to make sense.
At first, I thought, “What? There are only 16 types!” But after trying it out with friends, I realized their new descriptions actually felt accurate. This system offered flexibility and depth the original 16 types didn’t seem to capture.
Curious, I dove deeper into whether 32 types could really work—and found out there’s no reason they can’t! If you look back at Carl Jung, who created the concept of cognitive functions, he didn’t enforce the rigid stacks we see in MBTI or the Harold Grant function model.
Personality Ninja’s approach allows both the first and second functions to be in the same attitude (both extraverted or both introverted), unlike MBTI’s requirement for them to be opposites.
This flexibility means types don’t have to follow TeSi or SiTe formats—they can be TeSe or SiTi. It was the answer I’d been looking for: my friend turned out to be FiSi, while my cousin was FeSe.
So if you’ve ever felt stuck trying to fit yourself or others into the 16 types, it might be worth exploring the 32-type approach!
2024-10-24 19:17:00
When I was eighteen, I worked weekends at a local hospital doing registration for the emergency department. I spent my weekdays attending community college and my free time dreaming about making movies. Then one day that all came crashing down.
I got an unexpected call at work from my father. He told me not to come home. All I had was the scrubs I was wearing, my cell phone, and a few hundred dollars in the bank.
I didn't do anything wrong. I wasn't a troublemaker. I didn't drink or do drugs. I never caused any issues. I was a straight A student who graduated from high school early. So, to say this was unexpected would be an understatement.
To this day, I don't know the exact reasoning for this phone call. My father was abusing alcohol and prescription drugs and my stepmother was bitter that her children (who did not live with us) had wrecked their lives with drugs and teenage pregnancy. But something happened and out of nowhere, I found myself homeless.
That day really screwed me up. All the safety and security I grew up with was taken away in an instant. I believe this was the day that I entered what they like to call "survivor mode." The anxiety I carry around jobs and housing is intense. I'm always waiting for something bad to happen and for years, I've kept the amount of items I own to a bare minimum just in case I need to move somewhere fast.
I've worked on this in a variety of ways, but I would say my progress has not been what I'd like. I don't feel like I have a safety net nor a place to go if things get bad or go wrong, and that's just a horrible feeling to live with each day. So, I'm slow to make changes because why would I want to rock the boat and possibly find myself scrambling?
Where this has hurt me the most is in my career. I've stayed in jobs far too long when they no longer offered any value to me. I was pretty much paralyzed to move. I'd find myself in a bad situation, and I'd just find a way to tolerate it because I didn't want to add any uncertainty to my life. I allowed myself to be taken advantage of and mistreated more than I ever should have. I would only make a change when things became so unbearably bad that I had no other option. The option for change and the risk of chaos was more tolerable than the abuse or disrespect I was enduring at my job.
When I left my most job in August, I knew I was swapping a career path position for a regular job. I was going to leave government work for healthcare and hopefully have some time to heal from the burnout. That is not what has happened.
On Mastodon, Lou mentioned he hoped I would do well working with the public in my new job and I was pretty confident that would not be an issue for me. In my previous position, I was handling a high volume of calls, chats, and walk-ins from the public, almost always when they were upset. I knew that had worn on me some, but I think I underestimated exactly how much. In my new role, I definitely encounter less angry people, but I have no tolerance for the rude or angry ones. My burnout has definitely extended in dealing with the public.
I immediately went to work convincing myself that I'll be okay. I just need to stick with this job for a few months, and it all will work itself out. My wife, having seen me deal with what I deal with at my last job, was quick to point out that this doesn't sound like a good fit for me and she has encouraged me to step away and find something else. At first, I repelled at such a thought (you know, survivor mode) but it planted a seed within me.
As discussed the other day, I have a choice. I can leave this job. I can try something else. I can take a few weeks to get myself organized. I don't have to be miserable. Sure, if I'm out of work it's going to put a major stress on our finances, but maybe that's the consequence I have to pay to feel better mentally and find something that is better suited for myself.
I don't normally take risks like that, but I'm also getting older. I mean, I'm about to turn forty-one. Life is passing me by, and I can't waste any more years in miserable situations. As my wife put it, we don't have any kids and can't afford them or a house, so we really shouldn't have to make ourselves miserable trying to have a certain lifestyle. I think that's a good point.
I went to an interview at Best Buy in my early twenties. The interviewer asked me why I sell myself short. I think I've always done that. It's just feels safe. Well... I think it's time to change that.
2024-10-29 02:09:00
Rock bottom is very often where we begin our healing journey. This is not because we suddenly see the light, nor because our worst days are magically transmuted into some type of epiphany, and not because someone saves us from our own madness. Rock bottom becomes a turning point because it is only at that point that most people think: I never want to feel this way again.
That thought is not just an idea. It is a declaration and a resolution. It is one of the most life-changing things you can ever experience. It becomes the foundation upon which you build everything else. When you decide you truly do not ever want to feel a certain way again, you set out on a journey of self-awareness, learning, and growth that leads you to radically reinvent who you are.
In that moment, fault becomes irrelevant. You're no longer mulling over who did what or how you've been wronged. In that moment, only one thing guides you, and it is this: No matter what it takes, I will never accept my life getting to this point again.
Rock bottom isn't a bad day. It doesn't happen by chance. We only arrive at rock bottom when our habits begin to compound upon one another, when our coping mechanisms have spiraled so out of control that we can no longer resist the feelings we were attempting to hide.
Today, I came across these words from The Mountain is You after what I can only describe as hitting my rock bottom yesterday. It wasn’t just one incident that brought me here. It's been a buildup of medical, physical, and emotional challenges stacking on top of one another, and until yesterday, pretending seemed to be working just fine.
Yesterday, as I pushed myself at the gym with weights I hadn’t trained with before, I felt an overwhelming wave of exhaustion—more than just physical strain. It was as if every frustration and hurt I’d been carrying suddenly surfaced. I remember thinking, I never want to feel this level of hurt again.
Today, I decided to skip college, picked up this book, and honestly, it feels like fate. The words leapt off the page as if they were written for me, each one unravelling the layers of denial and avoidance I’d wrapped myself in. It’s not that this book magically solved my problems, but it made me realize that maybe, just maybe, hitting rock bottom isn’t about the fall—it’s about choosing to rebuild.
Reading these pages feels like someone is guiding me to look within, to see that healing is a process. It’s uncomfortable, but it’s mine to own. Today, I’m starting to believe that maybe I can truly rebuild—not just around the pain but beyond it.
Today, I’m committing to step back from social media so I can focus on some serious inner work that I’ve been avoiding. I want to quiet the noise and give myself the space to really face my fears, build resilience, and rethink how I show up every day. This isn’t just about taking a break; it’s about giving myself the time to grow in a way that actually prepares me for the “climb”. To those who’ve always been there for me, thank you. I’m grateful for each of you, and I’ll be back soon with a clearer mind and a stronger sense of self. Until then, take care, and know I’m just a message away if you need me.
2024-10-24 16:45:00
My blogging conundrum is as follows:
I want to blog.
But I don't want to pay.
I want to blog.
But I don't want people to read what I write.
I want to blog.
But I want people to read and engage with what I write.
I want to blog.
But I want my blog to have a comments facility.
I want to blog.
But I want my blog to be just my posts, with no input from anyone else.
I want to blog, but in secret.
I want to blog, but I want everyone to know about my blog.
2024-10-28 09:23:00
Today was a good day. Even though I had trouble enjoying it and probably will for a while, I want to write about it so I can remember it as such. The sky is still blue and life beautiful!
I woke up at 7 and had my first morning workout in a long time, just to keep my mind off things. I'm hoping I can get into a routine with exercise again — I've spent most of the the past few weeks in bed (injuries, mood, medical reasons) and my muscles have gotten noticeably weaker. I missed it. Exercise has always been therapeutic for me; I like being able to focus on something external and feeling a pain that you know will fade.
chuta, the fall colors are so stubbornly beautiful here
I met J and E for a walk around Central Park and lunch at Sala Thai. I don't often eat Thai food because my opinion of it has been skewed by so many bad experiences (why are there so many mediocre Thai places in particular in small hodunk towns?) but the food didn't disappoint and we left with our bellies full. It was nice to have a square meal, since I don't do a good job of taking care of myself when I'm sad and the scale reflects that. Starving myself when stressed/sad might be a habit that rubbed off on me from C.
We followed E to TJ's after while she got some vittles for a party and then J wanted to visit Zabar's, which was really fun! There's so much stuff there: jams and preserves of all kinds, coffee, foie gras, more cheeses than I've ever seen under one roof ... it's a great place to discover something new or get a fancy gift.
I called F after getting home, who reached out to check on me this week out of concern. Because she’s known me longer than anyone else and has the emotional vocabulary and toolbox to do so, she often tells me things that my other friends can’t say and that I can’t see. Today that took the form of: okay, well why are you like this? You realize that you don’t have to be like this, right? And I need that! She also never fails to tell me she loves me before we hang up and I- hearing it makes my heart swell. I love her dearly too and hope we get to meet up soon. (Fingers crossed for November!)
Perhaps because he sensed that I was going to skip dinner, J made two portions of what he was cooking and served me a dinner of steamed salmon, kimchi scrambled eggs, sauteed bok choy and bell peppers. He even washed the dishes! I'm still touched by the gesture, and I admire how much he shows up for me and his other friends in times of need. I can only hope my friends feel that way about me.
To cap it all off I got this heartwarming text from M this morning, who I haven't seen on the field in a while.
I miss him too. I think I'll go into the office tomorrow even though I don't have to, just to keep myself occupied.
2024-10-23 03:07:00
A couple of things all coalescing into the same general window of time has got me to think, not with any meaningful conclusion or anything, about what happens when communal spaces close for good.
The Vancouver International Film Festival took place recently and it happened to overlap with the closure of social media site Cohost.org. Everyone got a little over a month of heads up to give time to say goodbyes and let everyone know where they were heading to next but for the most part we got a month’s worth of mourning, posting through it, remembering the good times, and sharing stories of personal growth as it related to the site’s culture. It was where I made my home for the past two years and accepting that things were going to end was difficult, so having multiple movies a day for several days in a row was a welcome distraction. I try not to be the type who ascribes every bit of my self into the things I watch or play but some stuff hit serendipitously close to home and it helped me work through the grief of losing something so important to me.
Grand Theft Hamlet (2024)
One of the movies I saw, a documentary called Grand Theft Hamlet, is a chronicling of two actors’ journey to perform all of Shakespeare’s Hamlet in GTA Online during lockdown. The whole thing is filmed in-game mostly using the first-person camera and it’s an incredibly fun film of these two guys assembling a crew of performers for an admittedly complicated and daunting effort. They power through because it’s 2021, a second lockdown is in effect, and as stage actors they’re currently out of work. A bit into the movie they make a recruitment video for auditions in-game, post it to social media, and hold the auditions in an amphitheater for a mix of actor friends they know, random moms borrowing their nephew’s PlayStation, and in-game passerbys wondering why so many people are congregating in a single part of the map. They held rehearsals a lot but it was easy for everyone to instead vibe and enjoy each other’s company, something the documentary touches on a lot as everyone involved is stuck inside trying to stay social.
On Cohost, finding people or community was hard. Intentionally so for a handful of smart reasons but that doesn’t make it any less difficult to adjust to. A lot of people didn’t adjust to it at all and left. A lot of folks hear “algorithm” in social media parlance and think of it as “feed where you do not see posts reverse chronologically” but it’s a lot of stuff. “Who to Follow” is algorithm. “Suggested posts” is algorithm. “You Might Like”, “Recommended Follows”, etc. It’s all the respective platform looking at your data and trying to point you in directions because it doesn’t want you to struggle with anything. If you put zero effort in and immediately fill your feed with accounts, posts, and followers then the place seems lively and you’re encouraged to come back. But you’re not, like, really connected with any of those people, right? You might know some of them but you might not others. You didn’t “find” them. You were pointed to them. To find it, you have to look for it, and to look for it, you have to care, and if you care, then you’re not coming back because it’s busy, you’re coming back because you’ve created a connection.
My last film at VIFF was Eephus, a sports comedy about an amateur baseball league in a small New Hampshire town playing the league’s last game before the local field is demolished to build a school. The players are old, they’ve all got jobs, some have families. It doesn’t really matter, to them or to the film, because they’re all there to play baseball. It’s what they love. A bit into the movie, a townie shows up to the field and tells the guys in the dugout about how he used to play on the field all the time. He loved to pitch. Throws a mean Eephus pitch. The actor is actually a cameo by Red Sox player Bill “Spaceman” Lee, known for being one of the best Eephus pitchers ever. He shows up, throws a beast of an eephus pitch, has a laugh with the boys, and leaves.
Grand Theft Hamlet (2024)
A bit into the auditions for the play in Grand Theft Hamlet, a guy dressed as an alien in a chromed out Lamborghini shows up wondering why the hell everyone is gathered at the amphitheater. He’s not a native English speaker and mostly blurts out a random set of noises as the gang lose their minds over his whole, yknow, vibe. They ask if he wants to audition and he has no idea what they’re on about but he plays along for a while. He says he has ADHD and can’t pay attention long enough to act in a play but he’ll hang out and watch. The guy’s called ParTeb and he ends up sticking around for the entirety of the documentary just as a guy in the background who hangs out and occasionally shoots people. He’s a riot. He’s a textbook “life of the party” kinda guy. They gather for rehearsal and they don’t wonder about actors running late, they go “Where’s ParTeb?” Of course, when ParTeb shows up, it’s in a Harrier jet hovering above rehearsal. “He always makes an entrance doesn’t he?” When they successfully stage the play to a streaming audience, it’s all over. ParTeb logs off, the actors log off, and their story ends there.
A thing I really miss about my younger years is the freedom to just willingly throw myself into situations I have no meaningful experience in. Stuff like anime conventions, cross-country trips, long-distance dating… they’re all things now that I sorta don’t have the time or energy to do. Conventions are for work, cross-country trips are to see family, long-distance dating is really difficult when you have a lot of responsibilities. I also experience them now with a really cemented group of folks. Cons and trade shows are for seeing familiar faces, catching up, getting dinner and stuff. I’m not really going to an anime convention in Illinois on my own anymore wondering if someone I talked to on deviantART for a year will also show up.
Around the time I graduated high school, I was dating someone who lived in rural Iowa and I would spend my summers there by taking the bus from Montreal to Davenport, a trip that at the time was about 26 hours. They often were a slog but one year we stop in Kingston, Ontario, and pick up this guy who’s like a full foot-and-a-half taller than me, emo to the core, and sat right next to my seat at the back. We hit it off instantly. He was on his way to Chicago to also hang out with his online girlfriend. Chicago is the last major stop before Davenport so we ride the whole thing out together. We talk about life, family, dating online, the communities we spend time in, our hobbies, our taste in music. We stop in Buffalo, NY, and pick up a guy who sits in front of us and tells us that we need to be careful visiting in US. He takes his baseball cap off and shows us this insanely huge scar on his head. The guy got carjacked the year prior and was pistol whipped in the head. He bled out for so long that he came about as close to dying as you can before a pedestrian saw him and called an ambulance. He’s on the bus headed to Vegas saying he’s gonna live out the rest of his life like every moment could be his last. A couple hours later, we’re stopped somewhere around Toledo. It’s like 1AM and I have no money on me but I’m starving because I haven’t eaten the whole day. Vegas guy is outside chain smoking and sees the pain I’m in, I tell him I really need a bite to eat, and he goes inside the rest stop to get me a vending machine burger that sucked but tasted sweeter than anything else could have at the time. We get to Chicago in the early hours of the morning and I say goodbye to emo kid, a few hours later we get to Davenport and I say goodbye to Vegas guy. I never see or talk to any of them ever again.
The random encounter, in online games especially, is such a powerful, ethereal kinda thing. Some connections were never made to last but sometimes that can be the case in the brightest, most memorable ways.
Eephus (2024)
There’s a scene in Eephus where a promising kid is explaining to a benchwarmer what the Eephus pitch actually is and he describes the effect it has on the hitter. It’s this slow upwards-arcing pitch that perspectively looks so confusing that it mangles your sense of time. It’s thrown slow but it looks like it hangs in the air forever. And then it’s just gone. Strike. You missed it. The movie itself is broadly about this. This sense of space and time that seems never ending and then it’s just… over. You don’t see the end happen. You’re there, and then you aren’t. My time on Cohost felt a lot like that, in a way. Two years really flew by and even though we all knew the end was near, I think I just woke up one morning and it was just… over.
When the site closed, everyone kinda scattered. Some set up their own blogs and sites, some went to Bluesky, some are just gone forever. Everyone carried a handful of folks they met on the site forward with them through various means. Some of those connections might last a bit, some might well last forever, and some are already lost in the wind.
Eephus (2024)
There’s a recurring conversation between players in Eephus where they ask each other if they’re gonna join the league that’s a couple towns away. One of em’s thinking about it. A couple of em’ laugh the question off. The place stinks, literally. The sewer’s backed up in the left field. One of them groans at the thought because it’s a half-hour drive away. “You joining the league over there,” asks one. “I don’t know but I ain’t driving two towns over” replies the other.
That sentence has been stuck in my head since. The collective “posting through it” everyone on Cohost went through was such a surreal thing. Nobody wanted to leave, we all knew we had to, and there were no good options. Everyone figured out what was best for them in the end but there’s still a void there, I think. When you’re in it for so long and it’s just gone, what do you do? Where do you go?
I don’t know. But I ain’t driving two towns over.
2024-10-29 19:30:00
A long time ago, a friend of mine told me that in life, you find what you look for. I believe that to be true most of the time. I'm always on the lookout for nice people. Thinking about them is a tool I use in my personal gratitude practice, a daily exercise where I record three things I'm grateful for. I have been doing it for years. There's never been a time in my life when I couldn't find some folks with kindness in their heart. Even during the years when I worked as a prison guard, there were inmates who did kind things in a non-manipulative way. I used to drink coffee continually on that job. You could buy a packet of Taster's Choice in the canteen for a dime in those days. An old con who cleaned the area around my desk gave me some sage advice one day. "Mr Plummer," he said, "Don't ever put that coffee cup down and turn your back on it. These boys will spit in it if you do." It's been almost 40 years since he told me that and I still remember him for saving me from that indignity.
During the years I worked as an IT tech in the school system, I would always be showered with gifts at Christmas. Teachers would bring me baked goods, iTunes gift cards, coupon books, CDs and more. With all that teaching involves, remembering the guy who comes around once in a while to look at your laptop takes some real effort. When I took a mid-career break to get married and go hiking for six months, many of those teachers send care packages to my wife and I with edible treats, socks, bug spray and other things from our wish list.
People with demanding, public facing jobs who maintain their cool and make others feel welcome have a special gift. The wait staff at my favorite diner, even when they are slammed, still acknowledge their regulars. They are still nice and patient with kids. They take a minute to crack jokes and to make fun of me for always ordering the same thing.
So many of the tools I've learned to love on my computer are apps that some developer has made and given away for free. Everything I know about creating a blog is a result of freely distributed guides and tutorials. The number of letters I've gotten from complete strangers on the Internet to thank me for something or to encourage me or to praise me is just astounding. People will go out of their way just to make someone else feel good and I think that is awesome. Yes, I have also experienced some meanness online but it's overshadowed by kindness.
I think often about some of the giants I have know who dedicated their lives to the social justice movement. I know men and women who worked in the deep south during the Civil Rights era at great danger to themselves. I know organizers who survived the 1979 Greensboro Massacre who are still committed to the cause of helping poor people. I know union workers who've left home to travel to other areas to help organize workers so that they might enjoy the same benefits. I know soldiers who, sickened by war, laid down their rifles to speak out to try and stop the senseless killing that our government asked them to do in the nebulous name of freedom.
Look for kind people today. Better yet, be kind. Get your name added to someone's gratitude list.
Enjoyed it? Please upvote 👇
2024-10-26 07:04:03
as i've posted about before, i've been taking time off from creating art to recover from some Life Problems™️. so while i've got a lot of downtime - i spent like, a solid week and a half unable to leave my bed for very long - i thought i'd pass the time by studying art.
recently, i had hit a wall with art... the last "polished" drawings i had worked on were all the way back in August. and Life Problems™️ kicking my ass certainly didn't help. when this happens, i try to shift my focus to something else. which i did! i went into an absolute frenzy trying to get a site put together, set up this blog, etc etc.
... and then after burning out from all of that, my body begged for rest and i begrudgingly complied, not having a choice in the matter. i was eager to start studying, though... hitting that wall really bugged me.
with the help of a friend, who bravely & nobly put together a big collection of artbooks for me to peruse, i'm now free to study to my heart's desire...! they're mostly anime artbooks, ranging from the 80s to the early 00s. lots of cool fantasy illustrations. despite growing up with an older sibling who's always loved anime, it's a massive blind spot for me... so it's been pretty fun to flip through.
because of the timespan that these artbooks are from, a lot of these illustrations were made using traditional art mediums. there's some that i can tell were made with digital art programs, but they tend to use older programs and techniques, which gives them a particular look. i'm particularly smitten with the illustrations made with traditional art mediums, though... Mutsumi Inomata's watercolor art has really stuck with me.
her compositions are so striking to me... i really love how they're so strongly framed, with such clear silhouettes and carefully placed colors. her linework and brushstrokes were so delicate and intricate. i love the way she drew hair, clothes, and somewhat abstracted background elements. as i flipped through her artwork, i was so blown away... it felt closer to the kind of art that i'd like to make.
also, a lot of pieces from a Magic Knight Rayearth artbook really caught my eye, too...
i'm kind of obsessed with the way it fuses a lot of traditional art nouveau elements - heavy ornamentation, organic flowing shapes, intricate frames and compositions - with fantasy anime art. the linework and coloring is soooo nice to look at.
anyway, i've got a lot more artbooks to go through. that's just some of the work that's captured my attention so far. i've got a lot of thoughts brewing in my head about how i'd like to move forward with my own work, and what kind of inspiration and techniques i'd like to implement... it's the spark i needed to keep going, i think.
2024-10-29 22:47:00
I bought a Lamy Safari, my first fountain pen, a couple of weeks ago. I tend to get obsessed over things when I first get into them, and thus end up in an endless rabbit hole of research. I knew this would happen.
I go back and forth between purely taking digital notes for work and using pen and paper. For the past few years, I’ve switched to digital note taking because it’s easier to cmd + f
to find what I’m looking for. However, with the constant game of musical chairs that is my dual-laptop setup for work, I end up using different applications for notes and, in turn, losing them anyway1.
And so, armed with this new pen I wanted to practice writing with, I decided to switch back to pen-and-paper mode, and back to the work notebook I’ve used on and off since 2017 2.
This is where I ran into a problem.
I have used Moleskine for years. I use it for my private journals and my work journals. However, I soon discovered that fountain pens and Moleskines are not the best combination. The bleeding is absolutely HORRENDOUS. I can handle ghosting, but when I can barely read what I’ve written on the other side of the page because of the bleed-through, it’s like it’s making my eyes bleed too.
So down the rabbit hole I go.
I am currently using a Lamy ink cartridge with my pen. I researched ink options to see if that would solve my problem. Debatable. I do have my eyes on some black archival inks, for later.
I am on the lookout for a decently priced true black ink, so would love some suggestions, if you have any!
I didn’t stop there. I also watched an endless amount of videos, and read an endless amount of reviews for the best fountain pen notebook. I’ve long admired the Hobonichi line-up but figured I'd start a bit simpler. Today I decided to give the Midori (grid) notebook a try.
I haven’t done much outside of preliminary pen tests plus swatches, and will probably write more about it once I start writing in the notebook daily.
I’m almost done with both my private and work Moleskine journals. Debating on whether to use this Midori notebook for personal or work use. Maybe I’ll continue down this rabbit hole and experiment with other journals. I still have a brand new Archer & Olive dot grid journal I haven’t used from a couple of years ago.
Decisions, decisions.
76/100
Oops. I went down that path years ago, and I’m still spending way more money than I should on stationery.
Never try a TWSBI. They’re really good and relatively cheap compared to other fountain pens of similar quality. The problem is that it’s too hard to stop at just one—I have five.
MD is my favorite paper. I use Field Notes a lot, but only with cheaper pens. My fountain pens only touch MD paper.
-Otavio (via a comment on Mastodon)
re: notebooks, if you're looking for "moleskine form factor but strictly better quality & more fountain pen friendly", the default tier of leuchtturm is pretty good and their 120g edition is downright luxurious. the rhodia webnotebook also fits this niche pretty well. i have some more expansive notes & links here
-brennen (via a comment on Mastodon)
The notebook most similar to Moleskine that does not bleed and feather is the Leuchtturm 1917. You have a good one with the Midori.
The best paper is Tomoe River from Japan. Several makers offer it. I used to take work notes on Rhodia pads and scan them into OneNote for reference. I’ve settled on a few pens. Favorites are the Pilot 823 and Lamy 2000. Not cheap, but write smooth like butter.
-Dave (via a comment on Mastodon)
I enjoyed this detailed post :D I've never heard of Archer and Olive before but I'm checking them out now and omg!!
-Anh (via a comment on Mastodon)
I tried using a zillion fountain pens over the years for note taking, with various journals and, abandoned the pens in fav of cheap biros because, while the pens are perfect, the paper is not. The only really good paper for fountain pens, imho, is stationery for writing letters. The heavy good quality stuff is priceless.
The truth is, fountain pens are not designed for quick notes.
-Alexandra Wolfe (via a comment on Mastodon)
I would say Midori is first tier paper comparable to Tomoe River. Especially compared to the current iteration, Tomoe River S, which is still stabilizing—I think TR S will be a top tier paper once they iron out the production problems.
I use both old-TR and Midori and I think they’re both excellent. I prefer Midori for feedback (good for daily notes, lettering practice) and TR for writing fast (good for journaling / drafting).
just to offer an alternative opinion here— TWSBI has known production issues and over the last 5 years, many many new Taiwanese and Chinese pen makers are making pens competitive with TWSBI in price and features.
Look into Fine Writing International, PenBBS, Wing Sung 6xx, Asvine for some options.
As far as the Pilot Capless / Vanishing Point, there are several lower cost alternatives you could consider. There is also a cheaper steel nib version.
-Paradoxmo on Mastodon
You’re speaking my language here. I have over a dozen fountain pens + hobonichi, midori, and more. If you have any questions let me know. While it’s quite a bit more $$$, my go to recommendation is the Pilot Vanishing Point with an extra fine nib. Super smooth writer and the retractable nib makes it so easy to use for everything.
-Kevin Kortum (via a comment on Mastodon)
2024-10-22 05:52:00
Earlier last week, I got an email from Scott J. with the following message/inquiry:
Hi! Love what you’ve done with your bear blogs. You’re the first I’ve seen to have one dedicated to photos. 🤯 I’m really curious how you’ve done it — if you’re willing to share via email or, even better, a blog post!
I’ve been looking through some of the docs and I think I’m starting to form the how.
Thanks for considering and for the great posts.
I run 3 main blogs on Bear with two of them being photo related: august morning and Snaps by JCProbably. I didn’t want to immediately assume which one he meant when referring to a photo blog of mine, but my mind did immediately think: Surely he meant august morning because that’s where I spend a lot of my energy on. No one wants to know about Snaps. That site was created as my low effort photoblogging space.
After some back and forth emails, I stand corrected.
…what caught my eye was
snaps.jeddacp.com
, particularly because I hadn't seen post content displayed in the blog list before.
For context, or if you’re too lazy to go look, this is what that site looks like (on mobile):
To start with, the main template of this page is consistent across my 3 sites. The only difference is probably how the information (or in this case photographs) are presented.
In Snaps by JCProbably, I have my content set to display on the front page. I am doing this by using the following snippet.
## Recent 10 posts ⤵️
{{ posts|limit:10|content:True }}
### [See more →](/archive/)
I then added a little bit of CSS to style my embedded posts so that it doesn't inherit the style of the Archive page. I also included some commentary on there, in case you were curious on what I was trying to accomplish.
ul.embedded.blog-posts li {
display: block;
padding: 10px 0;
}
ul.embedded.blog-posts li a {
display: block; /* Forces the link title to be on its own line */
font: bold var(--font-scale) var(--font-secondary);
white-space: normal; /* Allows the title to wrap if it's too long */
text-decoration: none;
font-weight: bold;
padding: 5px 0; /* Optional: Adds some space above and below the title */
}
ul.embedded.blog-posts li:first-child {
border-top: none; /* Removes the top border from the first item */
}
ul.embedded.blog-posts li:last-child {
border-bottom: none; /* Removes the bottom border from the last item */
}
Note that the li:first-child
and li:last-child
is probably specific to my theme because of how my blog-posts
class is styled.
I don’t know if there is a cleaner way1 to achieve what I’m doing, and the code is probably kind of messy, but this is what currently works for me2.
… and if you are looking for a similar style to display posts / photos on your home page similar to Snaps by JCProbably, I hope it works out for you too!
Note: you can also find additional documentation over at docs.bearblog.dev/
74/100
I get a little self conscious when showing people my code. This is one of the firsts for me. Tell me how if there is a better way to optimize it, but don't tell me straight up it sucks.↩
I made a slight modification to the above CSS snippet from the original post from a suggestion I received via email. Thank you!↩
2024-10-28 12:40:00
Hello, little blog, it's been a while! The past two weeks have been uncharacteristically busy for me so, huh, I didn't write much here, oops!
I spent a week of vacation in Reno for definitely normal reasons. Turns out, being mostly offline with your friends and other freaks (complimentary) for a whole week is good??? Someone should look into this.
Then, as soon as I came back, my friend Joanna was in town to visit the Internet Archive, so I tagged along. I saw a bunch of very cool shit. Like, look at all this stuff!! Tell me this isn't cool as hell!! Excuse the shoddy photography job lmao.
I had other pictures, but they were all of Just Old Stuff. This is also just Old Stuff, but at least it's Devices! I'm never beating the nerd allegations.
Overall, meeting so many people and seeing so much stuff in the span of three nights was overwhelming but also great. The Internet Archive rules, man.
Finally, literally last night, I met with Nicky to give cohost 2 back to them. We then hung out at the Musée Mécanique. Given the "touristy" status of the place, I feel like I should have heard about it a long time ago, but it was my first time there, and it was super neat! Digital stuff is cool, but there's something just neat about seeing mechanical contraptions, you know? Nicky took some cool pictures there, you should check them out
On the nerd side of things, I spent some part of my weekend tinkering with fonts and color stuff on the site. The notable changes are:
I will most likely continue fucking around with the blog's theme because that's just how it goes, but this one felt significant enough to mention in a post.
November should be much quieter, so hopefully I'll be able to post more on here.
Have a good one!
- damien
2024-10-21 12:00:00
A few months ago, I wrote a post about how I wanted to blog less about blogging. I was surprised by the response I got, which was the opposite of what I expected. It seems folks really like reading about blogging, but I still haven't written a word about blogging since that post. This changes today, mainly because I failed at keeping my most recent platform swap quiet.
For the past few months, I've been drooling over Robert's Bearming theme. Since this blog originated on BearBlog, I never deleted it, and it just remained in a sort of frozen state since April.
On the sly, I've been experimenting with Bearming and just toying around with my old posts, and I realized I missed writing in markdown. I also was sick of getting emails from NameCheap regarding my SSL's, which was one of the main reasons I wanted to get away from self-hosting to begin with.
Realizing that Herman was now offering a lifetime subscription to BearBlog, I decided to take the dive and for the past week I've been slowly adding all the posts I've written since April to my old blog. My goal was for this to be so seamless that no one would even notice. I mean, I've really screwed the pooch in the past moving my blog, and this time I wanted it to be a silent move.
Well, I was almost successful. I managed to maintain my RSS and keep my feeds alive, however, I cleared my blog off my RSS reader and I updated the CNAME too quickly, so I wasn't sure if all my feeds were still working. I had to reach out on Mastodon for some verification, and from there I discovered that quite a few of my other "new" posts had hit the RSS feed today. So, I ruined my own quiet switch, but at least I didn't break anything this time!
So, besides Robert's theme, annoying SSL certificates, and a lifetime subscription, why come back to Bear? Well... this idea originated in an email that I received a few months ago from a reader.
When I moved back to Wordpress, I received an email that discussed discovering my blog on Bear. This reader encouraged me to go back to Bear, because the Discovery feed had been so good to my posts and the type of readers who visit Bear for new blogs would like my content. This kind reader wasn't wrong, I mean, so many of my online blogger friends originated because of Bear. They found a post that got some upvotes and emails got exchanged and that was that. I guess, in some way, Bear operates as a sort of library for a certain type of blog that isn't easily found, and some folks, (several I've spoken with who don't blog) use it as a sort of replacement for the normal social media scroll.
I honestly didn't think moving my blog would be that big of a deal. I certainly didn't think about any of the points that were made in that email, but I do understand. Bear is a community, not only of bloggers, but also of readers, and my type of blogging fits in well here.
So, I've returned to Bear, the place the originally inspired me to get back into blogging when I really thought I'd walked away for good. I can't guarantee it's my forever home, but I'm excited about seeing how things play out.
2024-10-20 22:45:00
This post describes my lessons learned after 10 years running production environments in sizes ranging from "just getting started" to a "Series F" company with 4-9 SLAs.
Like any good developer, I'm impatient and expect tasks to be fast, especially if I need to do them often, like deploying. Nothing is worse than hitting "deploy" and having a 10-15 minute delay before I can validate my changes. It's a pain felt by the whole team, multiple times, every day. It breaks their flow. And engineers are expensive, so this lost time and concentration costs a lot of money too.
Let's start with the typical setup for my company, analyze what takes the most time, and see how we can strip these layers away to make something that's faster and simpler.
CI/CD has been a Best Practice(tm) for a long time now, but it's slow. Even with special concern for caching, it's just much slower than running go build
locally, and it's a lot more complex.1 For a big application at my company, compiling locally takes ~10 seconds, whereas building the binary in Github workers takes several minutes.
Gradual rollouts are slow too, taking 5-10 minutes as k8s rolls out updates to pods across the fleet. This is an especially important practice when your deploys take so long, since reverting any change will be just as painful. You need to be sure it's going to work the first time.
But if you could deploy in 10 seconds, do you need to gradually increase traffic for every change, or could you just redeploy?2 I would just redeploy. The YOLO of devops.
I know what I want. Let me deploy quickly and undo changes quickly. So how do we do it?
Let's go back in time and use the basics: bash, rsync, and a service manager. At a high level, my typical deploy script looks like this:
#!/usr/bin/env bash
set -ex
TMP_DIR=/tmp/app
rm -r "$TMP_DIR"
mkdir "$TMP_DIR"
go build -o "${TMP_DIR}/app"
cp app.service env.ini "${TMP_DIR}/"
rsync -chazP "$TMP_DIR" server1:
ssh server1 '
sudo systemctl stop app && \
sudo cp -R app/* /home/_app/ &&
sudo mv app /home/_app/app && \
sudo chown -R _app:_app /home/_app/* && \
sudo chmod 400 /home/_app/env.ini &&
sudo systemctl start app'
rm -r "$TMP_DIR"
This example script3 builds our binary, moves it to our dedicated daemon's home folder, adjusts permissions and ownership, and restarts the service.
"But wait!", I hear you say. "You're only deploying to one server. This means we have no redundancy, and restarting the service results in a brief outage." We certainly have no redundancy in this scenario -- I'll write an entire post espousing the benefits of vertical scaling over horizontal and why redundancy isn't all it's cracked up to be until massive scale. It's too much to fit into this post. But to your second point, restarting a service doesn't mean you need to have an outage -- simply a delay! Your reverse proxy should keep the request open until the server comes back online. In Caddy, you do this via try_duration.
So it really is that simple: a small bash script, building locally, rsync'ing the changes, and restarting the service. It's just the bare essentials of a deployment. That's how I deploy in 10 seconds.
In my next two posts, I'll:
Subscribe on RSS or email to follow along.
Every developer knows how to compile locally. Only a few at my company understand Docker's layer caching + mounts and Github Actions' yaml-based workflow configuration in any detail. So when something doesn't work compiling locally, it's also a lot easier for a typical developer to figure out why.↩
Nothing is stopping you from A/B testing your code in the application layer with a simple rand.IntN()
. If you're deploying something risky with lots of traffic, you probably should. But implementing gradual rollouts in CI/CD forces engineers to wait several minutes on every deploy, every time, even for trivial and low-risk changes.↩
A real script would be decrypting secrets and checking git status --porcelain
to ensure that all the changes are committed, but this gives you a good overview of the approach. Future posts will describe how to reliably provision a server.↩
2024-10-27 22:50:00
There’s an area on the back of my left hand that pinches when I tilt it back past ninety degrees and press a little. I’m no stranger to hand and wrist pain, but this one has remained for a few weeks, which is a little concerning. I can’t even do something as simple as a plank without it hurting.
I’ve not been doing anything new, laptop setup-, writing- and drawing-wise, so I’m inclined to believe I strained it at the gym some weeks ago and just thought it would go away with the rest of my soreness, but apparently not! I’m probably going to ask my trainer tomorrow what is up and what I can do for it, and if the pain continues to stay, see someone about it. I’d hate it so much if “not being able to put weight on one wrist” became a lifelong limitation.
I’m not very old but I think I am getting to that point in life where I’m like, oh crap, I really do have to be looking after my body, huh? Late nights have lasting impact on my energy, eating too much processed food makes me feel bad, and wrist pain doesn’t just magically go away. I’ve got to be a little more deliberate, a little less reckless about how I do things now knowing the effects.
To be fair, my body has faithfully carried me around for 26 years with very minimal damage despite how little care I’ve put into its upkeep. If I owned anything for 26 years before it started showing major signs of not being able to work like it used to without maintenance, I’d be very impressed with its engineering, so putting a little more care and attention into maintaining it is the least I can do.
Plus, the longer I try to deny it, the worse off I’ll be, I think. Even if this could just be me reading too far into concurrent occurrences, even if it turns out to be nothing, it’ll probably still pay off to problem-solve sooner than later1 as soon as I notice something. It does make me feel a little loserish not being able to pull all-nighters like I used to though.
Or attempt to. I will probably still kick and fight against the adult responsibilities of discipline and self-maintenance for a bit. But acknowledging this is a step too.↩
2024-10-29 00:00:00
This post is going to consist of my ongoing review of various sampling methods I’ve found through papers and online implementations. While samplers are relatively straightforward to create and combine, there is a challenge in trying to sample both high quality and diverse outputs. I'm particularly interested in finding samplers that are context-aware, resist hallucination, and can explore multiple reasoning paths in language models. For most of the samplers below I link their corresponding papers, implementations, and default parameter settings.
Language models generate text by predicting one token at a time. First, the process starts with tokenizing input text and converting these tokens into embeddings. Then, we feed them through the model’s layers and get logits - raw, unnormalized scores that show how confident the model is in each token from the vocabulary being the next token in the sequence.
The softmax function then transforms these logits into probabilities, and now we can use various sampling methods to select the next token. Each selected token is appended to our input, and we repeat this process until we’ve generated the complete output.
Also, we can take the natural logarithm of these probabilities to give us log probabilities (logprobs). Logprobs are useful for scoring entire sequences since we can add them instead of multiplying probabilities and potentially running into underflow.
Input: "the dog jumped over the __"
↓
tokenization
↓
embeddings
↓
language_model
↓
[5.21, 2.1, 0.3] # Logits for "fence", "wall", "house"
↓
[0.75, 0.2, 0.05] # Probabilities after softmax
log("the") = -0.69
log("dog") = -1.20
log("jumped") = -1.61
# logprob of a sequence -> sum the individual logprobs
log("the dog jumped") = -0.69 + (-1.20) + (-1.61) = -3.50
Greedy decoding simply picks the highest probability token at each step - very basic and naive. While straightforward, greedy decoding often misses better overall sequences because it can't look ahead to see high probability tokens hiding behind lower probability choices.
Input: "the dog jumped over the __"
↓
language_model
↓
[5.21, 2.1, 0.3] # Logits
↓
[0.75, 0.2, 0.05] # Probabilities
↓
"fence" # Select highest probability
Beam search tackles these limitations by tracking multiple candidate sequences (beams) simultaneously. At each step, it considers the next best tokens and selects the top candidates based on probability. This process stops either at a certain max length or when an stop token is chosen.
Source: d2l.ai
Greedy decoding and beam search both do well in close-ended tasks (translation, text summarization, image captioning) where the output length can be inferred from the input text length. However, they perform poorly in open-ended text generation (creative writing, roleplaying, conversation dialogue) where there is no clear stopping point. Both of these methods produce repetitive and incoherent text in open-ended tasks.
Sampling introduces diversity into our text generation by giving every a token a chance to be picked based on its probability, rather than always picking the most likely token. This reduces repetition, but it also risks selecting too many low probability words. To control this, there are techniques used to constrain to a subset of our distribution.
One technique is temperature scaling, where we scale the model’s original logits with a specific value. Lower temperatures T < 1
make the probability distribution more peaked, which favors high probability tokens. Higher temperatures T > 1
flatten the distribution, and increases the chance of selecting lower probability tokens. Higher temperatures are associated with more “creative” or “random” outputs.
Note that temperature divides the raw logits before the softmax, so the scaling effect is non-linear. This means doubling the temperatures won’t double the model’s “randomness”.
Input: "the dog jumped over the __"
# logits for fence, wall, house
logits = [5.0, 3.0, 2.0]
# divide logits by 0.5, more peaked distribution
temperature = 0.5
scaled_logits = [10.0, 6.0, 4.0]
probs = [0.85, 0.12, 0.03]
# divide logits by 1.0
temperature = 1.0
scaled_logits = [5.0, 3.0, 2.0]
probs = [0.67, 0.24, 0.09]
# divide logits by 2.0, flatter distribution
temperature = 2.0
scaled_logits = [2.5, 1.5, 1.0]
probs = [0.45, 0.32, 0.23]
Combining sampling with beam search should theoretically blend the creativity of sampling and the maximization likelihood of beam search. However, there is a key problem, in that low probability tokens have compounding effects in beam search. When we encounter a low probability token early in our candidates, beam search drastically reduces the chance of this beam being selected, even if the sentence leads to an interesting output. This pushes beam search toward sampling repetitive sequences, with minimal variations only appearing at the end of the sentence.
Stochastic beam search solves this by adding randomly generated noise to the logprobs before selecting beams. Before sampling token probabilities, we:
This approach preserves creative words by removing the compounding penalty. When we select the top-k noise-adjusted probabilities, we pick the diverse samples (if noise boosts the lower probability word into the top-k) while maintaining quality (by still choosing the highest probabilities at each step).
[paper, released in 2018] | Huggingface | fairseq
In practice beam search typically produces candidates that differ only slight from each other since they all stem from a few high-scoring beams. This wastes compute and gives us candidates that differ only slightly from each other in terms of content. Diverse Beam Search fixes this by optimizing for diversity in our candidates.
First we add a diversity penalty that discourages repetition between sequences. Measuring diversity across all B candidates at each timestep however would we be too computationally expensive. So instead, we split our B candidates into G groups. The first group does regular beam search, but the later groups will receive a diversity penalty2 if they repeat words from previous groups and beams. We then subtract this penalty from the sequence logprobs, and this gives us B beams that are both highly probably and distinct from each other.
Source: Diverse Beam Search paper
Besides temperature scaling, a straightforward way to constrain to a subset of highly probably tokens involve truncation-based methods where we limit to high-probability tokens and sample from this distribution.
[paper, released in 2018] | GPT-2 |
default: 40
Top-K restricts token selection to the k most likely tokens, where k is a predefined parameter. This method helps prevent the selection of highly improbable tokens. We first sort our tokens by probabilities from highest to lowest, select the top k tokens, renormalize these probabilities based on these k tokens, and then sample from this reduced set.
GPT-2 popularized using top-k sampling and was inspired by the paper above, which utilized top-k sampling to generate more descriptive stories via neural networks. Higher K values lead to more diverse text and lower K values lead to more predictable text.
One criticism of top-k is that we do not dynamically adapt the words that are filtered in our distribution, and instead pick a fixed value which cuts off our distribution arbitrarily. Different contexts need different K values. For instance, a very probable sentences like “the dog jumped over the ____” require only a few high probability words, whereas a sentence like “I sold the ____” could be any item/noun, so more words should be sampled from a larger set.
[paper, released in 2019] | OpenAI Docs |
default: 0.9
Nucleus Sampling instead adaptively limits the set of tokens by selecting a set of tokens whose cumulative probability exceeds a threshold p. Like top-k, we sort tokens by probability, but we add up probabilities until we hit our p threshold. We then renormalize the probabilities and sample from this subset.
The authors of this paper show that top-p adapts better than top-k while maintaining fluency. Nucleus sampling is easier to tune since it adaptively prevents sampling from too few or too many tokens - a common problem with top-k. Higher p values generate more diverse text, and lower values produce more probable completions.
Although top-p is more adaptive than top-k, it still fails to accurately find the cutoff point where low-probability tokens start to occur, and as a result can still include too many unlikely tokens, leading to incoherent text.
[article, posted in 2019] | llama.cpp |
default: 0.9
Tail Free Sampling, created by Trenton Bricken, measures the derivative of Top-P sampling in order to find the “tail” at which tokens are “no longer replaceable”. The author argues that this cutoff can be found by finding where the token probabilities start to plateau.
The process works by first measuring how quickly token probabilities decrease from highest to lowest. Then, TFS calculates the second-order derivative of this distribution and sums up these derivates until we reach a threshold Z. This Z parameter determines where TFS will cutoff unlikely tokens. The author explains some theoretical advantages of this approach, but there aren’t solid benchmarks for open-ended text generations, so I'm not sure if it dramatically improves nucleus sampling.
[r/LocalLLama thread, posted in 2023] | [paper, released in 2024] | Huggingface |
default: 0.1
Min-p sampling was created by @kalomaze and @menhguin and is an alternative truncation-based sampler. The author writes that min-p is able to solve the issue of top-k where too many probable words get discarded, and the issue of top-p where there are too many low probability words in the distribution.
Min-P solves this by setting a minimum probability value min_p for a token as a baseline. This value is then multiplied by the probability of the top token in the distribution, and the resulting value is the minimum threshold that a token will be considered at all. For example, if the min_p is set to 0.05
and the most likely token has a probability of 0.9
, logits with a value less than 0.045
are filtered out.
I see this as a similar approach to what Tail Free Sampling tries to accomplish - both of these methods try to find and cut off the tail of “irrelevant” tokens. Unlike TFS however, there are some emerging creative writing benchmarks that show min-p achieving significantly higher winrates compared to top-p. Min-p doesn't show many downsides in standard sampling settings, and there are clear benefits in higher temperature settings where the model is more diverse in its outputs.
Source: Min-P paper
Most language models are trained to predict tokens in a left to right manner, which forces us to follow a single reasoning path. If we hit a point where there are several low probable tokens, we risk going down paths that lead to hallucinations or lower quality text. We are then stuck choosing whatever is “good enough” in our probability distribution, even if it’s not the best path.
Contrastive samplers try to generate multiple candidates and contrast their differences, and by comparing these distinct paths, we can distinguish which ones are worth exploring and which ones we should avoid.
Basically, the gist of contrastive sampling:
> “How do we make our model smarter?”
> “See what a dumb person says and do the opposite of that”
[paper, released in 2023] |
default: α: 0.1, β: 0.5
Contrastive decoding involves two models:
We basically subtract the distribution of “dumb” completions from the amateur model from the distribution of completions from the expert model, and we use this subset to guide sampling for the expert model. This pushes the text generation toward tokens where there’s a big gap between expert and amateur distributions, and these gaps should signal “smarter” tokens that the smaller model doesn’t catch.
For instance, let’s say you are given the following input sentence and logits:
Input: “The dog jumped over the ____ “
Smart model logits:
wall 6.0
fence 5.8
cat 5.5
house 2.1
Amateur model logits:
wall 5.9
fence 3.2
cat 5.4
house 2.0
There are two parameters here. α controls the masking cutoff, any words below this cutoff get dropped. β is the expert-amateur tradeoff.
Cutoff: log(α) + max(expert_logits)
α = 0.1
Cutoff = log(0.1) + max(expert_logits)
Cutoff = 3.7
Tradeoff: (1 + β)expert - βamateur
β = 0.5
wall: (1.5 * 6.0) - (0.5 * 5.9) = 9.0 - 2.95 = 6.05
fence: (1.5 * 5.8) - (0.5 * 3.2) = 8.7 - 1.6 = 7.1
cat: (1.5 * 5.5) - (0.5 * 5.4) = 8.25 - 2.7 = 5.55
house: (1.5 * 2.1) - (0.5 * 2.0) = 3.15 - 1.0 = 2.15 —> masked out 2.15 < 3.7
Final logits:
fence: 7.1
wall: 6.05
cat: 5.55
house: -inf
Even though wall had higher logits in both models, fence ends up with the highest score in the final logits. Because the amateur model wasn't as confident in fence compared to the expert model, this gap signals that fence is the smarter choice, so contrastive decoding pushes this to the top of the logits.
In the paper, the authors found that contrastive decoding outperformed Hellaswag and GSM8k benchmarks compared to larger sized models, and was shown to better in reasoning tasks and long-form text generation. However, it performs worse at arithmetic and factual recall, so there definitely needs to be more exploration on the hyperparameters, model size ratios, and the training saturations for each of the models.
[paper, released in 2023] | Huggingface
Pretty much the same principles as the paper above, but instead of using a dumb model, we compare the final layer of a language model to the earlier layers of the model and do the same calculation of steering the model towards smarter tokens.
The key idea here is that earlier layers capture basic patterns, while the final layer would capture more complex understanding. DoLa Decoding has similar benefits to the approach above but is more efficient because we aren't storing an extra model to compute these differences.
These methods use entropy, which is a measure of a model’s uncertainty or randomness, to guide the sampling strategy. Like contrastive sampling, we try to explore different reasoning paths, but through the lens of information theory instead.
Entropy measures uncertainty across all tokens in a distribution. High entropy means the model is uncertain across many tokens, whereas low entropy means the model is is confident on few tokens.
Entropy = -Σ p(x) * log₂(p(x))
This connects directly to a token's information content. Lower information content means the word is more expected and common, and higher information content means the word is more unexpected and surprising to the model.
Information Content for one token = -log₂(p(x))
[paper, released in 2022] | Huggingface |
default: τ: 0.2
Locally Typical Sampling finds words that match the expected information content of the surrounding context. The insight here is that try to avoid words that are either too predictable (low information content), or too surprising (high information) in order to minimize miscommunication risk. Based on a parameter τ, typical sampling tries to create a subset of words that are not too predictable nor too surprising. This leads to text that is more natural and human-like.
In Locally Typical Sampling, we:
Through this method, we get some cool benefits like a built-in repetition penalty. When words repeat, the model sees them as more predictable, which lowers their information content. This pushes them outside the typical subset, so we then avoid repeating words.
However, the core assumption that typical words are within some fixed distance τ of the average entropy seems arbitrary. Moreover, I think we already learn the human patterns through extensive pre-training, and I think an explicit constant enforcement of this distance might be overkill.
[paper, released in 2020] | llama.cpp |
default: τ: 3.0, η: 0.1
Mirostat sampling controls text by dynamically adjusting the perplexity3 through feedback. The goal is to prevent both low perplexity (repetitive text) and high perplexity (incoherent text) by maintaining a target surprise value.
The algorithm uses two key parameters: τ (target perplexity) and η (learning rate). For each token, it calculates actual perplexity and adjusts a maximum threshold (μ) using the error between target and actual perplexity, multiplied by the learning rate. Values above this threshold are filtered out, and the next token is sampled from the remaining subset. This feedback loop maintains perplexity values close to the target throughout generation.
I like the idea of using dynamic values that adapt to context, and this is definitely better than a fixed threshold. However, just relying on perplexity seems insufficient for text control, and in my experience it's often an unreliable quality marker. Also, looking at just the next token limits us because we miss broader patterns that emerge across multiple words and ignore the long-range context for sentences.
[twitter thread, posted in 2024] | Github repo
Entropix sampling, created by @_xjdr and @doomslide, is an adaptive sampler that utilizes entropy in parts of the model and its logits to guide sampling decisions. There are 5 key metrics that go into this method:
Then, based on these metric calculations there are 5 possible sampling strategies:
Source: entropix repo
To summarize, here's the workflow:
This is a behemoth of a sampler, and from the text generations I've seen online, there seems to be much better reasoning and coherence from the model. Others have reported initial improvements in both reasoning and math tasks across different model architectures also. I'm interested in seeing more benchmarks get released, as well as reproducing these results once the repo starts to mature and there is more guidance on usage.
There are parts to entropix that are unclear however. The correlation between the attention calculations and the sampling strategies is hard for me to understand, and some of the parameter adjustments feel arbitrary (e.g. confidence score calculations, parameter tweaks). Granted, this project is only 30 days old, and I think the author acknowledges this and is still hacking out things, but I'm really interested in seeing entropix get fleshed out in the future.
Improved reasoining with entropix | Source: Twitter
[paper, released in 2023]5 | [paper, released in 2023]5
This isn’t really a sampling method but more a technique to speed up your inference if you have extra memory compute. In speculative decoding we have two models:
There are certain sequences (common phrases, pronouns, punctuation) that are easy to predict. We don't want to waste our big target model's compute on these tokens, so we let the smaller draft model handle them.
The draft model computes K possible next tokens, while the target model works on the next tokens. We compare what both model's predict and if the draft model passes the acceptance criteria, we keep the K tokens and move to the next sequence. If any tokens get rejected, we resample via a blend of the two distributions and restart the process.
We get about 2-2.5x faster inference with this approach, and we don't need to change our model's architecture or do any extra training. Most important, we can pair this with any sampling technique, as long as both models use the same sampling method and parameters.
There are some more efficient implementations from Apple and LMSYS that show speculative decoding can work with a single model, eliminating the need for a separate draft model.
Microsoft Guidance | OpenAI structured outputs | Instructor
There isn’t really any literature to go over, but logit masking is crucial if you want to be able to control your LM's output, especially for structured data.
After you get your probability distribution over your vocabulary, you simply mask out invalid tokens by setting their probabilities to a value like -inf
. This gives you hard constraints on what tokens can be sampled, and you can enforce whatever structure you need.
Example: Only allow blue, red, green for the next token
Before Masking:
" : 0.15
the : 0.12
red : 0.10
, : 0.08
a : 0.07
blue : 0.06
} : 0.05
green : 0.04
is : 0.03
purple : 0.02
After Masking:
"red" : 0.50 (renormalized from 0.10)
"blue" : 0.30 (renormalized from 0.06)
"green" : 0.20 (renormalized from 0.04)
the : -inf (masked out)
, : -inf (masked out)
a : -inf (masked out)
} : -inf (masked out)
is : -inf (masked out)
purple : -inf (masked out)
Uses something known as the Gumbel-max trick to add gumbel-distributed noise to the token logprobs. The Gumbel distribution models the max of the set of samples, so it's ideal for selecting the top-k sequences.↩
For the diversity penalty, it’s usually n-gram matching or looking at vector similarity, but there are a bunch of ways to compute diversity penalty honestly. Fairseq implements a cumulative diversity penalty, whereas the original paper does hamming diversity which is implemented in huggingface. You can interpolate between the two approaches and get pretty good results.↩
Perplexity is related to the information content, in that it’s just the exponential of information content. Entropy, information content, and perplexity all are just measures of uncertainty in a model.↩
For parameter adjustments, there are four guidlines in the Entropix sampler. 1. Adjust temperature based on logits entropy, attention entropy, and agreement. 2. Adjust top-p based on attention varentropy. 3. Adjust top-k based on on interaction strength and attention agreement. 4. Adjust min-p based on the logits uncertainty (entropy + varentropy)↩
Google and DeepMind to my knowledge independently came up with the same idea at roughly the same time, and their papers describe similar techniques and report the same speedups.↩
2024-10-25 09:23:00
My mom had a stroke two nights ago. She had already fallen twice at home in the last couple of months (she's almost 90) and was in a rehab facility when it happened. I am thankful she was there because they noticed it right away and called the paramedics. I received the call around 11:30PM and headed off to the hospital.
When you have never seen a stroke patient in person it is very unnerving. I wasn't really prepared but not sure how you could be until you get there. It really makes it hit home just how dangerous and life-altering it is.
"Thankfully" it was just one clot and she was eligible for a procedure to go in and try to remove the clot. Unfortunately the hospital doesn't have the facilities to do that procedure so she had to be moved to another hospital about 30 minutes away. It was a blessing that it was now the middle of the night and there was no traffic so the trip to the other hospital went quickly.
When we arrived the team was ready to go and she went right in for the procedure. I was told where the waiting area was and it was eerily silent. There was nobody else around which seemed so weird since this particular hospital is just on the outskirts of Chicago proper. The doctor came out after about 45 minutes. The procedure itself only took 30 minutes (about as good as it can be) and he told me that it went very well and that the clot had been removed. He showed me pre and post pictures of the blood flow in her brain and honestly it was mind-blowing to see. The other good thing is that soon after the procedure was complete she started to have movement again in her right side.
To make this all more fun I had my COVID shot earlier in the afternoon and the effects had started to kick in. I wonder if the adrenaline of the situation tempered the effects because I never really felt bad like in the past, just...blah. Once they had transferred her to the ICU my wife came to get me because there was clearly no reason to stick around. She was sleeping and they'd be checking on her hourly. I got home about 4AM and tried falling asleep. It took a long time and I woke up after only 2 hours. I was operating on fumes all day and thankfully slept the night through last night.
Today I went to visit, not knowing what to expect when I walked in her room. She looked really good, pretty much normal and her face lit up when she saw me. The speech pathologists were there just starting another round of diagnostics and I was told by one of them that had seen her yesterday that the difference between yesterday and today was remarkable.
The stroke was on the left side of her brain and affected the speech center so she currently has global aphasia and can't speak or understand words. That said when I was talking to her I used a lot of pictures and gestures. She clearly was getting what I was saying with those aids. The pathologists said that the aphasia will recede with time and therapy. It might not totally go away but she should be able to get a lot of that functionality back. She is able to eat and drink which was a huge relief. It was a good visit and really made me feel a lot better knowing at least we're starting recovery from a solid base.
All of this also reminded me just how quickly life can change. That afternoon I had been visiting her and she was fine. 8 hours later I was seeing the effect that a stroke can quickly have on someone, robbing them of a lot of their life. My mom has always been a voracious reader. She loves games like Solitaire and Mahjongg and word puzzles. So this was doubly hard to see since she can't currently take part in the majority of what gives her pleasure.
I am very thankful that everything was able to happen so quickly to help minimize the effects of the stroke. I am also very thankful for all of the wonderful people at both hospitals for being so caring and professional. These folks are truly heroes.