Chris Hannah Chris Hannah

Chris Hannah

Úll 2017

I’m currently on the way home from a little trip to Ireland 🇮🇪, where I have been in Killarney for this years Úll conference. It’s the first ever conference I’ve been to, and from what I’ve heard (and seen for myself), the bar is now set pretty high.

If you haven’t heard of Úll, then it’s best by described by the little introduction on the website:

Úll is a conference for people who build and love great products. We focus on great product stories, presented through an Apple-shaped lens. We treat the conference itself as a product: with a deep emphasis on the attendee experience.

It’s not exactly a tech conference, with the content focussed on personal stories, and thought provoking sessions, that do in-part relate back to technology.

This year the theme was “The Future”, and we certainly experienced that in the Banquet dinner. Where the dessert was a Deconstructed Apple Pie, with the Crème anglaise (yes I googled the spelling) served in a toothpaste-like tube, and some very vibrant Green Apple juice served with dry ice. It certainly all fitted the theme.

I was asked a few times, what my favourite talk was. But honestly, I really liked every single one I got to see. But if I got to choose the absolute fewest that really got my attention, I would choose:

  • Ben Norris’s talk on sketchnotes, regarding why, and how to use them effectively.
  • Jeremy Burge’s talk about Emojipedia, where it started, and a few stories about the growth.
  • Allen Pike’s great presentation about iTunes, and the many errors it harnesses.
  • Matt Bischoff’s talk about how everything we build is an Ice Sculpture, and why we need to pay attention to how products will end, and what that means for users and their data.
  • Quinn Rose’s thought provoking talk about you should put people first, and what your legacy will really be.
  • Alex Cox’s robot-cat inspired talk about machines that take care of their owners.
  • Alicia Carr’s experience with starting to develop an iOS app at the age of 51, starring in a documentary, and then even featuring in a WWDC intro video.
  • Daniel Steinberg’s thoughtful talk on why what we do, doesn’t necessarily determine who we are.

That’s certainly one hell of a list, and it still doesn’t show the great talks that I got to experience at Úll.

It wasn’t just the talks either that interested me. Jason Snell hosted Úll Radio, which I think I saw about 90% of the interviews. There was also a live recording of Clockwise, which was hosted by Jason Snell, Marco Arment, Myke Hurley, and Alex Cox.

To top it off, it was packed full of great people, and held in one of the nicest locations I’ve ever been to. I’m coming away with a lot of thoughts and ideas, and a new found love for conferences.

I’d love to come back next year.

What I Think About Clips and Where It Could Take Content Sharing

Apple released Clips yesterday, which is their new app for creating fun videos, with various filters, music, and more. I covered this app before, but as I hadn’t played around with the app at that point, it was literally just explaining the features.

But now I’ve had over a day with the app, and I must say I’m really loving it. It’s even earned it’s place on my Home screen!

The design of the app itself is quite nice, but I’m not sure I feel the same way about the icon. And it just feels easy to use, which I guess is the main focus.

I didn’t think I’d say this, but I also like the filters! The comic book one is by far my favourite, everything looks good in it!

There’s a lot of talk about the usage of private APIs, and how the app itself doesn’t ask for permission to use things like the camera or microphone, but seeing as this is an Apple app, I’m not too worried.

Another thing I like about Clips, is the exporting options. I had wondered how Apple would select social networks that would be included, but using a (completely custom) share sheet, is a good way to avoid any issues. Because this means any app can enable support for Clips, by adding video importing. One option I’m very thankful of, is YouTube, because it’s really fast (and super easy) to upload a Clip, and have it available near instantly.

I had some interesting mail today, and this gave me the opportunity to make use of Clips title features and music. Which I think turned out pretty well!

Finally, there’s something else I must say about Clips, and the type of app/service it could be enabling. And although the app is purely a way to capture, and edit videos, I think the content that people will create in Clips could change the way people watch videos.

We all know the issues with YouTube, there’s advertisement problems, the creators seem to always be annoyed about something, and it generally lacks competition. But one thing we can take from YouTube, is that people love Vlogs. Which are essentially a video version of a blog post, it’s a visual way to understand someone else’s life.

Blogs used to be huge, and while I still really enjoy writing my own, and reading other’s blog posts. But since then, microblogging services have taken over, with Twitter being the main service.

