Jekyll2023-02-27T12:03:44+00:00https://davisonreiber.com/feed.xmlPeter Davison-ReiberWrite an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.Kwicket2022-07-15T21:04:02+00:002022-07-15T21:04:02+00:00https://davisonreiber.com/blog/2022/07/kwicket<p>I’m delighted to announce the launch of my new Cricket scoring app, <a href="https://apps.apple.com/gb/app/kwicket/id1619946182">Kwicket</a>. Back in the summer of 2021 I started scoring and umpiring cricket matches as part of my job as a teacher, and as someone who was new to the sport and still learning the rules<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> I found the existing scoring apps confusing, overly complex, and not user friendly.</p>
<p>I resolved to make an app for people like me, and that’s what Kwicket is. Starting a new match is quick, and scoring each ball is easy. The app helps you learn the game as you go, and it provides helpful data for post-match analysis.</p>
<p>I’m also proud that Kwicket 1.0 was built exclusively in Swift Playgrounds on an 12.9” M1 iPad Pro. My iPad Pro is my primary computer, and my favourite computer I’ve ever owned. Being able to build and publish an app to the App Store from there feels like a big step forward for iPadOS, and I hope that Apple continues to advance what can be done there. I’d love to support iCloud syncing the app one day, and that’s one feature which is just impossible to build from the iPad at the moment. So if there is a version 2.0, it’s more likely to be built in Xcode.</p>
<p>The app uses CoreData to store all the user data, and with the help of a few <a href="https://www.cephalopod.studio/blog/build-an-app-on-ipad-with-swift-playgrounds-and-core-data">blog</a> <a href="https://www.atomicbird.com/blog/core-data-code-only/">posts</a>, I managed to hand-code that part in Swift Playgrounds. Xcode on the Mac has a much more user friendly way of building these relational databases, so I’d love to see something like that coming to Swift Playgrounds one day. Writing SwiftUI against CoreData also makes you realise what uncomfortable bedfellows they are. When you’ve never even written a line of Objective-C in your life, but your Swift code ends up containing lots of <code class="language-plaintext highlighter-rouge">@objc</code> and <code class="language-plaintext highlighter-rouge">@nonobjc</code>, it feels like a piece of the puzzle is missing. I had hoped that this year’s WWDC might bring something like the “SwiftUI of CoreData”, but sadly not. Apple needs to tell a better story about persistence in SwiftUI apps, so I’m holding out hope for a mythical SwiftData in a WWDC not too far from now.</p>
<p>I have a few ideas for improvements in the next few versions. I’d like to explore using <a href="https://developer.apple.com/documentation/Charts">Swift Charts</a> in iOS 16 to do a bit more data visualisation, and more data analysis generally. Generating match reports would be a great feature, and that might end up being a good candidate for an in-app purchase. The app’s layout isn’t very well optimised for iPad yet, so I’d like to move to sidebar navigation there and generally make better use of the space.</p>
<p>Making Kwicket on the iPad Pro has been a great learning experience, and I hope I can build on those skills to create my next SwiftUI app. I’ll be moving to Xcode for that, since the scope of what I want to build is increasing to include things like widgets and Apple Watch complications.</p>
<p>You can download Kwicket for free <a href="https://apps.apple.com/gb/app/kwicket/id1619946182">on the App Store</a>.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>which I quickly learned must be called <a href="https://www.lords.org/mcc/the-laws-of-cricket">laws</a> rather than rules. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>I’m delighted to announce the launch of my new Cricket scoring app, Kwicket. Back in the summer of 2021 I started scoring and umpiring cricket matches as part of my job as a teacher, and as someone who was new to the sport and still learning the rules1 I found the existing scoring apps confusing, overly complex, and not user friendly. which I quickly learned must be called laws rather than rules. ↩A Things Inspired Theme for Drafts2021-04-10T15:07:49+00:002021-04-10T15:07:49+00:00https://davisonreiber.com/blog/2021/04/a-things-inspired-theme-for-drafts<p><a href="https://apps.apple.com/gb/app/drafts/id1236254471?uo=4">Drafts</a> recently introduced custom themes, so I thought I’d have a go at creating one myself. I’ve always loved the aesthetic of my task manager <a href="https://apps.apple.com/gb/app/things-3-for-ipad/id904244226?uo=4">Things</a>, so I’ve tried to emulate its dark mode colour scheme as closely as possible.<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup></p>
<p>If you’re interested in learning more about making Themes for Drafts, I can recommend Tim Nahumck’s <a href="https://nahumck.me/drafts-26-the-customization-update/">blog post</a> on the topic. Following his example, I also made use of <a href="https://apps.apple.com/gb/app/jayson/id1447750768?uo=4">Jayson</a> and <a href="https://apps.apple.com/gb/app/pastel/id413897608?uo=4">Pastel</a> to help with the process. He was also on the <a href="https://www.relay.fm/automators/73">most recent episode</a> of the Automators podcast speaking about the recent updates to Drafts, so that’s worth checking out too. Towards the end of the process of making my themes, Agile Tortoise released the <a href="https://tools.getdrafts.com/themes/theme-builder">Theme Builder</a>, so I was able to use that to do some further tweaking. Finally, there’s the <a href="https://docs.getdrafts.com/docs/extending/development/theme-format#scopes">documentation</a> on the Drafts website which goes into the nitty gritty.</p>
<p>You can download my <a href="https://actions.getdrafts.com/t/1kL">Things Dark theme</a> from the Drafts Directory.</p>
<p><strong>Update 2021-04-25:</strong> I’ve added a few more variations of this theme to the directory. There’s now a <a href="https://actions.getdrafts.com/t/1lD">light version</a>, which several people requested. I also made what I’m calling monospace versions, in both <a href="https://actions.getdrafts.com/t/1lF">light</a> and <a href="https://actions.getdrafts.com/t/1lE">dark</a>. In the original version, I wanted to make the Drafts editor look as much like Things as possible, with very large headings, and large subheadings – and that looks great with the system font. But I use a monospace font<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup> in Drafts, and personally I think it looks better in that case to have a consistent font size.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I used the eyedropper tool in the new iPadOS 14 colour picker to sample many of the colours directly. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p><a href="https://developer.apple.com/fonts/">SF Mono</a> <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>Drafts recently introduced custom themes, so I thought I’d have a go at creating one myself. I’ve always loved the aesthetic of my task manager Things, so I’ve tried to emulate its dark mode colour scheme as closely as possible.1 I used the eyedropper tool in the new iPadOS 14 colour picker to sample many of the colours directly. ↩Update to Quick Open Action for Drafts2021-04-08T16:37:03+00:002021-04-08T16:37:03+00:00https://davisonreiber.com/blog/2021/04/update-to-quick-open-action-for-drafts<p>I’ve just updated my <a href="https://actions.getdrafts.com/a/1Wc">Quick Open action</a> for <a href="https://apps.apple.com/gb/app/drafts/id1236254471">Drafts</a> which I previously wrote about <a href="https://polymaths.blog/2019/05/quick-open-action-for-drafts">here</a>. One of Drafts’ distinctive features is that by default it opens to a new blank draft after you’ve been away from the app for a certain period of time. It’s perfect for the app’s emphasis on quick and easy capture. Occasionally though, you just want to get back to the draft you were previously working on, even if you’ve gone over the usual timeout period, and I wanted to have ⌘O as the keyboard shortcut for this.</p>
<p>While my previous action did the job, there was always a slight delay before the previous draft popped up. At the time I originally wrote the script, the only way I could get it to work was to get a list of all drafts, sort by date, and then get the first one in the list, which I imagine gets slower the more drafts you have. I wanted to see if I could fix that delay, so I started trawling throught the <a href="https://scripting.getdrafts.com">Drafts Script Reference</a> to see if I could find a better way. It turns out that <a href="https://docs.getdrafts.com/docs/misc/changelog-ios#200">version 20.0</a> of the app introduced a new <a href="https://scripting.getdrafts.com/classes/editor#recentdrafts"><code class="language-plaintext highlighter-rouge">editor.recentDrafts</code></a> property, which is exactly what I needed. The script is now a one-liner:</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">editor</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="nx">editor</span><span class="p">.</span><span class="nx">recentDrafts</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</code></pre></div></div>
<p>Simple but effective. You can <a href="https://actions.getdrafts.com/a/1Wc">download it from the Drafts Directory</a>.</p>I’ve just updated my Quick Open action for Drafts which I previously wrote about here. One of Drafts’ distinctive features is that by default it opens to a new blank draft after you’ve been away from the app for a certain period of time. It’s perfect for the app’s emphasis on quick and easy capture. Occasionally though, you just want to get back to the draft you were previously working on, even if you’ve gone over the usual timeout period, and I wanted to have ⌘O as the keyboard shortcut for this.A Soulver Shortcut and Drafts Action2021-04-07T11:30:42+00:002021-04-07T11:30:42+00:00https://davisonreiber.com/blog/2021/04/a-soulver-shortcut-and-drafts-action<p>I recently noticed that <a href="https://apps.apple.com/gb/app/toolbox-pro-for-shortcuts/id1476205977?uo=4">Toolbox Pro</a> had a <code class="language-plaintext highlighter-rouge">Calculate with Soulver</code> Shortcuts action, which allows text to be run through the <a href="https://github.com/soulverteam/SoulverCore">engine</a> that powers the Soulver app. Even better, it’s the version of the engine from <a href="https://soulver.app">Soulver 3</a>, which is currently Mac only, although an iOS version <a href="https://twitter.com/soulver/status/1285411054269284354?s=20">is on the way</a>.</p>
<p><a href="https://www.icloud.com/shortcuts/51db5ccfe1fa45f98dbae4f3e10a0a67">I made a shortcut</a> which makes use of this Toolbox Pro action in Shortcuts to do quick calculations in natural language. It can be run either as a standalone shortcut, in which case it prompts for input, or via a <a href="https://actions.getdrafts.com/a/1kB">companion action</a> in Drafts. I like having the Drafts option available because I’m used to opening Drafts to jot things down. Using it as a quick calculation scratchpad also feels quite natural. Multiple calculations can be entered on separate lines, and the result for each is appended after an equals sign on the same line. It’s not as powerful as Soulver 3 for iOS will be, but for now it’s useful to have around.</p>I recently noticed that Toolbox Pro had a Calculate with Soulver Shortcuts action, which allows text to be run through the engine that powers the Soulver app. Even better, it’s the version of the engine from Soulver 3, which is currently Mac only, although an iOS version is on the way.Things Parser 3 for Drafts2020-12-13T21:25:03+00:002020-12-13T21:25:03+00:00https://davisonreiber.com/blog/2020/12/things-parser-3-for-drafts<p>Following on from my previous post about <a href="https://polymaths.blog/2020/12/mustache-prompt-for-drafts">Mustache Prompt</a>, I’m excited to announce a brand new version of my <a href="https://actions.getdrafts.com/a/1DV">Things Parser</a>. Thanks to its being <a href="https://www.macstories.net/linked/fantastically-good-event-parser-for-drafts-5/">mentioned on MacStories</a> along with my <a href="https://polymaths.blog/2018/06/fantastically-good-event-parser-for-drafts-5">Fantastically Good Event Parser</a>, it has become not only the most popular Drafts action that I have built, but the most popular Drafts action in the <a href="https://actions.getdrafts.com/drafts_actions?order=popular">whole directory</a> – a fact which creates in me an admixture of equal parts pride, imposter syndrome, and obligation.</p>
<p>The imposter syndrome comes from the fact that I taught myself JavaScript solely <a href="https://scripting.getdrafts.com">because of and through Drafts</a><sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">1</a></sup>. It’s a little disconcerting when something you cobbled together for yourself quickly turns into a tool that many other people use daily to do their work or organise their lives. That creates a sense of obligation to maintain it, fix bugs, and reply to support emails. There’s of course something nice about that, and when people email me about an issue they’ve had, they are unfailingly kind and complimentary. But when your code starts getting complicated or you haven’t looked at it in a while, it becomes difficult to maintain. Sometimes you realised that bugs run deeper than you thought, and would require a complete overhaul of the script.</p>
<p>That’s the point I’d got to with <a href="https://actions.getdrafts.com/a/1fU">Things Parser 2</a>. There was a lot of messy <a href="https://en.wikipedia.org/wiki/Regular_expression">RegEx</a> in there and it was getting difficult to reason about. Fundamentally, the problem was that I – an amateur, self-taught programmer – was trying to create a <em>parser</em>. As I learnt more about programming, I realised that parsers were a whole category of programs, and that they had a vital role in compilers, the programs that interpret source code and turn it into machine code. Suddenly the idea of trying to write a parser myself seemed less wise!</p>
<p>For <a href="https://actions.getdrafts.com/a/1DV">Things Parser 3</a>, there are a couple of big changes. The first is that I didn’t write the parser part of it. My script processes the output of the parser and transforms the data into a format that <a href="https://apps.apple.com/gb/app/things-3-for-ipad/id904244226">Things</a> can understand. The second big change – which I am a little nervous about, but I hope people like – is that I have completely changed the syntax. No, I have not created another custom syntax; instead I decided to use the popular and well-supported <a href="https://www.taskpaper.com/guide/getting-started/">TaskPaper format</a>.</p>
<p>So why the change? From the feedback I was getting on the action, it seemed like a lot of people were using it for the purposes of templates. They would keep a draft around that they could export into Things to start a new project or create a task with the same checklist every time. Perhaps a lot of people still use it for quick entry of one or two tasks, but the impression I got was that there was a desire for more features to support templates. TaskPaper made perfect sense for this.</p>
<p>From its beginnings in a single app, the TaskPaper format has become the Markdown for task management: a standard plain-text format compatible with a number of apps. <a href="https://apps.apple.com/gb/app/omnifocus-3/id1346190318">OmniFocus</a>, for example, has for a long time supported importing templates in TaskPaper format, and Drafts itself offers a syntax highlighting option for TaskPaper documents. All things considered, it seemed like the obvious choice. I’d also considered moving to OmniFocus just for the ability to import TaskPaper, but I prefer how Things looks and its keyboard shortcuts are now firmly lodged in my muscle memory. If I could build this functionality myself, I could have the best of both worlds.</p>
<p>After deciding I really didn’t want to write my own TaskPaper parser, I did some research online and found that <a href="https://github.com/jessegrosjean/birch-outline">Birch Outline</a>, the parser used by the actual TaskPaper app had been open sourced five years ago. I was able to pull out the JavaScript part I needed and add it on to the front of my script. It reads the text and derives the structure of the document, and then my script takes over and processes this into the right format for Things.</p>
<p>Things Parser 3 supports almost all the attributes that that Things own <a href="https://culturedcode.com/things/support/articles/2803573/#for-developers"><code class="language-plaintext highlighter-rouge">json</code> command</a> does in its url scheme. Here are some examples to show what’s possible.</p>
<h3 id="tasks">Tasks</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>- Tasks outside projects
- with date @when(2020-12-13)
- alternatively @defer(2020-12-13)
- with natural language date @when(tomorrow)
- with deadline @deadline(2020-12-25)
- alternatively @due(2020-12-25)
- Canceled task @canceled
- British cancelled task @cancelled
- Tasks can be @done
- Or @completed
- Tasks can be assigned to a @list(name)
- alternatively @project(name)
- or using list ID @listID(id)
- and within a project to a @heading(name)
- Tasks can have a @tag(name)
- Or more than one @tags(tag1, tag2, tag3)
- Tasks can have notes
which are indented text
- And subtasks
- which are indented tasks
- like this
</code></pre></div></div>
<h3 id="projects">Projects</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Projects can have dates too: @when(today)
- also supports @defer(today)
They can have deadlines: @deadline(2020-12-25)
- also supports @due(2020-12-25)
They can be: @canceled
- or if they are British @cancelled
They can be: @completed
- or @done
They can be assigned to an: @area(name)
Or using an id: @areaID(id)
They can have a: @tag(name)
- or multiple @tags(tag1, tag2, tag3)
They can have notes:
which are indented text
They can obviously have tasks:
- like this one
- and this one
But they can also have headings:
which are written like sub-projects:
- and tasks within the headings will be added to those headings
</code></pre></div></div>
<p>In addition to all that, you can also use variables in the form <code class="language-plaintext highlighter-rouge">{{variable}}</code> which you will be prompted for when you run the script if they are present. For details on advanced use of variables, including dates and time offsets, see my post on the <a href="https://polymaths.blog/2020/12/mustache-prompt-for-drafts">Mustache Prompt action</a>, whose functionality is built in to Things Parser 3.</p>
<p>You can <a href="https://actions.getdrafts.com/a/1DV">download Things Parser 3</a> from the Drafts action directory.<sup id="fnref:13" role="doc-noteref"><a href="#fn:13" class="footnote" rel="footnote">2</a></sup></p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:4" role="doc-endnote">
<p>I’ve no idea how you write JavaScript for a webpage, though I am told it is a popular application of the language. <a href="#fnref:4" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:13" role="doc-endnote">
<p>For fans of the old action, <a href="https://actions.getdrafts.com/a/1fU">Things Parser 2</a> is still available on the action directory but will no longer be maintained. <a href="#fnref:13" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>Following on from my previous post about Mustache Prompt, I’m excited to announce a brand new version of my Things Parser. Thanks to its being mentioned on MacStories along with my Fantastically Good Event Parser, it has become not only the most popular Drafts action that I have built, but the most popular Drafts action in the whole directory – a fact which creates in me an admixture of equal parts pride, imposter syndrome, and obligation.Mustache Prompt for Drafts2020-12-13T12:28:00+00:002020-12-13T12:28:00+00:00https://davisonreiber.com/blog/2020/12/mustache-prompt-for-drafts<p>Today I am releasing two new <a href="https://getdrafts.com">Drafts</a> actions. Originally, I had planned for these to be just one action, but as I was working on my script, I realised that part of the functionality I was building could be useful in its own right, and could easily be carved out into its own action.</p>
<p><a href="https://actions.getdrafts.com/a/1fT">Mustache Prompt</a> is the result of that. <a href="https://docs.getdrafts.com/docs/misc/changelog-ios#110---gmail-outlook-integration-and-more">Version 11.0 of Drafts</a> introduced a new <code class="language-plaintext highlighter-rouge">MustacheTemplate</code> object which allows the use of the <a href="https://en.wikipedia.org/wiki/Mustache_%28template_system%29">Mustache template system</a> within Drafts. Principally designed for use with HTML, Mustache allows for text templates to be created with placeholder variables. You tell the template what the values of all the variables are (using JSON) and it fills them in correctly for you. It can deal with variables of several different types including strings, arrays of strings, and booleans.</p>
<p>Mustache Prompt allows you to create Mustache templates in Drafts, and then instantiate those templates to create new drafts with the data you want. It does this by automatically detecting the variables in your template, and then prompting you to enter those values. Once you’ve entered the values, a new draft will be created with the values you entered. It’s a lot like a TextExpander fill-in snippet.</p>
<p>I’ve also extended the Mustache syntax to allow for variable type annotations, including dates and booleans. This ties into the prompt functionality within Drafts, so that if you annotate a data variable using the syntax <code class="language-plaintext highlighter-rouge">{{date:variable_name}}</code>, you will get a date picker in the prompt rather than a text field. Similarly, you can write <code class="language-plaintext highlighter-rouge">{{bool:variable_name}}</code> to get a toggle switch.</p>
<p>Furthermore<sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">1</a></sup>, you can also adjust date values by a given number of days, weeks, or months. Here are some examples of how to use that syntax:</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">{{date_variable+2d}}</code> adds two days to the date</li>
<li><code class="language-plaintext highlighter-rouge">{{date_variable-3w}}</code> subtracts three weeks from the date</li>
<li><code class="language-plaintext highlighter-rouge">{{date_variable+5m}}</code> adds five months to the date</li>
</ul>
<p>The first time you declare a date, you have to use the <code class="language-plaintext highlighter-rouge">date:</code> annotation, but after that there’s no need.</p>
<p>Mustache Prompt also supports arrays of strings, though there is no need to annotate here. If you use the <code class="language-plaintext highlighter-rouge">{{#tag}}</code> Mustache syntax, which can accept arrays, they will automatically be detected. In a text box, you just need to enter the values separated by commas.</p>
<p>Perhaps the best way to see how this all works is to <a href="https://actions.getdrafts.com/a/1fT">download the action</a> and then run it on this text:</p>
<blockquote>
<p>Here is a basic {{text_variable}}.</p>
<p>{{bool:#boolean_variable}}
Here is a paragraph that will only display if boolean_variable is true.
{{/boolean_variable}}</p>
<p>{{^boolean_variable}}
Here is a paragraph that will only display if boolean_variable is false.
{{/boolean_variable}}</p>
<p>{{#comma_separated_strings}}
Here is a paragraph that is repeated for each item in the array comma_separated_strings. The current item is {{.}}.
{{/comma_separated_strings}}</p>
<p>Here is a date: {{date:date_variable}}.<br />
Here is the same date three days later: {{date_variable+3d}}<br />
Here is the same date one week ago: {{date_variable-1w}}<br />
Here is the same date in seven months’ time: {{date_variable+7m}}<br />
Here is another date that is offset without the original date being shown: {{date:another_date+3w}}</p>
</blockquote>
<p>And just wait till you see the second action I’ve build with this.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:4" role="doc-endnote">
<p>It’ll make more sense why I’ve added this when you see the next action I’ve created. <a href="#fnref:4" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>Grader+ 1.12020-04-16T15:48:34+00:002020-04-16T15:48:34+00:00https://davisonreiber.com/blog/2020/04/graderplus1point1<p>I’m pleased today to announce the release of version 1.1 of <a href="https://apps.apple.com/gb/app/grader/id1448038088">Grader+</a>. I’ve rewritten the app from the ground up using <a href="https://developer.apple.com/xcode/swiftui/">SwiftUI</a>, Apple’s new declarative UI framework. This was partly so that I could learn how to use it, and partly so that the app would be easier to maintain in the future. I was <em>just about</em> able to put the app together using UIKit for version 1.0, but it was a struggle at times. SwiftUI made that so much better, and has given me confidence about maintaining it and building more apps in the future.</p>
<p>One of the key things I was aiming for in this version was simplicity. There are settings and options – and I’ve tried to put them in more accessible places – but mostly I’ve tried to make decisions which mean the app just does what you would expect it to do. It’s ultimately a very simple app for a very specific purpose, so I tried not to overcomplicate it.</p>
<p>Part of that simplification process is the pricing model. The complexity of the code I had to write in version 1.0 just to handle the in-app purchase was almost beyond my abilities. In fact, I wouldn’t have been able to do it without <a href="https://www.raywenderlich.com/5456-in-app-purchase-tutorial-getting-started">Ray Wenderlich’s excellent tutorial</a> on the topic. For an app as simple as this, I’ve decided it’s not worth it, so this version is just paid up front, with no in-app purchase. Most people don’t need this app, but I’m hoping the people who do will be willing to chip in. It would be nice at least to cover my developer licence!</p>
<p>Thanks go to <a href="https://twitter.com/twostraws">Paul Hudson</a> at <a href="https://www.hackingwithswift.com">Hacking with Swift</a> for a wonderful set of resources from which to learn SwiftUI. For just about any question I had there was an answer there.</p>
<p>Thanks also to <a href="https://emilbaehr.com">Emil Baehr</a>, who put together an amazing <a href="https://github.com/emilbaehr/automatic-app-landing-page">Jekyll template</a> which automatically generates an app landing page using an app’s store ID. With very little effort and only a few small edits, I was able to put together a <a href="https://davisonreiber.com/graderplus/">good-looking landing page</a> for my app.</p>
<p>If you’re a teacher who wants a quick and easy way to record marks while you’re grading papers or exams, try out <a href="https://apps.apple.com/gb/app/grader/id1448038088">Grader+</a> for iPhone.</p>I’m pleased today to announce the release of version 1.1 of Grader+. I’ve rewritten the app from the ground up using SwiftUI, Apple’s new declarative UI framework. This was partly so that I could learn how to use it, and partly so that the app would be easier to maintain in the future. I was just about able to put the app together using UIKit for version 1.0, but it was a struggle at times. SwiftUI made that so much better, and has given me confidence about maintaining it and building more apps in the future.WWDC19 Reactions2019-06-07T17:18:14+00:002019-06-07T17:18:14+00:00https://davisonreiber.com/blog/2019/06/wwdc19-reactions<p>I’m still digesting all of the news from this year’s WWDC, but it was a fantastic year as far as I’m concerned. Reflecting on my <a href="https://polymaths.blog/2019/06/wwdc19-wish-list">wish list</a>, I got a remarkable number of the things I was looking for.</p>
<h2 id="mouse-and-keyboard-support">Mouse and Keyboard Support</h2>
<p>Though Apple have been relatively coy about it, it certainly <a href="https://twitter.com/stroughtonsmith/status/1135653636145590273?s=21">looks like</a> mouse support is here, albeit as an accessibility feature. It looks like some devices are supported over Bluetooth, and some only USB (trackpads?), but I’m excited to try this out. I have a few questions how about scrolling and text selection<sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">1</a></sup> will work, but we’ll have to wait and see.</p>
<p>Keyboard support certainly seems to be <em>improved</em> across a number of system apps such as Safari and Files. I’m unsure as to whether the new multitasking features are controllable by the keyboard, but in a way mouse support makes this slightly less urgent. The main thing is that I can get around the OS without having to reach up and touch the screen.<sup id="fnref:5" role="doc-noteref"><a href="#fn:5" class="footnote" rel="footnote">2</a></sup></p>
<p>Speaking of input more generally, voice control is <strong>amazing</strong>. I’m definitely going to be using it for dictation, where I’ve long wished to be able to correct mistakes while speaking – but also I’m keen to see if I can get value from it more generally. I should also have had swipe typing on my wish list, but I was thinking mostly of my iPad when I put it together. I used to be a super-fast thumb typist, but I find it uncomfortable nowadays, and when I moved to Gboard for a while, I found swipe typing much better ergonomically<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup>. But I wasn’t that keen on the potential privacy implications all of my text input going through a third-party keyboard, so I stopped using it. Now I can have both ergonomics and privacy. Swipe typing is also available on the iPad, which now has a detachable iPhone-sized floating keyboard you can move around the screen. This thought led me to realise what might be the most awesome new text input method: <strong>swipe typing with the Apple Pencil on the floating keyboard</strong> ⌨️✍🏻🤩. Can’t wait to give this a try.</p>
<h2 id="xcode-for-ipad">Xcode for iPad</h2>
<p>Sadly we didn’t get it this year, but it’s got to just be a matter of time. <a href="https://twitter.com/pdavisonreiber/status/1135634270389710849?s=21">As I said</a> during the keynote, the new SwiftUI framework makes this much more feasible for the future because it makes the link between code and UI both stronger and simpler. Swift Playgrounds doesn’t have Xcode’s interface builder – being very pointing device dependent it’s difficult to see how it would easily translate from the Mac. SwiftUI along with its previews feature, however, is something I can easily imagine on an iPad. I can’t wait until it’s supported in the Swift Playgrounds iPad app.</p>
<h2 id="odds-and-ends">Odds and Ends</h2>
<p>I’m happy to say that I got a lot of these. Improvements to Siri Shortcuts, including the Shortcuts app look amazing. With shortcuts now able to take input and pass output, the possibilities to add scripting in the middle of multi-step shortcuts have really expanded. I’ve no idea if the command-tab list has been made more logical, but with the overhaul to multitasking more generally I’m optimistic. The new Files app has come a long way, I can now have widgets on my home screen, and <strong>halleluja</strong> there are shared folders in iCloud Drive.</p>
<h2 id="tidbits">Tidbits</h2>
<p>Apart from all of the above, there were still plenty of things I was surprised and delighted by. It’s worth having a look at this <a href="https://www.apple.com/ipados/ipados-preview/features/">amazingly comprehensive list</a> of new features that Apple put together. Several things that jumped out at me which didn’t get big headlines.</p>
<p>Siri:</p>
<blockquote>
<p><strong>Add custom words</strong> <br />
Whether you’re writing a biology report, filling out a legal document, or emailing about a favorite topic, you can add custom words to ensure that Voice Control recognizes the words you commonly use.</p>
<p><strong>Radio</strong> <br />
Ask Siri to tune in to your favorite radio station.</p>
</blockquote>
<p>Share sheet:</p>
<blockquote>
<p><strong>One-tap suggestions</strong> <br />
When you share a photo or document, receive a suggestion about who you might want to share it with and which app you may want to use, so you can share with just a tap.</p>
</blockquote>
<p>Messages:</p>
<blockquote>
<p><strong>Share ETA</strong> <br />
Share your estimated time of arrival with family, friends, and coworkers. Your ETA even updates should a significant delay occur.</p>
<p><strong>Improved search</strong> <br />
Search in Messages makes it easier to find what you’re looking for. Even before you type a character, you can see recent messages, people, photos, links, and locations you might be looking for. When you type in a search, Messages categorizes the results and highlights matching terms. You can also search within individual conversations for the message you’re looking for.</p>
</blockquote>
<p>Notes:</p>
<blockquote>
<p><strong>New checklist options</strong> <br />
Quickly reorder checklist items using drag and drop, swipe to indent items, and move checked items to the bottom. If you’ve completed the checklist and want to use it again, you can click to uncheck all the items and start over.</p>
<p><strong>Folders and notes management</strong> <br />
Organize your notes by creating folders and nested subfolders and easily manage how they’re organized in your folder lists.</p>
<p><strong>View‑only collaboration</strong> <br />
Share notes and entire folders as view only so you’re the only one who can make changes.</p>
</blockquote>
<p>I haven’t quite decided if and when I’m going to jump on the beta train. I think I will definitely wait until at least public beta 1 if not 2, but I’m really excited to try out all of these new features.</p>
<hr />
<p>It now really feels to me like the iPad has crossed some kind of threshold of maturity. When people asked me in the past whether they should buy an iPad instead of a laptop, I would generally explain that it was a fantastic device that could do pretty much everything, but that there were a few sharp edges here and there. Either you had to be a bit nerdy to find a good workaround, or you just hit a brick wall. These brick walls were things like working with two Word documents, getting a PowerPoint off a memory stick, or using a web app which assumed a desktop browser. All of these obstacles are now gone, and I would have no reservations recommending the iPad as a truly excellent personal computer.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:4" role="doc-endnote">
<p>The new methods for text selection with a finger may remove this concern. <a href="#fnref:4" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:5" role="doc-endnote">
<p>I did see <a href="https://twitter.com/reneritchie/status/1135643633690992640?s=21">this tweet</a>, but I haven’t seen anything else corroborating it. <a href="#fnref:5" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p>It allows you to hold the phone with one hand and type with the other without being unbearably slow. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>I’m still digesting all of the news from this year’s WWDC, but it was a fantastic year as far as I’m concerned. Reflecting on my wish list, I got a remarkable number of the things I was looking for.WWDC19 Wish List2019-06-03T15:33:51+00:002019-06-03T15:33:51+00:00https://davisonreiber.com/blog/2019/06/wwdc19-wish-list<p>I’m really looking forward to watching Apple’s WWDC19 Keynote this evening (UK time). As an iPad first user, I think it’s going to be a big one for me. For better or for worse, big iPad updates now come every two years, so today is the pivotal moment when we get to see Apple’s plans for the future of the platform over the next two years. Here are my personal priorities for iOS 13 on the iPad.</p>
<h2 id="mouse-support">Mouse Support</h2>
<p>These aren’t meant to be in any particular order, but yes, I am putting this one first. When I first moved to the iPad as my primary computer three years ago, I used to laugh at people who asked for this. I thought you might as well ask for the iPad to be steam-powered or have a hand crank<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. But given how much I’m now using my iPad, especially with the Smart Keyboard, I’ve been really feeling the need for this ergonomically. When using the iPad “like an iPad” this just isn’t necessary: the input surface and the output surface are one and the same. But with the Smart Keyboard – which Apple suggests you might want to use with your iPad Pro – the two surfaces become separated. We’ve had a way of dealing with this separation for over fifty years: it’s called a mouse, and I hope Apple offers it at least as an option for those who want to use it with their iPad.<sup id="fnref:7" role="doc-noteref"><a href="#fn:7" class="footnote" rel="footnote">2</a></sup></p>
<h2 id="better-keyboard-support">Better Keyboard Support</h2>
<p>I love the Smart Keyboard, and I love apps like <a href="https://itunes.apple.com/gb/app/things-3-for-ipad/id904244226?mt=8&uo=4">Things</a> that really take advantage of it, but I wish more apps had such extensive keyboard shortcuts, and that the system did too. It needs to be at least <em>possible</em> to use an iPad solely with the keyboard. Keyboard input also needs to work better with multitasking, where it can often be unclear which app in a split view is the one responding to keyboard input and keyboard shortcuts.</p>
<h2 id="xcode-for-ipad">Xcode for iPad</h2>
<p>I recently built my <a href="https://itunes.apple.com/gb/app/grader/id1448038088?mt=8">first ever app</a>, and I did it using Xcode on an old MacBook Air. The device was perfectly suitable for the job, but the iPad is still my favourite computer, and building apps is the one thing I want to be able to do there that I still can’t<sup id="fnref:5" role="doc-noteref"><a href="#fn:5" class="footnote" rel="footnote">3</a></sup>. For an iPad-first user like myself, Apple is currently saying that I should just buy a Mac as well, and I slightly worry that they are tempted to prolong this situation because of the obvious revenue benefits. But what I really want is <em>one great computer</em>, not two. The iPad for me is so close to being that one great computer, and I hope that it can become that.</p>
<h2 id="odds-and-ends">Odds and Ends</h2>
<ul>
<li>Improvements to the <a href="https://itunes.apple.com/gb/app/shortcuts/id915249334?mt=8&uo=4">Shortcuts app</a> and Siri shortcuts more generally.</li>
<li>Some kind of <em>Swift for Automation</em> technology, perhaps in Shortcuts.</li>
<li>Make the command-tab switcher work like it should.</li>
<li>Better Files app.</li>
<li>Widgets on the home screen.</li>
<li>Shared folders in iCloud Drive.</li>
</ul>
<hr />
<p>Ten years in, it’s time for iOS to fully mature into a self-sufficient computing platform. I’m looking forward to seeing how Apple moves towards that goal.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>What a <a href="https://play.date">ludicrous idea</a> 😉 <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:7" role="doc-endnote">
<p>Even better would be a trackpad on the next Smart Keyboard. <a href="#fnref:7" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:5" role="doc-endnote">
<p>There are <a href="https://www.macstories.net/stories/wwdc-a-wish-list-2019-edition/">a few other developer features</a> that would be really welcome too. <a href="#fnref:5" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>I’m really looking forward to watching Apple’s WWDC19 Keynote this evening (UK time). As an iPad first user, I think it’s going to be a big one for me. For better or for worse, big iPad updates now come every two years, so today is the pivotal moment when we get to see Apple’s plans for the future of the platform over the next two years. Here are my personal priorities for iOS 13 on the iPad.RSS Digest for Kindle2019-05-24T08:46:25+00:002019-05-24T08:46:25+00:00https://davisonreiber.com/blog/2019/05/rss-digest-for-kindle<p>A shortcut I made ages ago that I’ve been meaning to share. I like reading RSS, and I like reading on my Kindle, so I decided to try and make a shortcut that could turn a list of RSS feeds into a daily digest of articles I could read on my Kindle.</p>
<p>The shortcut leverages the <em>Send to Kindle</em> share sheet extension which is able to accept PDFs and convert them to Kindle format. Once the shortcut has run, the share sheet will appear. Select <em>Send to Kindle</em> and then on the dialogue box that appears hit <em>Send</em>. You will then be asked whether you want to convert the PDF to Kindle format, and you should hit <em>Yes</em>.</p>
<p>There were a couple of interesting challenges building this shortcut. One was dealing with block quotes, which the Kindle format simply turned into normal text, making articles containing them confusing to read. Having no idea how the Kindle app does the PDF to Kindle conversion, I wasn’t able to find a way of having the resulting document display indentation or a vertical line. My compromise was to just turn all block quotes into italic text, and the result is actually pretty good.</p>
<p>The other challenge was a feature I decided to add while writing this post. On iOS my current RSS reader of choice is <a href="https://itunes.apple.com/gb/app/unread-rss-reader/id1252376153?mt=8&uo=4">Unread</a>. It’s an app I’ve always liked because it just gets all the usual UI elements out of the way and lets you read uninterrupted, and the controls to the app are a rather elegant selection of gestures. But I’ve been playing around with <a href="https://itunes.apple.com/gb/app/fiery-feeds-rss-reader/id1158763303?mt=8&uo=4">Fiery Feeds</a> recently because it allows feed subscriptions to be added within the app. Using Unread means I have to deal with the <a href="https://feedly.com/i/welcome">Feedly website</a>, which is not great and downright impossible to use on an iPhone. Fiery Feeds and several other apps allow you to export OPML, so I wanted to offer support for that as a convenient way to use this shortcut with your existing feeds. I cobbled together some regex which seems to do the job. <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup></p>
<p>I had a half-working version of this shortcut that also included articles that were linked to from link posts, but hit a brick wall in making that work in a satisfactory way. Different blogs just don’t seem to be consistent in the way they indicate which posts are link posts and what the linked URL is. If anyone has any ideas how to make this work, <a href="https://mobile.twitter.com/pdavisonreiber">let me know</a>.</p>
<p>You can download the shortcut with <a href="https://www.icloud.com/shortcuts/ee382a64ef6d420db3c9dbf925aaed8b">this link</a>.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I wish the JavaScript action step in the Shortcuts App could be used outside of a webpage, in which case I’m sure there would be a more elegant way to parse that information. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>A shortcut I made ages ago that I’ve been meaning to share. I like reading RSS, and I like reading on my Kindle, so I decided to try and make a shortcut that could turn a list of RSS feeds into a daily digest of articles I could read on my Kindle.