The Rise and Fall of Communication Mediums

Brent Simmons:

My blog’s older than Twitter and Facebook, and it will outlive them. It has seen Flickr explode and then fade. It’s seen Google Wave and Google Reader come and go, and it’ll still be here as Google Plus fades. When Medium and Tumblr are gone, my blog will be here.

The things that will last on the internet are not owned. Plain old websites, blogs, RSS, irc, email.

Marco Arment:

This is why I’m still championing blogs, RSS, and using your own domain even though supposedly “everyone” has moved to social networks.

I’m very, very glad I started blogging 7 years ago.  I started out just wanting to help people. I’ve continued posting code both for tutorial purposes and to work through my own problems. At some times it’s been a voice for me, and I’ve dabbled in commentary.  Facebook is older than this blog, but I’m fairly close to Twitter.  I never thought we’d see the day when Google Reader would shut down. These days Google doesn’t surprise me anymore. Which, should say something. I was a HUGE Google fanboy. Since moving off blogger, I’ve managed the servers and software that run this blog. I plan on being around for a long time. It’s too much fun to stop

Podcast Reruns

Last year, I had been plowing through old episodes of a few Tech podcasts. I was able to get through all of Developing Perspective (they are short) and was working on Build and Analyze.  I’m halfway-ish through B&A, but my listening has died off in leu of new episodes of other shows.

I’ve missed listening to it.  The reason it dropped of is playlist related. Everything I listen to is in one playlist that I prune from time to time. I didn’t add B&A to it because I didn’t want to have to download each episode each time. I downloaded them all at once. If I added it to the playlist, all 108 episodes would have shown up.  I had a separate playlist just for this show. But, I would forget about it.

I got to thinking about reruns. TV has them. YouTube has them.  Why not this medium?  Whether specifically for podcasts or RSS feeds in general, I thought something might exist. Something that would take a feed and give back the items at a pubDate+days interval. This way, whatever you consume the feeds with, will think it’s new. This could be done by modifying the pubDate, though some feed scrapers might not care that a pubDate might be in the future.  The other method would be to restrict a feed based on a range of days (or weeks for Podcasts).

I googled around for a bit. The back of my mind thinks it remembers something from…. 5 or so years ago? No luck. Then I wanted to build a service to do it… Then I remembered time is scarce these days. Yahoo Pipes to the rescue!!

I got a pipe working that overcast would accept and process. Then tweaked it for more public consumption.  

http://pipes.yahoo.com/timbroder/podcastreruns

The Pipe has 3 inputs (listed in a different order from that link for ease of explanation)

  • Feed URL: Paste in the url of your podcast feed here
  • How Many Weeks ago to start: This is when in the podcast to start pulling from. If want to start at the very first episode, use the number of weeks between when the episode first aired, and now.  I want to start B&A at episode 49. It aired on 10/24/2011. It’s currently 7/29/2014. So, I want to start 145 weeks ago
  • How many episodes do you want per week: This depends on how much you want, and how often the podcast released episodes.  If it was a weekly podcast and you want to get 1 episode a week, put 1. If it was weekly and you want 4 episodes a week to catch up faster, put 4.  What this is doing is loading all the feed items in between the “start week” and this number at once. Podcasts that come out more than once a week will be multiplied by this number

Configure as needed, then cick “Run Pipe” to confirm you see the appropriate episodes. Then, grab the RSS url for this configuration. Load this URL into your pod catcher.

2014 07 29 1602

I’ve been testing this for a few weeks now and it’s working great! Another good use would be Overcast’s “Retired Greats” Section:

 Overcast1

If you are interested in the inner workings of this Pipe, here is a screenshot. Though, looking at this now, getting more than 1 episode a week needs some tweaking.

2014 07 29 1606

“make” time

We’re often told you need to “make” time, a phrase that rankles me.

Drives me nuts as well. Our days are already packed. "Making time" isn’t making it; it’s prioritizing time. If you make time for something, you are acknowledging that the thing you are making time for has a priority at the expense of something else.

That’s why it’s important to know how long something takes, or to break it down into micro projects. By doing so, you may discover that you can reclaim time “might” by being more efficient, or by delegating tasks (whether they be personal or business-related).

This is interesting. I’d be interested in trying it and seeing where all my time is during the day. (I already track all my work hours. Outside of that) I would worry about it being consuming though. Then stressing about missed logs. Maybe

Permalink

UITableViewCell Action Swiping in iOS8 and Swift

Mail.app in iOS7 brought swiping cells to the inbox. The iOS8 beta added a 3rd button to it.  Apple has also introduced an API to assist with creating this effect: UITableViewRowAction.  Prior to this, I used SWTableViewCell.

14870105002 77af4bf515 b

Below is how to get the basic functionality working. Please note that you have to implement the 2nd function whether it has a body or not

I can’t get the (-) delete indicator to appear when I put the table into edit mode though. Setting UITableViewCell.shouldIndentWhileEditing = NO is supposed to disable this effect. I’ve tried setting it in 3 places: 

I’ve had to add some workarounds to deal with this for now.  I’ve filed rdar://17969970 against this. For now, this is how I’m handling by checking if I’m already in edit mode when I build out the actions array. This isn’t ideal at all. I don’t even want to be able to delete when I’m in edit mode, just reorder. Apologies for switching back to obj-c. The delegate I’m working in is older.

This post and the Radar helped me collect my thoughts to post on Stack. I’ve been afraid of backlash or Noob. Time to get over it.