What I’m thinking is, if Twitter took blogging and made it micro, so then more people could take part, and share more content, more often. What if Clips could make vlogging micro? It would need another service of course, but it could just make use of whatever social network they’re on. I personally think that this app, along with competing apps that will no doubt turn up soon, will be the catalyst for upgrading the type of content that is shared.

“North” by Christoph Neimann

Christoph Neimann, in conjunction with National Geographic Expeditions, has published what he calls an “Illustrated Travelogue”.

During a trip to Norway’s Svalbard islands, Christoph was taking some photographs, but on top of that were his illustrations. The way the story has been published is rather interesting too, with some nice effects, transitions, and the story telling is really nice.

It sounds like an amazing trip, and an equally impressive story.

Read on National Geographic.

The 2016 Panic Report

Cabel Sasser on the latest Panic Report:

Welcome to 2017… Panic’s 20th anniversary!!

No, your eyes do not deceive you. Some of you may not know that we founded our company in 1997, but it’s true. We’re older than Facebook, older than Twitter, older than Google, and somehow still kickin’.

Every year is a little different, and last year was for sure — a little bit quieter on the software front (at least publicly), and a whole lot louder on the launch-of-a-major-multi-platform-video-game front.

Yes, it’s time: here’s a look back at 2016, and look forward to 2017.

It’s a really intriguing piece, and although it’s quite lengthy, I’m glad I read it. Panic is one of my favourite software companies (I love Firewatch), and Transmit 5 looks really impressive.

Read the full article on the Panic Blog.

What I've Been Up to Over the Past Few Weeks

It’s been a while since I actually wrote something, and that’s mainly because of my university work that’s been piling up (I finish this June!), and also because I’ve been developing a few mini projects with Swift. The latter is what I’m going to be writing about today.

Basically, over the past few weeks I’ve been getting back into using the command line more. Why is a hard question, but mainly because I’m a nerd, and it’s pretty fun!

It started when I kept seeing a trend of more of the people I follow on Twitter, either retweet or post GIFs of command line apps. It also led me to Hyper, which is a terminal application, and it’s actually built using JavaScript, HTML, and CSS. You can also customise it a ton, especially with the massive amount of themes available.

I personally, have Hyper set up with the hyper-ayu theme, and my favourite monospaced font, SF Mono.

This is getting a bit too meta, so I’ll bring it back on topic.

So I’ve actually developed four command line applications in the past two weeks, and they’ve all been build using Xcode/Swift[1]. The apps themselves are unix executable files, that can just be double-clicked and ran, but on each project I include more helpful installation/usage information.

cwiki

(Not to be mistaken with my macOS app, Qwiki)

This is the first one I made, and it was probably the easiest of them all. That’s because the majority of the code I could just reuse from my already released app, Qwiki! This app, cwiki , is just a super minimal version of that app.

You just type cwiki followed by a search query, and it will print out the most relevant matches. It does however, only print out a basic description of the articles.

Check out cwiki on GitHub.

So after the first project, I was a bit more intrigued, I decided to make a more interactive app. slink is purely a URL shortener that uses the Goo.gl API, but this lets you shorten, and also expand (Goo.gl) shortened links.

The slightly more complex functionality than before, led me to work out how options are managed in command line apps. So if you want to shorten or expand a link, just use either -s, --shorten, -e, or --expand. I also made a mini usage guide, that you can print out using -h or --help 🤓.

Check out slink on GitHub.

hacker

The third project was a bit similar to the first two, in that it made use of a few different options to return different data, but it also presented it like cwiki.

It’s a basic interface for Hacker News, and by making use of the various options, you can retrieve the new, top, and best lists.

Check out hacker on GitHub.

TitleCase

Okay this one is really simple, it makes use of Brett Terpstra’s TitleCase API, which formats a given string of text to the AP Title Case style. I actually find these types of tools perfect when writing a blog post, as usually the title is formatted incorrectly.

The API was probably the easiest one I’ve ever used. But then again, there was only one parameter, no options, and one return type.

Check out TitleCase on GitHub.


Now I guess everyone knows what I’ve been up to, so I can get back to slaving away over university work, and making some random projects!

P.S. I actually have some other really great news that I’m going to share here soon, but I’m just waiting on it being finalised a bit more.


  1. My favourite programming language 😍. ↩︎

