March was for Swift

April is here. I’ve got to admit that I haven’t been super productive on the side projects in the last couple weeks. My parents were in town at the end of March, a few new proper work projects have sprung up and I’ve been spending a few free hours here and there playing Fallout 4. Other than some tinkering with Swift, there’s not much progress on the active projects.

I do have a few things that I would like to finish in the next two months though. The first three weeks of June are going to be very busy so I’d like to finish up a few things before then so I don’t have to take a three week break and come back to a project I don’t remember anything about. Maybe Deep Birding ?

I’ve been having a hard time getting started on machine learning stuff. There are plenty of tools but they’ve all heavily optimized for seeing the quantitative efficiency of the results for testing and research, not for visualizing or adapting the results for use in a project. I have to do a lot more reading before I can get up and running with it.

As for current projects, That Thing in Swift continues to have its best-month-ever every month. I wrote about some clever ways to adjust the organization of view controllers in Kill your viewDidLoad on the 16th of March and finally posted to Reddit on the 21st which sent huge amounts of traffic and links from various other places. The long tail of Twitter links continues into this week. I finished the custom page preview images the week after that post launched so now all those links have nice images.

It remains to be seen if the many links given in the last couple weeks translate to more search traffic (by far the dominant means to reach the site). I don’t know how long that might take or when those values are recalculated or even what search terms it might impact.

I killed the discourse integration and server. That was not a good substitute for comments. I’m not certain a normal comment system would be useful or drive any sort of additional traffic. I was thinking about in-page annotations/comments but I don’t like the options that I looked at. I would have to build my own to make it really fit with the content and that seems like a lot of effort for little benefit.

Syntax Highlighted Image Previews for Hugo

On today’s episode of Various Tools Connected Together In a Way That May Only Be Useful For Me, I’ll discuss some customization I recently did for That Thing in Swift to get syntax highlighted images for image previews on Facebook, Twitter and Google.

I love writing new stuff for That Thing in Swift , especially now that I’ve found a niche in what to write about and I’m continually surprised at the amount of traffic that organic search and social shares can bring to the site for a given article. I’ve been working on some SEO goals (in a good way) and one thing I noticed that other Swift resources do not do is providing a helpful preview image for search results and social unfurls.

It would be easy to make something generic for the site that shows up for every post. That would be semi-helpful for social shares but not so much for search results. Instead, what if we could show people exactly what they came to the site to find in the first place? What if we could show preview images of the code we’re about to demo?

My goal was to create short snippets of syntax highlighted code that were representative of the post content

Holy crap it's March

March has definitely snuck up on me this year. Maybe partially because I have a lot of other work to do right now, days can be a bit of a slog to wake up, figure out which contract needs attention, build stuff all day, sleep, repeat. I definitely need to mix my days up a bit which was my intention when I said I was going to work out of some different locations a few weeks ago. Still have not gotten around to figuring out where those places are or when I would do this 😁

I made a few small tweaks to SPI Websockets to move the frame timing back to where it should be (in the spi package) but I’m still messing around with what designs I can actually build with it. I have to make a gif of the real thing vs the sim display before I can open source it. Afterwards I’m not sure about when I’ll get around to building something in it.

My first That Thing in Swift livecoding event was last week and went way better than expected. I built a small project in a little over an hour, had roughly 10 concurrent watchers the whole time and got some good feedback on Twitter afterwards. I did some digging into how to improve my setup afterwards and it seems cheap and straightforward to make some big steps up in quality, though I’m still not completely sold on the format. 1 hour is a long time to commit to watching a video!

I’m going to produce a few small (non-live) videos to go along with the most popular pages on the site (notably Singletons and Background threads) and post those at the top of the page in a new That Thing in Swift youtube account, we’ll see how many views and subscribers that gets us. Then we’ll figure out where to go from there!

Lastly on the project updates, I realized that I know very little about how Solar cell research actually produce power. I get the photoelectric/voltaic effect but there’s a big difference between knowing that physical process versus how to turn it into functioning electricity. I’m keeping notes on everything I learn and I’ll hopefully wrap it up in some regular posts here.

Treat has finally made its way to the archived pile. I still think the core idea is awesome, there’s just no great hook for why you want to use it in the first place. Surprisingly (to me), the fact that people use gift cards is not enough to justify the same people wanting to do the same thing (but better, obviously) on their phone. It’s still in the back of my mind and there are a few small things I want to do work on to feel out some assumptions but it’s not going to happen for a few months.

A big takeaway from the project is that I got wrapped up in this Startup culture and let those norms decide how I would build a company.

