Patrick Glendon McCullough
baking
cover:
profile:
Patrick Glendon McCullough
Patrick Glendon McCullough
Boy riding a blue elephant with the letter "m" on it in a cartoon prehistoric landscape

When I first built this site, it was an attempt to make something that could be my own personal facebook / instagram / twitter site that I was in complete control of. I even downloaded all of my Facebook and Instagram posts at the time and imported them since the main thing that kept me on Facebook at the time was the "memories" feature.

Later on, I imagined maybe I could build it in such a way that other people could download and host it and add their own name and bio and pictrue, etc... and quickly have their own personal social media.

Then, I imagined that maybe I could give these different sites the ability to connect to one another via some central registry, allowing them to see other sites' posts on their own, and like and share and comment, etc... without ever leaving their own personal domain. But ultimately, social media is only ever as successful as the number of people you know on it, and setting up your own site and hosting it was never going to attract many people.

A couple of years ago, a service called Mastodon came into existence, which had a similar premise. You host your own account (or use one of many, many sites out there, eg. https://mastodon.social) and it can be viewed, liked, etc... by any other Mastodon account.

For a hot minute, when Elon Musk was buying Twitter, it seemed like it might take off, but ultimately I think it was just too confusing for it to ever be mass-adopted.

At any rate, on a whim, I refactored this site to integrate with Mastodon, so if I create a post (like this one), it displays here like it always has, but also publishes to Mastodon (in places like this: https://mastodon.social/@patrick@pg.mccullo.ug) and I have a feed (visible only to me) of other Mastodon users I follow. Unfortunately, right now it's just the creator and a bot that spits out Mastodon stats and analytics. I couldn't find anyone else that seemed very interesting. I got excited to find Stephen Fry, but his last post is from 2023. But it's been a fun distraction from the lingering ache of a breakup...

2 years ago

const ಠ_ಠ = (x,y = "") => !x?console.log(y):(z) => ಠ_ಠ(z, y+x);

ಠ_ಠ("i")(" ")("❤️")(" ")("h")("i")("g")("h")("e")("r")(" ")("o")("r")("d")("e")("r")(" ")("f")("u")("n")("c")("t")("i")("o")("n")("s")("!")();

· 1 min read
4 years ago

I was excited to move into a big new phase of this website, which was to rebuild it on top of Remix. Right now, the site is just a React application, meaning that every part of it is generated dynamically when you load it.

There are some issues that arise from this that range from mildly pesky to somewhat substantial, mostly with the fact that search engines don't always do a great job of reading the site.


But more than anything else, I was just looking forward to tackling a technology I've been studying for awhile.


Unfortunately, in starting to transition my code, I realized it's a bit too messy; a natural byproduct of building something without a blueprint. As functions and components and state got added, I was just tacking on state, doing a lot of prop drilling, etc...

Transitioning it as it is into a Remix app is going to have me fighting with messy code AND Remix to make the messy code work. So, I'm now tackling a full code refactoring, which is not nearly as exciting or satisfying, but I'm sure will be in the end when I have a much more maintainable codebase.


Especially since it pulls me back to my original vision, which was to have this as software that anyone could easily utilize.


So that's what I'll be doing for the next little bit...

· 1 min read
4 years ago

Finally tackled getting websockets integrated into the site, which was way easier than I'd worried it might be. My email client (mentioned earlier) worked by writing received emails to the site's database. So when I would come onto the site, it queried the database for the emails (a pretty big pull) then displayed them. Then, every minute, the site would query the database again, another big pull, to see if there were new ones.

I could get away with these frequent, big lifts, because I'm the only one doing them, so it didn't have to scale. But it was still awful practice, and could be really slow too. I would also re-query the database every time I reloaded my inbox after deleting an email, reading an email, etc...

Now, with websockets, I make a single query when I first load the site. After that, every time my server receives a new email, it sends it to my browser, which then just slips it into the top of my inbox, rather than having to reload the whole inbox.


With the websockets integrated, I was able to refactor the whole email component, reducing the lines of code dramatically, in addition to now having a much, much faster client, and a database getting bothered a lot less frequently.

· 1 min read
4 years ago

Well I certainly seem to have achieved my goal of getting myself to use my website more... Spent much of the day fiddling with it. Added a fancy little background pattern I like and integrated an API to replace the GPS coordinates with a place name (hover your mouse over the blue pin at the top right and it says "Cochecton, New York", for instance). Also, my main use of the site is that it has a little control panel that only I see when logged in that has a custom email client I built. Emails I receive get routed through the Postmark API, which sends a post query to my server which I then write to my site's database. I've never gotten around to dealing with attachments, which come as a massive string of random characters. Today, finally set it up so that said random characters get converted into files and sent to my Amazon Web Services hosting account so I can access them. Satisfying little achievement for a lazy day. My next goal is to integrate Socket.IO to notify me of new emails, but no idea if/when I'll get to that. Also managed to finally start revising the novel. Honestly I'd been reluctant; so often I set out to fix up a flawed draft in editing, then get so turned off in revisiting it that I shove it in a drawer. Encouragingly though, I gave myself such a strict checklist of what I was actually looking for in this read-through that I was able to go through it in a more detached way than usual.

· 1 min read
4 years ago

So in building a set-up where I can easily swap out a cover image and profile image and some sort of daily or momentary word--for no particular reason--I thought it might be fun to play with image EXIF data, which I hadn't ever done.

Embedded in the code of the image is a bunch of info about aperture, exposure, colors, and other photography stuff I don't understand, but also GPS. Interestingly, I learned that it doesn't seem to provide latitude-comma-longitude, but instead three different numbers for each. Degrees, minutes, seconds. And you run an equation on those to produce the coordinates. Got it wrong initially, but fixed it so now when I upload a cover or profile image, it says when it was uploaded, and has a pin showing where it was taken.

I have the day completely to myself today so looking forward to continuing indulgence in similarly pointless pursuits.

· 1 min read
4 years ago
GitHub repository for Facebook's Lexical project, featuring code files, issues, and pull requests

I fixed a Facebook (open source library) bug! 😎 For free... 😒


Fun little personal achievement to see myself on the repo as the most recent contributor (even if it amounted to adding a single line of code and tweaking one other...). I really like Lexical as a product--I use it on this site (though not in a forward-facing way, just for myself to be able to write posts like this). I've been meaning to do a little write-up on it. Maybe later.

· 1 min read
5 years ago
Really tired of social media for a number of different reasons, but still occasionally feel the urge to share thoughts and pictures with the 2-3 people who follow me on different platforms. A blog might seem like a sensible answer, but that's always overwhelming and never holds my interest long. Piecing together 140 characters that no one will read is a lot more appealing than writing a couple thousand words that no one will read.

So, I built this. It doesn't look like much, but it's got a pretty nifty backend (if I do say so myself) that makes it more or less a clone/amalgam of all the major social media websites. And since I host it, I have full and total control over every video, photo, or note I post.

I have a long-term vision of getting the code for it tidied up enough to be able to have other people run it on their own websites, and allow said websites the ability to connect with other websites on the same platform so that there could potentially be a traditional social-media-esque feed.

Which basically means that a random visitor to your website just sees your posts, but when you, the owner of the website, visit it, you see your posts intermingled with the latest posts from websites you follow, and have all of the usual social media methods for interaction (liking/commenting). But in a completely decentralized system.

Just an idea, and I'll probably get bored of it before I get far, but in the meantime, at least I have an easy way to store thoughts and memories outside of Facebook/Instagram/Twitter.