Play Old Classics with Pocket Arcade for iOS 🕹

f you’ve ever been to an arcade, then you’ll know that there are a few classics that you always go back to. In Pocket Arcade, you get to experience the four main ones. They are even managed by coins, so there’s a chance to run out of money just like in real life.

You’ve got UFO Catcher, which is a grabbing style game. It’s not as weak as the ones in real life, but it can still become equally as irritating when you just miss a prize. Then there is Mayan Coin Pusher, which is the coin machine we all have probably left too much money on. Alien Whacker is the class Whack-a-mole game, and this is really fun. And lastly, there is Hoop Hero, which is a mini version of the basketball shooting game, which I find to be really suited to the iPhone.

All the prizes you collect are stored in the Gallery, and there are over 200 different prizes to collect at the moment.

I’ve seen similar games on the iPhone already, but this little collection of games are very well designed, and there’s also chances of more getting added in the future.

You can download Pocket Arcade for iOS for free on the App Store.

Track the Countries You’ve Travelled to with “been” for iOS

If you like to travel, then it’s pretty much guaranteed that you’d be interested in mapping out where you’ve actually been. This is because I’m exactly the same. I’ve come across a few apps in the past that are complex travelling journal type applications, but they never seem to stick with me, because they’re just too much.

Well today I’ve found another app for iOS called “been”, which does the job in a near-perfect way.

With been, you add all the places you’ve travelled to, and it then colours in these on a map. The only choices you have are to add a whole country, or an individual U.S. state. In a perfect world I’d like to specify each city I’ve travelled to, but this is a minor issue.

But once you’ve added your travels, then you get to check the maps out. You can choose to either view a 2D map, or a 3D globe, which can be exported as an image or video respectively. If you want to make your map a bit more specific, then while viewing the 2D map you can select a continent which will show you just that on a map.

Maps

After adding all of my travels, apparently I’ve only been to 4% of the world, which I certainly need to improve on! But I’ve generated both the 2D World map image, and the 3D globe video, which you can check out below as an example.

2D World Map

3D Globe Video

If you want to mark up your travels on a map like I did, then you can download “been” for iOS from the App Store for free! It works on both the iPhone and iPad. 🌍

Todoist for Mac

I’ve been a user of many different task managers over the years, but one I’ve tried before, and what I’ve finally settled on is Todoist.

My main philosophies regarding task managers are that they should be stable, and by that I mean it should be something you can rely on, you should be able to view your upcoming tasks everywhere possible, and the syncing should be very fast. With all of these requirements, Todoist is the choice that makes the most sense, because at a fundamental level it is a web service, not just a collection of apps, which makes it a super stable platform.

Projects

The main way to organise tasks in Todoist is by assigning them to projects, which you can also further organise with sub-projects. I have split my tasks into context relevant projects, so for example I have a University project, and inside this I split up any coursework or big chunks of work into a sub-project. This structure makes it much easier to visualise your tasks, especially when you input a load of small tasks like I do.

As you can see in the screenshot above, I also use emoji in my project names. This is just so I can find the right section at a quick glance. There’s also the added benefit of using an emoji first in the project name, which is that it always puts these at the top of the list. This is because an emoji character will always come before the usual alphabetical characters. Luckily I only have a few top-level projects, so this doesn’t affect my list.

Labels and Filters

Another away to organise and view your tasks is by using labels and filters. Labels offer a separate way to collect tasks together, which can of course be used in conjunction with projects. A common use of this is to have labels such as “admin” or “writing”, or even time-based names such as “quick” so that when you only have a specific amount of time available to get some work done, you can find suitable tasks can be completed.

Filters are ways to view your tasks, by applying some criteria to fine-tune your results. If working in a team, viewing tasks assigned to different users would be quite helpful, but I don’t personally make use of them.

Adding Tasks

The three main ways you can add a task is by using the “Quick Add Task” method, which is accessed pressing the “+” button, or by hitting the “q” key while in Todoist, by pressing the “+” button or by pressing the “A” or “a” key to add a task to the top or bottom of the current list, and also by using the “Quick Add Task” method outside of the app.

