Marc Schwieterman

Infinity and Beyond: Count + 1

3 minute read Published:

This is a follow up post to Infinity and Beyond: Introduction.

The “Count + 1” approach pads the row count by one and uses that extra row to display loading and error information. While one of the simplest implementations, it also has one of the worst user experiences.

Infinity and Beyond: Introduction

5 minute read Published:

I recently had to implement infinite scrolling in an iOS app. If you’re not familiar with infinite scrolling, it’s an alternative to pagination, where instead of having the user explicitly do something to advance to the next page, new content is lazily loaded as the user nears the end of the currently visible content. This pattern is often used on the web for social media sites, where its main goal is to increase engagement. If you don’t have to click on a “next” button, it’s much easier for you to keep consuming content.

The often slow or unreliable networks that mobile devices operate on make it even more difficult to implement infinite scrolling well. You can’t provide a seamless transition to the next batch of data if the network isn’t available when you need it, or if it takes several seconds to retrieve the data you need. This post will outline a variety of considerations, along with a brief overview of two general implementation approaches.

Mobile CI in 2018

5 minute read Published:

It’s been a couple years since I looked at the options for Mobile Continuous Integration (CI) for iOS apps. Last time I did this, I decided on BuddyBuild, who has since been bought by Apple. Unfortunately BuddyBuild is no longer accepting new customers, and they discontinued free plans and Android support in March of 2018. I hope this means that Apple will offer their own hosted CI solution soon, and with any luck it will go as well as the acquisition of TestFlight did. There was no news at this year’s WWDC, so for now we must find something else.


4 minute read Published:

I’ve been using a second generation MacBook for a little over a year now, and in many ways I love it. The performance is good enough most of the time, and the portability has helped me get a lot more done because of how easy it is to carry the MacBook and use it in a variety of places.

All that said, I had enough performance and stability issues that I was eager to upgrade when the third generation model was announced at WWDC. While I have no issues upgrading my iPhone every year, it’s been very unusual for me to want to upgrade a Mac that often. I decided to try the MacBook Escape1 alongside the latest MacBook because I want to be sure I’ll still be happy with my Mac this time next year.

Modelines in Git Commit Messages

1 minute read Published:

I’ve been cleaning up my Vim config this week, and I noticed some strange errors while doing an interactive rebase in my dotfiles repository.

Error detected while processing modelines:
line    1:
E518: Unknown option: <some text from the first commit message> 

Return of the Daemon

1 minute read Published:

I’ve been enjoying having the new Apple Music service in iTunes quite a bit, but one thing has been driving me crazy: the keyboard controls don’t work anymore. Except they do.

The Initiative

1 minute read Published:

My friend Bill and I have been working on a podcast about learning iOS development, and it’s finally here. We recorded several episodes before we figured out enough of the recording and hosting process to release anything, so there’s already a decent backlog. New episodes should continue to come out every Friday.

Check it out at The Initiative.

Bypass VPN by Hostname

3 minute read Published:

If you run VPN on your router, you may have had cases where you want Internet traffic to bypass the VPN. Most solutions I’ve found use some form of a script originally found on LinksysInfo. However these approaches are IP based, which can be a problem if those IPs change, or if the service you’re accessing uses a CDN. If your router is running firmware that supports ipset, you can use dnsmasq and iptables to solve this problem.

Testing in the OSX Sandbox

2 minute read Published:

If you’re running Application Unit Tests, and have just enabled entitlements, you will immediately be greeted with an error similar to the following.

RubyMotion Functional Tests with Storyboards

2 minute read Published:

If you’ve been using RubyMotion, you probably noticed that some new testing features were released today. The video in the announcment post and the documentation are pretty good, so I’m just going to share a few things that I had to do to get things working.