Hi, I’m Sam

This is my blog. I also have a website thing.

Automating Simple Things

Posted on

Most of my projects contain a Rakefile with some common tasks. rake is Ruby’s tool for running tasks. It’s my tool of choice for little scripts, but you could of course do whatever you want. My friend Ayaka even did a talk on scripting with Swift!

Usually my scripts are for something tedious that can be easily automated. Here’s a few examples in my own projects:

Some of the most elaborate scripts I’ve written in projects have been to automate gathering dependencies. This can be complicated depending on your setup. My goal is always for someone that isn’t a developer to clone, run the command, open Xcode, and build. That may seem like overkill, but if you make it that easy, you make it that easy for yourself and teammates which saves a ton of time.

Continue reading →

Cancel Borderless Window

Posted on

I just spent the last hour trying to figure out why cancelOperation wasn’t getting called in an NSWindowController subclass. At first I tried performKeyEquivalent in the window controller or in a custom NSWindow subclass. That didn’t work. I then resorted to keyDown in the window subclass and that wasn’t getting called.

After a long while, I figured out that my window wasn’t becoming key even after I called makeKeyAndOrderFront. It turns out windows with borderless in the styleMask cannot become key by default. You can solve this with a tiny amount of code in a window subclass:

class MyWindow: NSWindow {
    override var canBecomeKey: Bool {
        return true
    }
}
Continue reading →

Share Confirmation

Posted on

Recently, I added some visual confirmation what something was shared with the system share sheet on iOS. For things like copy or save to camera roll, there isn't visual confirmation that it worked from the system.

At first I considered making my own share actions for this and disabling the system ones but that seemed like a lot of work for adding a simple “it worked” to the screen. Then I had this idea:

func share(_ sender: UIView) {
  let viewController = UIActivityViewController(activityItems: [image], applicationActivities: nil)
  viewController.completionWithItemsHandler = { [weak self] type, completed, _, _ in
    guard completed, let title = type?.rawValue else { return }

    // Check share type and show confirmation
    if title == "com.apple.UIKit.activity.CopyToPasteboard" {
      SVProgressHUD.showSuccess(withStatus: "Copied!")
      SVProgressHUD.dismiss(withDelay: 1)
    } else if title == "com.apple.UIKit.activity.SaveToCameraRoll" {
      SVProgressHUD.showSuccess(withStatus: "Saved!")
      SVProgressHUD.dismiss(withDelay: 1)
    }
  }

  if let presentationController = viewController.popoverPresentationController {
    presentationController.sourceView = sender
  }

  present(viewController, animated: true)
}
Continue reading →

Mic Setup

Posted on

I recently made a video mentioning my new mic setup and got a few questions about it. Instead of making a video that just mentions tons of links, I thought I'd write it up.

I use a Heil PR40 mic. I've used it for a few years now. It's a pretty great mic for making podcasts and screencasts. The boom arm for my desk is a Heil PL-2T. This is a great arm. I've seen it used with several other mics too. My mic is attached to the arm with a Heil PRSM-B Shockmount. I also have a Heil Windscreen on it to cut down on breath noise.

The arm mounts into my desk with a Heil DT-1 Flush Mount. I have a Mogami Gold Studio 6' XLR cable cable in the arm connected to the mic. I found 6' is just about the perfect length. There's a little extra to work with but not too much. I know the Mogami cables are pretty pricey. From what I've read, it's the only cables you can audibly hear a difference in quality. They're fine cables. Probably doesn't matter that much though.

Continue reading →