With apps such as Fantastical, inputting data has become much easier with the support of real language entry. So if I want to to add a task for university I can simply open up the Add Task view by pressing CMD + SHIFT + A, and then by typing “Finish Lecture Notes #University”, this will add a task with the entered name, and subsequently organise it into the University project. You can take this even further by adding dates and labels, so when I decide I want to write about an app, I can add a task like “Write about App X today #TheAppLife @Writing”. It’s a feature that once you learn how to make use of all the little tricks, you will really love to use.

Overdue Tasks

Something I haven’t seen before in other task managers is a ways to quickly reorganise overdue tasks. It is a feature that Todoist has, and one I have found to be very useful, especially when I plan way too much work for one day and end up leaving a few incomplete.

Todoist’s “Smart Schedule” is an AI powered feature that uses your habits, the urgency of tasks, your upcoming tasks, and even uses learned patterns from the other Todoist users, to help find the the best suited day to fit them in. So far the suggestions have been pretty spot on for me.

Your Productivity

This is a feature that it’s use continues to elude me, by competing tasks, and keeping up streaks, Todoist grants you “Karma”. These are all calculated by configurable goals, and I guess gives you a glance on how well you’ve been performing.

Fortunately for me, it doesn’t affect the usability of the app, because I don’t see myself making use of this in the future.


What I’ve found Todoist to be, is a fully featured, easy to use, and stable task manager to can really adapt to my own needs. I would recommend this to all users that are wanting to start using a task manager, and see if it fits them.

You can download Todoist from the Mac App Store, and find out about the other platforms on the Todoist website.

Getting Started with UITableView: Populating Data

This article is part of a collection of articles about Swift Basics, where I try to explain different parts of Swift development in a more understandable way.


In most iOS applications, you will probably need to use a UITableView at some point. In this short guide, you will find out how to create a UITableView, and populate it with your own data.

UITableView

As Apple say in the documentation, “A table view displays a list of items in a single column.”. Basically, it’s a list of cells, that you can take complete control over. With a UITableView object, there are two ways in which you can control them. They are the UITableViewDelegate, and the UITableViewDataSource. The delegate is what manages the interactions on the table cells, such as selecting and reordering. The UITableViewDataSource is as you may of guessed, what controls the data that populates the table, and also configures the cells in the Table View. However in this guide, we will just be focussing on the DataSource, as this is all we need to populate a TableView with data.

Styles

There are various ways in which you can customise the style of the TableView manually, but there are two main styles that you can choose from in the InterfaceBuilder, “Grouped” or “Plain”. There aren’t many differences, but in the “Plain” style, each cell fills the Table, and the relevant header/footer float above the cells. However in the “Grouped” style, the sections are visually separated into groups, with the addition of a background colour.

Creating the Project

We’ll start with a new Xcode project. So create a new iOS project, and select the “Single View Application” template. Then you can give it a name, for this example I’m using “TableViewExample”.

Just make sure the Language is Swift, and the other options aren’t needed for this example. This will create all the necessary files, such as “AppDelegate.swift”, “ViewController.swift”, and “Main.storyboard”.

Putting a UITableView on the Screen

Click on the “Main.storyboard” file, and from the object library on the right, drag a Table View onto the view (There should only be the one).

Then to make sure it works on all iOS devices and screen sizes, we’ll set up the layout. Just drag the corners of the TableView so that it fills the view, but keeps the top status bar visible, it should automatically align. Select the Table View, and then open up the “Add New Constraints” view from the bottom right corner. It is the icon with a square, which has a vertical line either side.

Once you constraint view appears, select the four lines around the square at the top, while making sure each value is 0. This will simply make it fit to the edges on any screen size.

Configuring the UITableView

Now we need to configure the Table View so that we can manage it later on. So select the Table View, and then click to show the “Attributes Inspector” from the right sidebar.

The only values you need to change are:

  • Content – Dynamic Prototypes
  • Prototype Cells – 1
  • Style – Grouped

All we are doing with these settings, is making the cells in the table dynamic, so that we can update them with live data later on. Then we set the style to grouped, so we can see each section better visually.

UITableViewCell

As we also want to populate the cells with some data later on, we will make use of the dynamic prototyping in Interface Builder, to design the cells.