Update 2014-09-11

Vanyas has a great sample application that addresses what I’m trying to do.  I was forcing the delete button on the right hand side myself.  Updating editingStyleForRowAtIndexPath to the below fixed my issue:

|  

How to Restore a Time Machine Backup From a Synology NAS

My Sunday morning started off like this:

My laptop wouldn’t finish booting. All I got was a backlit, black, screen.  I went through numerous combinations of booting with option, cmd+R, cmd+shift+R, un-mounting, ejecting. In all methods, trying in vain to get the Disk Utility to verify and repair the hard drive. I tried from Recovery Mode and a fresh OSX install on a USB hard drive. The things I saw on my screen included:

  • The aforementioned black screen
  • A backlit, white, screen
  • A gray screen with a flashing Folder with a question mark in it
  • “Live file system repair is not supported
  • There’s an error with the EFI system partition’s file system.”
  • Clean installs were failing: “An Error occurred while preparing the installation.  Try running this application again.”
  • “Verified failure: unrecognized file system”

After a few hours I moved from “I need to fix this” to “I need to get my laptop back up.” Ok let’s do a clean install: “An Error occurred while preparing the installation.  Try running this application again.” Crap. At this point I booked a genius bar appointment for the next day just in case. 3 clean installs failed.

Took a break to think about it…. I got back into Disk Utility and formatted the partition. Then deleted/recreated the partitions. Formatted again (why not?).

At this point a clean install worked. Ok… Seems like the drive isn’t totally dead. But, I want to do a fresh restore from my Time Machine backup on my NAS. I normally also have a SuperDuper! backup. I didn’t. That’s a story for another time.

Apple doesn’t quite support NAS Time Machine; there are a few hoops you have to jump through:

  1. Get into recovery mode (Boot while holding cmd+R)
  2. Open the terminal
  3. Go to Volumes
  4. Make a place to mount the NAS
  5. Double check it’s there
  6. Mount your NAS. This is the IP of it in my house. This should be the IP you use to get to the admin console. My Admin is: http://192.168.1.205:5000
    You’ll also need to know what share your Time Machine back is in. For me, it has it’s own drive, represented by “timstimemachine”. I’ll go into the details of my NAS setup in a future post
  7. Check you see files in the synology folder
  8. Even though we’re mounted, we won’t see this backup in Time Machine Restore just yet. Use hdid (hard drive image driver) to mount the sparse bundle image
  9. If your drive or the backup was encrypted, You’ll need to enter it’s password at this time
  10. Make sure your backup is still mounted
  11. Ok, quit the Terminal and load up Time Machine Restore
  12. You should see the backup we just mounted
  13. Start the restore. It can take a while. Mine is around 360 gigs and it estimated 16 hours. It took a lot less than that but it finished when I was sleeping so I don’t have an accurate time.

Sunday was a stressful day. Hopefully this can help you.

|  

Twitter or RSS

If you had to choose between only reading Twitter or only reading weblogs, which would you choose? Losing Twitter would be a bummer for a lot people, but losing weblogs would decimate the web. We should do more to strengthen weblogs and RSS because they are the foundation for so much of the most important writing on the web.

#RSS4LIFE

Joking aside, I do get a lot of my news from twitter these days. I would say half the articles that I’d be interested in reading (dumping to Instapaper from Reeder or Mr. reader) I’ve already added from twitter.
Luckily, I use Feed Wrangler so I don’t see duplicates of something already in Instapaper when browsing my feeds.

Permalink

Dismiss a Modal UIViewController created in Interface Builder

There are a number of posts on this subject on Stack. They involve re-instantiating (this seems slower to me) or yanking the view from a UIButton (this feels dirty).

I’d rather just update the UIBarButtonItem that I already have:

 

2014-07-27_1826

All I needed to do, was attach the appropriate target and action to the UIBarButtonItem:

Using PonyDebugger on a device

PonyDebugger is awesome. I use it mostly for Core Data debugging. Most of the time, I find it easier then firing up SQLite Professional

When using the simulator, hitting localhost:9000 is fine. On a device, not so much; you need to hit your machine. xip.ioto the rescue! What it is: xip.io is a magic domain name that provides wildcard DNS for any IP address. We use this heavily at work if the machine we’re on isn’t hooked up to a subdomain or Vagrant Share.

We can use this wildcard to have our iPhone hit our laptop’s instance of PonyDebugger.

First, get your IP. I use this Alfred workflow. Take note of your local IP.

Start PonyDebugger listening on that IP:

For handy access, alias this command: 

Load Pony in your browser by appending your IP to the a xip.io URL: http://192.168.1.10.xip.io:9000/

To access via the simulator or a device:

UITapGestureRecognizer in Swift

I have a subclass of UIView that has a label:

I want to attach a Tap Gesture to it:

|  

Creating a conforming delegate (UITableViewDelegate) in Swift

This tripped me up for a bit so I hope this helps someone.

I started out with this class, thinking I could just continue on my merry way. This errors in Xcode with: “class does not conform to NSObjectProtocol

Hmm ok, but much there yet, what did I miss? This should definitely be a class; not a protocol (I have methods to implement), not a @class_protocol (wrong use, based on the docs), hmm.

This obviously behaves different than in objective-c. What is inherent in the obj-c version of this that would conform to NSObjectProtocol? NSObject. Every class and C eventually rolls up to this…

This is working so far:

I’ll report back here if this solution changes

|