One thing that has really resonated with me since then has been this great, simple Startup Growth Calculator from @tlbtlbtlb. Here’s a shot of the model that makes sense with how I work:

The good Startup Growth chart

All the things on this chart are concrete and achievable. Spend $100 weekly? That’s way more than I usually spend to acquire users, initial investment for an engineer on their own project is mostly time. $45 weekly revenue? That might not be achievable on day 1 but it’s a low target that should be easy to hit if your project has any merit at all (no, I don’t want to make a “free” product where the customers are actually advertisers). 3% growth? That’s minuscule for a startup.

Let’s push the “profitability” back by 6 months since you’re not making $45 a week immediately. That’s still a single year to get to profitability, incredible. I know this is a simplistic model and you’ll probably want to grow faster by reinvesting or getting new investment during this time scales but this is what my year 1 plan should be for any project that I want to make money on. And your starting investment in the project is time and not quite $2000, not even enough to get your halfway through this month’s rent in SF.

The best part is all the way on the right (outside the frame of this screenshot) where it says “$100M/yr revenue at year 7”. If you’re on track for $100M/yr, there’s nothing that can stop you.

Leap Day Updates

I wanted to get one more update in before the end of February, luckily we have a leap day this year!

I’m planning a live coding session for That Thing in Swift on Wednesday this week. I still have a few technical things to work out but I’m not committed to it being perfect, just good enough to get a sense of how much interest there is. I think it could be pretty cool.

I need to do some more thinking about how to test theories related to Boundary Layer in the very early stage. I did a bit of research into creating wind tunnels to do proper experimentation and - surprise - there are super shitty versions made for high school science fairs and then models created for final Masters theses. Insert scathing comment on the lack of curiosity in the modern human. I’m still too early to build anything but it’s good to know I can at least create a mid-range experimental rig that essentially doesn’t exist yet.

I neglected to mention another new project last time, Deep Birding , which is an attempt to play with machine learning by classifying the many birds that come to eat seed in the backyard. I think it’ll be fairly straightforward to identify bird type given enough training data but I’d really like to be able to identify individuals. I’m not expecting magic, I could identify individual birds myself given enough time and footage but it would be pretty impressive to be able to do it with machine learning.

Two things stand out as difficult: (1) lots of the example image classifiers available already have the images cropped to the same small size for testing. We’ll need to preprocess frames, looking for areas that have birds and then cropping to our processing size. (2) If we want enough detail to identify individuals, that means a relatively large bird image size. Convolutional processing is super fast with small images and might be prohibitively slow with images large enough to contain enough detail.

I’ve already collected 20 minutes of 1080p video with a few different bird species pecking around. I’m still working through the TensorFlow examples and figuring out how everything works so results are still a ways off.

On par for success

Success. Well, on par for success.

I’ve archived both PermissionScope and Pantry after finishing the maintenance releases I aimed to complete. I feel great not having those two things on my plate and I’m confident that I can deflect any new changes that might come through until a later date.

I don’t have a concrete plan for the next improvement to That Thing in Swift yet but I’m thinking about a few ideas. First, the community really enjoyed the post about writing your own API clients so I’m considering something along the same lines: a dependency that lots of people use that can be replaced with a small amount of good Swift. I like the idea because it’s different than what most Swift blogs write about - usually just an introduction to using x in Swift - and it requires a bit of creativity. I’d like to experiment with a few other ideas here, maybe some livecoding/video that incorporates actual code snippets that people can copy or follow along with.

Every time I think about finishing the work required for another Treat release, I keep coming back to the sending issue. Part of the reason that it didn’t work out is that there was no compelling reason to send a treat to a friend, even I didn’t do it that often. I’m hesitant to put more work into a part of the project that won’t fix a core issue. I still consider the sending issue every once in a while, I’m looking for a simple hook that could change the reasons for sending to something meaningful which would get me working on all those pieces again.

The last few posts have been new ideas! so let’s review: Pay by Tray is still an interesting idea but unless a restaurant owner who was really psyched about it fell into my lap, I probably won’t go anywhere with it. If that happens in the near future, I’ve already done enough thinking on it to ramp back up quickly enough. Successful projects (of this scale) require deep connections or lots of luck. I don’t have the former so I’ll keep it in the back of my head in case the latter appears.

Watercooler still fixes a problem I have (not enough social interaction while remote contracting) but I came up with a slightly different plan to tackle this for the time being which is probably better for me right now. This issue will probably be more prevalent in the future as remote work is more common and I still think it’s an interesting problem to solve (in an interesting way, not necessarily this one). In the meantime, you can sort of force this by just jumping on a random blab when you’re bored. It seems like most of the people there are in various states of boredom anyway.