Firstly we will set a “Reuse Identifier” for the cell, this is so that we can reuse the same cell prototype when loading the TableView. To do this, just select the cell (it may be easier to do this in the Document Outline to the left”, and while still showing the “Attributes Inspector”, set the Reuse Identifier to “PlainCell”.

Linking the UITableView to the ViewController

We will manage the Table View from the initial View Controller, so the next step is to set it as the DataSource of the Table. You can do this programatically, but for this example we will do it using Interface Builder. To do this, select the Table View, and then choose the “Connections Inspector” in the right sidebar.

From there, just click and drag from the open circle to the right of “delegate” and “dataSource” to the View Controller icon at the top of the view. Then in the “ViewController.swift” file, we will need to set the class to be the DataSource. Just replace the current class definition:

class ViewController: UIViewController {

To the following:

class ViewController: UIViewController, UITableViewDataSource {

It will show some errors right now, but that is just because we haven’t implemented the required functions yet.

Populating the Table View

We have the Table View set up in Interface Builder, and it’s linked to the View Controller, so now it’s time to populate it with real data. At the top of the View Controller class, just below the code you’ve just written, copy the below code:

let sections = ["Fruit", "Vegetables"]
let fruit = ["Apple", "Orange", "Mango"]
let vegetables = ["Carrot", "Broccoli", "Cucumber"]

This is just three arrays that will be used for the section headings, and the content of each of them.

UITableViewDataSource

To fill the table with data, we need to write four functions to do the following:

  • Set the headings for each section.
  • Set the total number of sections.
  • Set the total number of rows in each section.
  • Configure the individual cells with the relevant data.

Section Headings

We already defined the section headings before, so all we need to do here is to return the string for the associated section, which the function receives as an Int.

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return sections[section]
}

Number of Sections

This is quite a simple method, and it just tells the TableView how many sections there are. We already have the section headings in an Array, so we can just return the count value of this.

func numberOfSections(in tableView: UITableView) -> Int {
return sections.count
}

Number of Rows

Very similar to the method above, but this time we have slightly more complexity in how we return the value of the number of rows. As this method is for every section, we first need to check which section it is for, and then return the count value of the relevant array.

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  switch section {
  case 0:
    // Fruit Section
    return fruit.count
  case 1:
    // Vegetable Section
    return vegetables.count
  default:
    return 0
 }
}

Configure the Cell

The last part of populating the Table View, is to load the data into the cell. We do this by first creating a UITableViewCell object, by making use of the dequeueReusableCell(withIdentifier:) function. This uses the Reuse Identifier we set earlier, to dynamically reuse one of the cells that have already been created. Then depending on the section that the cell is in, we set the text of the text label of the cell, to the value from the relevant array. After this, the cell is returned, and it is displayed.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  // Create an object of the dynamic cell "PlainCell"
  let cell = tableView.dequeueReusableCell(withIdentifier: "PlainCell", for: indexPath)
  // Depending on the section, fill the textLabel with the relevant text
  switch indexPath.section {
  case 0:
    // Fruit Section
    cell.textLabel?.text = fruit[indexPath.row]
    break
  case 1:
    // Vegetable Section
    cell.textLabel?.text = vegetables[indexPath.row]
    break
  default:
    break
  }

// Return the configured cell return cell

}

Results

If you run this project now, it should look like this:

Final Code

Here is the final code for the View Controller that we created:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

let sections = ["Fruit", "Vegetables"] let fruit = ["Apple", "Orange", "Mango"] let vegetables = ["Carrot", "Broccoli", "Cucumber"]

override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. }

// MARK: UITableViewDataSource

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return sections[section] }

func numberOfSections(in tableView: UITableView) -> Int { return sections.count }

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { switch section { case 0: // Fruit Section return fruit.count case 1: // Vegetable Section return vegetables.count default: return 0 } }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // Create an object of the dynamic cell "PlainCell" let cell = tableView.dequeueReusableCell(withIdentifier: "PlainCell", for: indexPath) // Depending on the section, fill the textLabel with the relevant text switch indexPath.section { case 0: // Fruit Section cell.textLabel?.text = fruit[indexPath.row] break case 1: // Vegetable Section cell.textLabel?.text = vegetables[indexPath.row] break default: break }

// Return the configured cell return cell }

}

You can find the example project on GitHub.

Congratulations! You’ve now developed an app that makes use of a UITableView, along with a UITableViewDataSource to dynamically populate data, and also to configure the UITableViewCell. As this is an ongoing series of articles, you can expect more guides on how to take this project even further.