Today’s header image was created by Josh Kirby, you can find the more information on John Kirby here
A New Application?
I’ve wanted to build, publish and release a new application for a while now, one that’s based on an idea I’ve had bouncing around my head for a while: A search engine for Discworld novels.
Enter, the Discworld Disorganiser.
In the Discworld novels the dis-organiser is a parody of a PDA. It’s a small device, powered by an incompetent imp, which annoys the user. Not into remembering their schedule, in fact most of the features of the Mark 1 dis-organiser are apologies. It just annoys the user, that’s all it’s really good for.
The name doesn’t really hold with the aim of the application, if I’m honest. It was just a catchy, related name for the thing.
Anyway, the idea behind The Discworld Disorganiser application is that a user can use it to search for a Book, Character or Series.
The Book search would take into account as much of the book content as would be possible, when searching. Things like:
- Name of the book (which seems quite important)
- Book description
- Characters included in the book
That last step would be tricky, especially with the later books. Snuff (one of the final few books in the series) has over 50 characters, for example. Now most of these characters are not that important to the story, but I wanted to be as loyal to the source as I could in as many places.
A few weeks back, I released a video of an early beta of the app. It didn’t have a full data set, and was missing the Series search functionality, but I’ll include it here for completeness:
A Walk Through the Application
Since releasing that video, I’ve added the Series search function into the mix but have introduced a few bugs along the way.
First an updated video showing off the new features:
The first thing I do is search for a Book, you can see that it uses character names (which is why I search for “Rincewind” and “Nanny Ogg”) along with the book description (why I searched for “Watch”).
Then I search for Vimes on the character screen and we get the first bug: There are quite a lot of entries for Samuel Vimes.
Then I do a partial character name match: “rince”. This matches on a few character names, so we get a few results. Again, though, there are too many Rincewinds.
And finally, I do a Series search. Currently this searches only on series names, so you wont get results if you search for “Nanny Ogg” or “Night Watch”. But you do get results for a series name, or for a blank string search.
If you’ve gotten this far, then I’m sure that you want to try it. And you can, it’s available for free. All you have to do is point a web browser at: http://discworlddisorganiser.azurewebsites.net
It’s on a free tier of Microsoft’s Azure hosting platform. This means that when the application isn’t being used it shuts down, and can take up to 4-5 seconds to start back up again.
Luckily, this only happens after about half an hour of no one using it
Wanna Know How I Did It?
If you got this far, then I know you’re more than a little interested in how I built this thing. Well you’re in luck, because I wrote up every step that I took to build both parts of the application.
Technically, it’s two applications
The first part of the application is a .NET Core WebApi project which uses Entity Framework Core and Sqlite. There was very little documentation out there for Entity Framework Core when I started building this application, so it was all a bit touch and go. But I documented the process, and you can read all about it here.
The series of blog posts presented in that link are in reverse order, because I like to mess with people.
The second part of the application is a .NET Core MVC Single Page Application using Angualr2 and webpack.
now THAT sounds impressive
I wrote all about the process of building that part of the application here.
I write a fair bit these days, huh?
On top of all that, I’ve released the source code for free. This means that if you follow along with the blog posts that I’ve linked above, you’ll be able to build a version for yourself.
Including the bugs!
I’ve tried to keep the design for the WebApi part to be as open as possible. As long as your dataset is complete enough, you should be able to swap the seed data JSON files for any other set of books, characters and series data.
Want to build a Brandon Sanderson search engine? How about a Stephen King search engine? Both of those are easy enough. Just swap the data in the JSON files, rebuild the app and call /database/dropdata followed by /database/seeddata to see your whole new search engine.
The source code for the WebApi project is available here
The UI project is equally as open. As long as you change the address used in the search methods to that of your book engine, then everything will work fine.
The source code for the WebUi project is available here
There’s not much else to say other than, go give it a try and let me know what you think. Let me know what you think of the application (or if you find any bugs) in the comments.