I briefly looked into the tech I would need to build a stream of conversations from your friends on Twitter again. I came back to the idea after a while because it’s sticking in my head like a thing that might be a fun way to see what’s going on just outside of your social circle. And it seems like a thing that could be popular. I took a stab at it with pure js the other day but it looks like I will have to do some sort of oauth implementation which is more complicated than I wanted to get into. I then jumped over to Go to see if I could figure out the API calls needed to discover conversations in the first place but I ended up not wanting to spend a couple hours just getting back up to speed with Go. If I’m only interested in proving that it’s an interesting idea at the moment, I might as well do a quick swift implementation on the phone or iPad since that will be the least language friction (but UI still required).

I think I covered this before, but I’ll reiterate that ideas are super cheap and saying “No” (or just letting things die in this case) is not something that I’m concerned about. I like looking back on all this regardless of success.

Projects and Watercoolers

Many little changes since last time. I resolved the last remaining PermissionScope issue and the release went out just in time to get back on the Swift trending list on Github. 36 ⭐️ so far today, just passed 2000 overall! I would like to move this project to “archived” and defer any new work until later - for me, this is easy. I still have to figure out how to communicate this effectively to new PRs that come in 😬

I finished off a new post for That Thing in Swift regarding building your own API clients in Swift. It was definitely a hit, lots of tweets and talk about it which gave the site its best day ever (just over 2k uniques and almost 3k views 📈). Most of the traffic on a normal day is from organic search which increases naturally as more people learn Swift but my goal is to actually hit more first page search terms. It remains to be seen if just writing more posts == more search traffic.

I did a bunch more work getting Try Again category pages working. Now if you click on a project in a post, you’ll see all posts mentioning that project. I really think the color coded project names help a lot with this! I can scan a bunch of posts and identify the paragraphs mentioning that project fairly easily.

Pantry had some new, good pull requests which I merged in. I’ll be setting up a new 0.3 release soon but I want get releases working via fastlane so making a new release isn’t such a pain. Prototype here, make sure everything works OK and then I can move the process to PermissionScope .

Lastly, a new idea: I realize (now, finally) that working from home has some serious drawbacks in terms of socialization. Maybe this seems obvious to you but I never really considered how much I enjoy miss meeting new people and hearing about their projects and sharing my own. There are lots of ways to accomplish this, I’m trying to figure out which one is right for me.

A Virtual Watercooler

One idea I’m playing with is a combination of pomodoro timer and video chat. An app of some sort that times you for 30, 60 or 90 minutes of work and then connects you with someone else taking a break from work for 5 minutes of chat about what you’re working on and how it’s going, that sort of thing.

I actually like the idea that you’d run into the same chatters a few times over the course of a week, it gives you an opportunity to learn about the process other people are going through. It behaves a bit like a water cooler where you have a chance to run into a finite set of people but which one is semi-random.

Still thinking about how to set up a minimal test case without too much engineering. Probably just a website to start!

First week wrap up

Plenty of progress this week but no luck with paring down the list of “active” items to the ideal 2-3.

I cleaned up the rest of the potential items for a new PermissionScope release and made a change that I thought fixed the one remaining issue but it turns out not to be the case. Back to debug mode there.

I reviewed the one PR for Pantry and I’m just waiting for it to come back with some small changes before the 0.3 release is made. Still have not reached out to that contact about promotion though.

I did a little promotion for That Thing in Swift - unexpectedly, really - so some extra views early this week there. I got some positive feedback on a topic I started a couple weeks ago which I have a feeling will be relatively popular and well-shared. I will at least make progress on that post this week.

Mostly the beginning of this week was about catching up on some contract work. Seems like I’m ahead of the curve there at the moment so perhaps I’ll have more time to work on the tasks that I didn’t hit last week.

Definitely feeling the pressure to archive the VR Project , it’s stagnating a bit and I’m not quite sure where to go with it if I don’t have any contacts inside the sports organization that I’m aiming for.

I’m torn on if I should include interviewing as a separate project. It is definitely a big focus at the moment and takes up a good chunk of my time.

It’s sort of like a big meta-project: I’m talking to people about existing projects and new ones, trying to figure out what’s interesting and worth the time to dig into further. I’m fortunate enough to not be under pressure to pick something immediately and taking your time with job decisions is one way to have control over a process that is frequently out of your hands.

For now, it stays off the list.