← Home Subscribe Replies Archive Reading Also on Micro.blog
  • Finally, Peace Returns to Hyrule

    I’d never beaten the original Legend of Zelda before. It’s a hell of a game. Really hard, too.

    WVW69iuMEjkuxhIyk3.jpeg

    Surprising open world games with a save feature never really caught on after it.

    → 12:07 AM, Dec 30
  • The "Why Am I Anxious?" Checklist

    I’ve come up with a list of things I should ask myself and do if I’m feeling anxious or antsy. Here it is:

    1. Did I not have any coffee today? Have some.
    2. Have I had too much coffee? Drink some water. Take a walk.
    3. Did I sleep not enough or too much? Keep working on that.
    4. Am I worried what someone is thinking of me? Talk to them.
    5. Am I worried about something I'm not doing? Stop worrying and do some of it.

    No matter what:

    1. Remember you're not stupid and people like you.
    2. Drink some water and take a walk.
    → 5:52 PM, Dec 14
  • Brent Harping on Swift Limitations

    Brent is harping on limitations you hit when trying to use protocol oriented programming in Swift:

    But these days we’re smarter: we use protocols. There’s no reason Folder and File should descend from the same class — they’re almost entirely different, and inheritance is a pain to deal with, so we use protocols instead. And we’re happy. It works great. Until you realize that, in Swift, you can’t do this.

    I hit something like this yesterday. So no, it’s not just him.

    → 4:25 PM, Dec 11
  • How John Zeratsky Became a Morning Person

    This post on Medium by John Zeratsky echoes a lot of what I’ve felt, and what I’m trying to get to. This part describes how I’ve been my entire life:

    It didn’t come naturally to me. When I had to wake up early—for a meeting, an event, or class—it was like the vignette above. I struggled to get out of bed. Often I barely made it to my engagement on time. And that rushed, zombie-like morning loomed over my day like a hangover.

    John also was motivated by the same thing I am though; the promise of how much more you can get done by being a morning person. Whether I like it or not, the world isn’t likely to adjust to my natural schedule, so if I want to get by in it, I need to figure out a way to change this about myself. Missing mornings – or being awake but useless for them – means I’m missing a couple hours every day I could be participating in the world, or doing something good for myself. The best part is that it worked for John, and he’s kept it up:

    It worked. I traded a typical night-owl schedule—up ’til midnight or later, staring at a screen, writing, doing design work, coding—for an uncommon routine where I go to sleep early, wake up early, and get a lot of work done in those quiet morning hours.

    If he did it, maybe I’m not hopeless.

    → 2:06 PM, Dec 11
  • Spreadsheets Are Cool

    I’m not accountant, I don’t financially analyzing anything besides my personal budget, and I have almost no occasion in my work to ever use one, but I get excited about pretty much any time I can think of a use for a spreadsheet. There’s a lot of times where a spreadsheet can replace an app made to do the same thing. A lot of the time the spreadsheet will be even better, because it’ll be customized to just the fields you need. Plus Numbers/Google/Office all sync now – which isn’t at all a given with apps. And if something I’m tracking becomes cumbersome with a spreadsheet, it could turn into a great proof of concept for my next app.

    Let me give some examples.

    Sleep Journal

    As I wrote about in my last post, I’m currently in the process of trying to fix my sleep schedule and become more of a morning person. The way I’m tracking that is with a Fitbit Flex I wear to bed and a spreadsheet that I keep in Numbers. Fitbit tracks most the data I need, but not everything (what time I put on my blue blocking glasses and misc notes). Also, leaving that data locked into Fitbit doesn’t help me if I want to analyze my habits overtime with charts, or if I want to share that data (in a future blog post, for example).

    Commute Journal

    To get from my apartment in the Sunset District (also known as Mars) to downtown San Francisco and back, there’s a few routes I can take, and I’d like to know which one is the best. What I’ve started doing is tracking my trips by using the iOS clock app and marking laps at points I want to track (when I get on/off public transit). This way I can track the average time each route took, how much time I spent walking versus public transit, and maybe if there’s a way to combine those segments differently to cut a few minutes off my travel time.

    Car MPG & Maintenance

    I don’t currently have a car, but I do have an RV. I track what kind of mileage I’m getting, and also when there’s maintenance done. When you’re driving around in a 27 year old vehicle, it’s best to stay on top of these things. If I see my gas mileage tank, I start to think there might be something up, and I take it in to get looked at before anything gets too bad. I used to use the app Gas Cubby for the same thing, but since it stopped being updated, Numbers has done the job just as well.

    → 1:31 PM, Dec 11
  • Fixing My Messed Up Sleep Schedule

    Sleep has always been a huge problem for me. My issue isn’t that I don’t sleep enough, it’s that I can’t sleep at night or wake up. If you don’t have a problem like this, that might sound stupid, but I’ve been like this as long as I can remember (at least since junior high). I’ve talked to a doctor before who thought I might have delayed sleep phase disorder, but haven’t gone so far as to do a sleep study.

    Things I’ve tried are a sunrise alarm clock, a blue light I shine on my face in the morning, and over the counter sleep aids. They all helped somewhere between not at all and marginally. Last night, I tried something new: blue light blocking glasses. During the day, blue light from the sun tells your body it’s time to be awake and you start producing serotonin. At night the lack of that light tells your body to produce melatonin, which makes you sleepy. That’s what directs your circadian rhythm, which makes total sense evolutionarily. Unfortunately we didn’t evolve with televisions, household lights, and iPhone’s that produce that same kind of light in abundance. If you’re around any of those things, your body won’t produce melatonin and it will be harder to fall asleep (I’m sure this affects some people more than others). This web page explains it in more detail if you don’t want to just take my word for it. Anyway, I bought some glasses block blue light that I can wear in the evening to my body does the right things.

    They are also the nerdiest looking things I have ever seen:

    Blue light glasses

    Never having company over in the evening again aside, the first night appears to have been a success. I started wearing them when I got home from work and was able to fall asleep earlier (surprising since I only woke up 11 hours before), and woke up the earliest I have in months (an hour before my alarm!) feeling fine. It would be sort of amazing if a $20 pair of yellow glasses really does that much to solve a problem that’s been ongoing for most of my life. My plan is to track my sleep (I love any excuse to make a spreadsheet) for the next couple of weeks and report back with the results. I also bought a new bulb for my sunrise alarm clock, so I’m going to start using that again, and I’m going to stop drinking coffee except in the morning.

    Excited to see how this goes.

    → 3:41 PM, Dec 4
  • Cultural and Unconscious Biases

    This post by eevee is specifically talking about video games, but I think a lot of it is a good characterization of discriminating behaviors, why they persist, and what people who don’t get it (saying “other side” feels wrong), don’t get. This part kind of jumped out at me:

    There are, of course, also cultural biases that tip the scales towards people who are white or male or cis or whatever. But even if you don’t buy that, it shouldn’t be a stretch to think that there really are overt cartoon sexists out there in the world who are just not vocal about it. Some of them might be judges or managers or politicians. Some of them might even make video games. You might think of them as weighted coins that always come up heads. And therein lies the problem. You have 100 coins. You flip all of them. 60 come up heads. How many are weighted? 10, you might think. And you’d be wrong, because 60 heads is entirely possible, so you can’t actually be sure any of them are weighted! But there’s a much bigger problem: which 10?

    I pretty much refuse to believe there is any such thing as a “meritocracy”, because even people with good intentions have unconscious biases. Good intentions (we just want to hire the most qualified candidate) aren’t enough to do the right thing. You need to actively and conscientiously work against unconscious feelings that you may have never even been aware exist. It’s really hard and it takes a lot of practice.

    → 2:37 PM, Dec 4
  • A Reasonable Take on Gun Control

    This article on Huffington Post lays out what I think is an extremely a reasonable take on gun control in the US, with action steps that don’t sound like they should be impossible (but probably are).

    Here's some common sense for you. I want gun ownership to be as boring and annoying as car ownership. I want you to go to some Department of Weapons and sit for hours. I want folks who own guns to prove their skill, their mental and physical health, and to be licensed and reviewed over the years just as happens with our driver's licenses. You earn the right to own and drive a vehicle; earn the right to own and use a gun.

    I take Adderall as medication for ADD. It works for me. Getting ahold of it was a pain in the ass, not just the first time, but every time. First I had to find a doctor who would prescribe it to me, which wasn’t easy, and once I did explain what I was feeling in such a way where they wouldn’t think I was looking to score (I tried non-stimulant medication first. it didn’t work). Then I had to get my insurance to pay for it. Having achieved those goals, I now have to take a physical prescription to the pharmacy every month. Also my doctor is in Oregon, and I’m in California. Since Adderall is a controlled substance, they won’t fill my prescription here. I fly to Oregon once a month to fill my prescription because that’s easier than going through the whole process of finding a doctor again.

    There’s some potential for abuse of the medication I take (although much less since I take the extended release version). Anyone probably shouldn’t be able to just buy it over the counter. But for fucks sake, why is it easier to get a gun – who’s only functional purpose is to take another persons life – than for me to get medication that helps me stay productive and focused and was prescribed by a doctor?

    → 6:21 PM, Dec 3
  • Quickies for NSString

    A list of what the title says from Mark Dalrymple. I’m sure he created this years ago, but it’s new to me. I’m considering putting this in my favorites bar. As an aside; it’s sort of amazing 8 years in how often I find myself reading the docs for NSString.

    → 6:13 PM, Dec 1
  • Brent's Post About Social Anxiety

    Brent wrote a post that pretty much describes how I’ve felt my whole life. This part grabbed me:

    I hated school even through my couple years in college. And here’s what that kindergartener’s fear turned into: the conviction that most people are likable, but that somehow I’m marked, and people can tell instantly, just by looking, that I’m not likable.

    This feeling of being marked, of being obviously unlikable in some fundamental and obvious-to-everyone way, persisted into my early 20s.

    The difference for me is that this feeling has continued to persist (I’m 30). There’s a few assumptions I’ve held onto for long enough that I don’t even have to think about them consciously:

    • None of my friends like me as much as I like them.
    • Others have a strong sense there's something wrong with me.
    • If I ever really needed help, I'd be on my own because no one else deep down really cares what happens to me.

    If someone as instantly likable and personable as Brent could have some of those same feelings, then maybe I’m not really all that bad either? I can’t believe I’m actually sharing this with other people.

    → 1:32 PM, Oct 23
  • Overcast 2

    Overcast 2 by Marco Arment is now available on the App Store. I’m sure I use Overcast more than any other app on my iPhone, and I think people are going to really dig the new streaming feature. Since I think I’m one of the people for whom streaming isn’t really a big deal, my favorite feature is the ability to support Overcast by actively (and optionally) patronizing the app. None of the features are locked behind a paywall anymore, if you like the app, give what you think it’s worth. I’ve already done it.

    Marco explains why he went this way on his blog:

    80% of my customers were using an inferior app. The limited, locked version of Overcast without the purchase sure wasn’t the version I used, it wasn’t a great experience, and it wasn’t my best work. With Overcast 2.0, I’ve changed that by unlocking everything, for everyone, for free. I’d rather have you using Overcast for free than not using it at all, and I want everyone to be using the good version of Overcast.
    → 3:56 PM, Oct 12
  • Auto-Incrementing Build Number Script

    I got this from somewhere I can’t remember. I’ve been using it a while and it works very well. I have it setup so that it will happen whenever I archive a new build for beta or release. You’ll want to change those configuration names to whatever your configuration names are in your project.

    if [ "${CONFIGURATION}" = "Release" ] || [ "${CONFIGURATION}" = "Ad Hoc" ]; then
        buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
        buildNumber=$(($buildNumber + 1))
        /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
    fi
    

    Add a “run script” phase to your targets build phases with this script and put it just below “Link Binary With Libraries”.

    → 1:22 PM, Oct 9
  • Functions as Factories

    Cocoa at Tumblr:

    Factories are a fairly well understood design pattern in software development. The benefits of using factories include:
    1. Abstracting constructors away from clients.
    2. Encapsulating data that clients do not need to know about.
    3. Allowing for more testable code by enforcing the idea of passing objects into initializers instead of referencing singletons directly.
    This post will show the power of a few Swift features as well as of first­-class functions.
    → 3:36 PM, Oct 8
  • What's new in OS X El Capitan

    I was asking on Twitter if there was anywhere to get an overview of what’s new in El Capitan that isn’t book length. My friend Andrew graciously pointed out that in fact there is… and it’s Apple’s own marketing page for the release. Duh.

    → 4:50 PM, Sep 30
  • Dynamically Sized Table View Header or Footer Using Auto Layout

    I’m trying to support Dynamic Type everywhere I can in my new app. Auto Layout and self sizing table view cells (buggy as they are) makes that a lot easier for the most part. Still, there’s other places that just setting up constraints and changing the font size of a label isn’t enough. The one I’ve just dealt with is a table view header (UITableView().tableHeaderView) with text in it. If I do nothing but set up my constraints and set the header view, the font size changing will just cause extra space to appear or my text to get cut off.

    The solution was to override UIViewController().viewDidLayoutSubviews(), get the proper size of the header view based on it’s constraints, set the frame on the header, and reset it as the table header view.

    It took me a little while to figure this out, so here’s what I did:

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    
        // Dynamic sizing for the header view
        if let headerView = tableView.tableHeaderView {
            let height = headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
            var headerFrame = headerView.frame
    
            // If we don't have this check, viewDidLayoutSubviews() will get
            // repeatedly, causing the app to hang.
            if height != headerFrame.size.height {
                headerFrame.size.height = height
                headerView.frame = headerFrame
                tableView.tableHeaderView = headerView
            }
        }
    }
    
    → 4:26 PM, Sep 29
  • You Can Do This In Swift

    This isn’t a hidden feature or anything – it’s just how optional binding works – but I guess what I didn’t get before was that this (responseObject’s type is AnyObject):

    func fetchUserInfoWithCompletion(completion: (ErrorType?, [String: AnyObject])->()) {
        executeGETRequestForURL(userInfoURL) { error, responseObject in
    
            guard let dictionary = responseObject as [String: AnyObject], fooInfo = dictionary["foo"] {
                completion(error)
            }
    
            completion(nil, fooInfo)
        }
    }
    

    Could become:

    func fetchUserInfoWithCompletion(completion: (ErrorType?, [String: AnyObject])->()) {
        executeGETRequestForURL(userInfoURL) { error, responseObject in
            completion(error, responseObject?["foo"] as? [String: AnyObject])
        }
    }
    

    So much better. So much code to delete now. Put this under the category of “things I can’t believe I didn’t get until now.”

    → 5:01 PM, Sep 23
  • The Growing iOS SDK

    David Smith writes about how much the iOS SDK has grown over time. One thing that was interesting is that more “SDK elements” were added in iOS 8 than iPhone OS 2 (which is crazy).

    The last paragraph echoes something I’ve felt for a while:

    There was a time when I felt like I knew my way around pretty much every non-game SDK available on iOS. Now I often find myself stumbling across frameworks that are completely foreign to me, which is both kind of exciting but also extremely daunting.

    I suppose that’s normal. I can’t tell you how often I find out about a “new” API only to realize it’s been around since iOS 5.

    → 3:03 PM, Sep 3
  • NetNewsWire 4

    The best is back! The folks at Black Pixel have shipped NetNewsWire 4 for Mac and iOS. I’ve already bought it from the App Store and it looks great.

    Congratulations to all of my friends at Black Pixel for getting this out the door. It’s been a long road, and I’m glad to see their work paying off.

    → 2:54 PM, Sep 3
  • Follow Me on Twitch

    I’ve been streaming games I’m playing on Twitch a fair amount lately. If you’re into that sort of thing, you can follow me there.

    → 3:00 PM, Aug 31
  • Acorn 5

    It’s a couple of days back now, but Flying Meat has released a new version of their fantastic image editor: Acorn. I’ve used Acorn for my work and personal projects since version 1.0 in 2008, and it’s incredible to see how far it’s come while still keeping the simplicity that made it so appealing in that first version.

    Gus is a friend – so don’t tell him I said this – but to me he’s always been the epitome of the one person indie who’s both a world class developer and also a fantastic designer. Check it out.

    → 12:37 PM, Aug 25
  • UITableView Extension to Deselect Selected Row

    Nothing fancy. Just a tiny little extension method that makes doing this in Swift slightly nicer.

    import UIKit
    
    public extension UITableView {
    
        public func deselectSelectedRowAnimated(animated: Bool) {
            if let indexPath = indexPathForSelectedRow() {
                deselectRowAtIndexPath(indexPath, animated: animated)
            }
        }
    
    }
    
    → 3:50 PM, Jul 23
  • Answers Events by Crashlytics

    I’ve used Crashlytics for beta testing my new app, including their lightweight analytics-thing Answers. It’s cool in that it shows you the most relevant data, but I was never going to be able to sell it as a replacement for Flurry or Google Analytics (which I loathe). Today they announced Answers can do event tracking, and on top of that it looks fabulous. The web UI makes it really easy to see and add the most common kinds of things I’d actually want to track, and the iOS SDK looks like it was made by people who have written Cocoa before.

    Hopefully Twitter can keep from fucking this up.

    → 2:36 PM, Jul 23
  • Fix Broken Swipe to Go Back With Hidden Navigation Bar

    Occasionally you need to a show a view controller as part of a UINavigationController stack where you want the navigation bar hidden. Unfortunately, hiding the navigation bar breaks the swipe right to go back feature.

    You can fix it by doing this in your viewDidLoad method:

    navigationController?.setNavigationBarHidden(true, animated: true)
    navigationController?.interactivePopGestureRecognizer.delegate = self
    → 6:00 PM, Jul 22
  • Swift NSManagedObjectContext Extension to Delete All Core Data Objects

    I made this NSManagedObjectContext extension so that I could delete all of a users data when they log out of the app I’m writing. The alternative was to delete the sqlite file itself and reinitialize my Core Data stack, but that seemed potentially more problematic and less safe.

    The two instance methods on NSManagedObjectContext for deleting objects are:

    • func deleteAllObjects(error: NSErrorPointer)
      • Delete all objects in a context. Bails out and returns an error if there's any problems.
    • func deleteAllObjectsForEntity(entity: NSEntityDescription, error: NSErrorPointer)
      • Delete all objects of an entity type. Bails out and returns if there's an error.

    I also included a convenience initializer for creating a new context with a parent. The way I use the deletion methods would be to create a private queue child context, block out the UI while this is going on with an activity indicator or something, and then call deleteAllObjects(_:) on the child. If there’s an error, you can just throw away the child context, and otherwise save your main context and commit it back to the store. Like this:

        func deleteEverything() {
            let mainContext = self.managedObjectContext
            let workerContext = NSManagedObjectContext(parentContext: mainContext, concurrencyType: .PrivateQueueConcurrencyType)
    
            workerContext.performBlock {
                var error: NSError?
                workerContext.deleteAllObjects(&error)
    
                if error == nil {
                    mainContext.performBlockAndWait {
                        mainContext.save(&error)
                    }
                }
    
                if let error = error {
                    println("Error deleting all objects: (error)")
                }
            }
        }
    

    Here’s the code for the extension:

    https://gist.github.com/collindonnell/4d082298a86e0f1d1a51.js

    → 4:16 PM, Jul 22
  • Kourosh Dini Talks GTD and OmniFocus on Mac Power Users

    Kourosh Dini wrote the book everyone using OmniFocus should read called Creating Flow With OmniFocus. Seriously, I can’t recommend it enough. Another thing I recommend is listening to the most recent episode of Mac Power Users where they have Kourosh on. He talks about how he does GTD, and a little OmniFocus specific stuff too. I’ve kind of fallen off the wagon a bit lately, and this has made me decide to get back on and get my system in order. I should stick a task in my inbox to remind me to blog about that.

    → 4:13 PM, Jun 24
  • Daniel Jalkut on Apple News

    Apple News And The Open Web | Bitsplitting.org:

    I’m optimistic that Apple’s News app will be a strike against centralized services such as Medium, Twitter, and Facebook. A strike against signing over content to a 3rd party mediator for the sake of a greater chance at connecting to an audience. Apple may not be the world’s best technology company when it comes to either storing data or building a social network around it, but they are damned good at building a captive audience of delighted users who trust the company to provide access to a variety of 3rd party content.

    Calling iMessage an impressive social network is a bit of a stretch considering my messages still sync across devices in seemingly any order. I don’t know if the News app is going to pull anyone who’s dedicated to RSS away from it, but it might be great for those who aren’t.

    → 5:42 PM, Jun 15
  • The Kinect is dead

    Ben Kuchera writing for Polygon:

    The real story though, or at least the lack of story, is that the Kinect is well and truly dead.

    When the Xbox One launched you couldn’t buy one without a Kinect. Microsoft knocked it out of the park with their E3 announcements today, but missing was any mention of the Kinect. They’re also dropping the price on the Xbox One bundles which don’t come with it, but not on the ones that do. I don’t know if “dead” is the right word, but it’s certainly on life support.

    Having used an Xbox One both with and without a Kinect, I think it’s kind of a shame that the Kinect hasn’t done better. Without it the Xbox interface is kind of hard to get around. With it, it’s great. I use the voice commands to pause video, raise or lower volume, use the snap feature, and go to apps all the time.

    I don’t see how anyone who’s used an Xbox One both ways could not prefer having a Kinect. That’s not enough though. It’s still not strictly necessary, expensive, and doesn’t make the games themselves any better (which is the reason people buy game consoles). Microsoft had a cool thing that they did a bad job making a case for, and now it’ll probably just kind of fade away until it’s axed in the next console revision.

    Oh well. We’ll always have this bullshit vaporware promotional video of the first Kinect from 2009:

    [youtube www.youtube.com/watch

    → 5:36 PM, Jun 15
  • Core Data Programming Guide Updated

    I’ve used Core Data in most apps I’ve written since 2009, and I’ve felt for a long time is that the documentation was pretty lacking and out of date in a lot of places. I haven’t read it yet, but Apple has updated the Core Data Programming Guide today to “reflect current best practices and APIs.” I’m hopeful that things are getting a little better, but there’s apparently no reference to Swift, so, who knows.

    → 4:17 PM, Jun 9
  • Tools and Toys

    Tools and Toys is a website run by the incomparable Shawn Blanc which is sort of like if The Wirecutter and a regular blog had a baby. They publish just the right amount of content that you can keep it in RSS without getting overwhelmed while still getting a lot out of it.

    → 3:46 PM, Jun 9
  • Cool Nylon Apple Watch Band

    These nylon bands from Monowear look pretty sweet. They remind me a lot of the bands I used to wear with my Timex. The site doesn’t say if they’re using the Apple lugs or not, but if they (otherwise I’d be scared of causing some kind of damage) are I’ll definitely get one.

    Monowear watch band

    → 2:50 PM, Jun 2
  • Optional Punctuation in Swift

    All of the punctuation in Swift looked pretty weird to me until recently, but now that I get it, I’ve really learned to appreciate how great the syntax actually is. The way I think of it is this: if you’re using ?, you’re asking a question, and when you use ! you’re asserting that you already have the answer. Of course, for the second case, you need do need to be sure or your app will blow up.

    So, for example:

    Asking a Question

    if let foo = dictionary[“foo”] as? String { … }

    Is the value for the key “foo” a string? If so, assign it to the constant foo.

    delegate?.objectDidSomething(self)

    Do I have a delegate, and can it respond to objectDidSomething:?

    Making an Assertion

    managedObjectContext!.save(&error)

    I know that managedObjectContext is not nil.

    let foo = bar as! String

    I know bar is a string, so nothing will go wrong casting it.

    → 2:28 PM, May 5
  • A Few Apple Watch Thoughts

    • Scratches show up on stainless steel easier than I expected. Thankfully it's pretty easy to polish them out.
    • WatchKit apps have a lot better performance than I expected. Based on Twitter, I thought they'd be pretty much unusable.
    • Parts of the UI are a bit laggy, but I suspect that'll be fixed in a software update.
    • The screen switching on automatically really only works when you're standing with your arms at your side.
    • If I don't wear the band fairly tightly, I miss taps.
    • I love not having everyone around me know when I get a notification.
    • Not having to fish my phone out of my pocket to find out why it's buzzing is just as great as I hoped it would be.
    • I would really like a way to know who in my address book has an Apple Watch.
    → 5:31 PM, May 4
  • Real-World Testing with XCTest

    Kind of old now, but I really like this post from the August issue of objc.io. The two things that stood out for me was that it used XCTest instead of a third party testing framework, and that it gives real examples of how to approach which tests to write. I’ve been totally totally on board with the idea of unit testing for a long time, but my biggest hurdle has always been knowing what to test. Thinking of what tests to write in terms of Given-When-Then pattern they go over has given me some new ideas.

    → 3:07 PM, Apr 6
  • Trying Swift Again

    On my most recent project, I decided to try going Swift from the start. I did the same thing when I started working on a rewrite of the Lovely app around the end of last summer, but found the tools too immature then. This time I’ve spent about a week with it, and everything seems is working out fine (so far). I’ve tried to keep up reading about the language itself, so the syntax hasn’t held me back much. One difference between now and the last time I really dove into Swift is that either something in my brain has clicked regarding optionals, or the language changed a bit over the past six months to make optionals align with my brain more. I still can’t what the debugger commands are.

    The other day on Twitter, I was part of a discussion comparing Swift to Objective-C. My feeling is that Swift isn’t better, but some parts of it are delightful to me, and I like it. For example, method overloading in Swift is pretty great, and I’m looking forward to doing interesting things with enums. Better though? In some ways, but not in others. Colin Cornaby pointed out that the ease of dropping down to C in Objective-C comes up a lot, and that C++ compatibility is pretty much a requirement for a lot of apps. I think he’s right.

    The way I look at it is this: Objective-C didn’t have to be “broken” for Swift to be a great language. I don’t expect Objective-C to go anywhere in the near future, and that’s a good thing.

    → 2:04 PM, Apr 6
  • All the Zelda

    Over the last few months I’ve become a tiny bit obsessed with Zelda games. I’d never really played one before last summer, and now I want to play them all, except maybe “The Adventure of Link” because I hear it’s terrible. 

    Given that the hardware I have is a Wii U and a 3DS, there might be a few that I won’t be able to play, but I think I’ve collected all that I can. Maybe someone can let me know if I’m missing any though. 

    Here’s what I’ve acquired so far – new, used, or Virtual Console – broken up by platform it ass originally released for:

    NES

    • The Legend of Zelda (1986)

    SNES

    • A Link to the Past (1991)

    Gameboy

    • Link's Awakening (1993)

    Gameboy Color

    • Oracle of Ages (2001)
    • Oracle of Seasons (2001)

    Gameboy Advanced

    • The Minish Cap (2004)

    Wii

    • Twilight Princess (2006)
    • Skyward Sword (2011)

    DS

    • Phantom Hourglass (2007)
    • Spirit Tracks (2009)

    3DS

    • Ocarina of Time 3D (2011)
    • A Link Between Worlds (2013)
    • Majora’s Mask 3D (2015)

    Wii U

    • The Wind Waker HD (2013)

    My plan is to play them all in the order they were originally released in (not the date a remake was released), excluding the ones I’ve already beat. Now that I look at it though I’m realizing this is going to take forever. 

    → 4:03 PM, Mar 9
  • Idea for a Web App

    All of my experience writing web apps have been to learn or test an idea, or something that I decided wasn’t such a great idea after all. For a long time I’ve wanted to come up with something useful enough to want to publish, but simple enough that I thought I could get it done in a reasonable timeframe as my first project. I think I’ve thought of something.

    Neither Xbox Live, Nintendo Miiverse, or PlayStation Network gives you a way to find your Twitter/Facebook friends. What I’m thinking of doing is making a site (probably using Django) which lets you login with Twitter and/or Facebook, enter what someone would need to find you on any of those gaming networks, and then use that information to find your friends who’ve done the same on the site.

    I’m imagining that as far as web apps go, this is a pretty simple one. In my mind it’s just social login, a form to enter your Xbox/Miiverse/PSN usernames, some API calls to get your friend lists, and some database queries to match it up to users of the site. Am I missing anything here?

    → 8:11 PM, Mar 2
  • My Everything Through the Xbox One Setup

    I haven’t posted in a while due to a bunch of reasons, and I’d like to get into a rhythm again. I thought I’d start by sharing the kind of unique way I have my media stuff running through and Xbox One.

    I’ve played a bunch of games on the Xbox since I got it in November – and a bunch of them have been great. But the Kinect and HDMI in are the unique part I wanted to mention. My set up is that I have a Kinivio HDMI switcher with a TiVo, Apple TV, and Wii U going into it, and the switchers output plugged into the Xbox. The Xbox can control be setup to control TV functions, and with the Kinect it can do those with voice commands (“volume up/down”, “mute”, “pause”, etc). Since I have everything running through my Xbox, I can keep using those commands with any of my other devices.

    Having a bunch of things running through this specific HDMI switcher works especially well because it automatically switcher to any input that start getting a new signal, so I rarely have to manually switch inputs.

    The only downside is that I have to have my Xbox One on to use anything else, but in practice that hasn’t been annoying at all.

    → 6:09 PM, Mar 2
  • RSS
  • JSON Feed
  • Micro.blog