dog

Night Sky and Dictionary We Are Coming for You

April 18th, 2012

In the same fashion as the Pedias on the Mac App Store, Pocketpedia has risen to meteoric heights on the App Store. When it comes to cataloging items, nothing is more important than keeping those constellations in order, but right after that is knowing the definition of a word and info about your books, albums, movies and games with Pocketpedia.

Thank you everybody for making it so popular on launch date, not to mention all the 5 star reviews. Need a few more to start getting an aggregated rating. :)

Pocketpedia 3

April 17th, 2012

We are extremely excited to announce the immediate availability of Pocketpedia 3 on the App Store.

It took three people working two years to make this possible and we are very proud of the first version. We’ll be making videos in the future for new users to see Pocketpedia in action before downloading it. But since a lot of you already know Pocketpedia and have been so patient we wanted to release it right away while we still working on some of the marketing material. Pocketpedia 3 requires iOS 4.0+ (sorry first generation iPod touches and iPhones that can only be upgraded to 3.1.1) and supports retina display on all the devices including the new iPad.

Pocketpedia3 on the iPad, doing a search on Doghouse.

As a thank you for your patience and all your help with version 5 and Doghouse, the app is currently available for a %25 discount at $2.99. This offer will run until April 24, 2012 so tell your friends and spread the word.

In its current form Pocketpedia is the perfect companion app to the Desktop Pedias for taking your collection on the go. If you are both a Pedia and Mobile device owner be sure to download Pockepedia 3. Do send us feedback about features you’d like to see and we’ll try to work those into upcoming version. We already have a list of features we want to add, such as editing directly in Pocketpedia and adding entries manually to make it a stand-alone iOS app for those users without Macs.

A special thank you goes out to all the testers who helped beta test Pocketpedia3 these last two months. Also to all the users who contributed to the Doghouse, helping to create the search site for Pocketpedia as well as to all the moderators who have been correcting details and entering missing information in Doghouse.

There is a lot more to share about the making of Pocketpedia 3 but for now we are just thrilled to get it out there to all our users.

Enjoy!

Totally Unrelated Recipedia (Actually a Bit of a Relation)

April 6th, 2012


A childhood friend has released his first iOS app and has named it in honor of the Pedias. Recipedia comes to fill all your kitchen organizing needs. We attended my friend’s wedding last year and we expected a different kind of announcement a year later but that just goes to show the rise of iOS is so meteoric that the first creation of a married couple is now an app. Jose did all the programming and his wife the design.

For a 1.0 it’s a solid release, stable with all the main areas that you might need in a recipe organizer. The option to edit online recipes once they’re saved is very useful since I often tinker with recipes to fit my tastes. The flow of some areas needs updating such as the “save recipe” button which asks you to chose a category to store the recipe in but it’s not immediately clear where this option is located. Ideally the alert would include the different categories as button choices, saving one click. Power users will then automatically figure out that they can set the category beforehand, while the rest of us can continue to use the buttons.

It’d also be nice to get a picture of your own recipes in the internal search results, especially given the height available for each search result. I would like to the see the “add new recipe” and “copy/paste recipe” integrated into a single command and merge the smarts of copy/paste (automatic separation of ingredients and steps) directly into the individual fields (with an option to undo, should I want to keep all paragraphs in one step). But here I am probably overlooking some complicated technical details that would not make this possible. As a personal favorite I’d love to see Serious Eats as an online source and the ability to change the order of ingredients and instructions.

At $2.99 Recipedia is a steal and if you’re into cooking you should check out this adopted brother of the Pedias. Getting started in the App Store is very exciting and we wish them the best of luck. Being able to live of your software creation and then have the financial/fan support to continue to develop it is a great career.

Sorting Titles Without Articles Fast

March 30th, 2012

Mark Dalrymple wrote an interesting article about the speed difference between isEqual: and isEqualToString: methods. Choosing between these methods is a small decision programmers make everyday. The article should reaffirm readers beliefs that concentrating on readability is more important than performance.

The short of it is that he runs the methods 10 million times to show results in a speed difference of 3% to 7%. About .0000000005 seconds gained for every call of isEqualToString method over isEqual. Most of my code would use those methods at most a few tens of times when a user makes a choice in the Pedias and five billionths of a second is certainly not a difference anyone can notice. In fact the difference in results is low enough that they become statistically meaningless. Trying to unravel the implications of compiler optimizations as well as the testing environment is more complex and time consuming than the numbers justify.

However the article did get me thinking about an old function I optimized a few year back. The Pedias include a bit of code for sorting that ignores the article at the beginning of a title. When sorting a large number of entries this code can be run in the vicinity of a million times. This fits my number one rule about optimization: loops are the place where optimization makes the most difference.

The original code used the standard NSString hasPrefix: method to do the comparison.

if ([aString hasPrefix:@"\""])
    aString = [aString substringFromIndex:1];

if ([aString hasPrefix:@"The "])
    return [aString substringFromIndex:4];
else if ([aString hasPrefix:@"A "])
    return [aString substringFromIndex:2];
else if ([aString hasPrefix:@"An "])
    return [aString substringFromIndex:3];
return aString;

On testing collections with 20,000 items the sort felt sluggish. Especially when compared to a sorting that did not take the article into account, hence I knew the article comparison could do with some optimization. I changed the code to do the comparison based on each individual character. (This all started with a much longer version of the code that ignores articles in other languages that take into account a lot more than the possible 3 articles in English.) By looking at the first letter and making chain decisions I thought I would save a lot of time.

NSUInteger length = [aString length];
if (length) {
	unichar aChar = [aString characterAtIndex:0];

	if (aChar == '\"' && length > 1) {
		aString = [aString substringFromIndex:1];
		aChar = [aString characterAtIndex:0];
		length--;
	}

	if (aChar == 'T' && length > 4 && [aString characterAtIndex:1] == 'h' && [aString characterAtIndex:2] == 'e' && [aString characterAtIndex:3] == ' ')
		aString = [aString substringFromIndex:4];
	else if (aChar == 'A') {
		if (length > 3) {
            aChar = [aString characterAtIndex:1];
		    if (aChar == ' ')
			     aString = [aString substringFromIndex:2];
		    else if (aChar == 'n' && [aString characterAtIndex:2] == ' ')
			     aString = [aString substringFromIndex:3];
		    }
	    }
    }
return aString;

With the new code the sorting was blazing fast in testing and it’s been great for actual users ever since. My interest peaked by Mark Dalrymple article and his timing code convenient and thoughtfully in a gist I ran my two methods in it to finally get some raw numbers.

Title “King Kong”:
Time for characterAtIndex: 0.300036
Time for hasPrefix: 3.165767

Title “The Lord of the Rings”:
Time for characterAtIndex: 3.218064
Time for hasPrefix: 4.198877

Right off you can see the new code (which is really 5 years old) is 10x faster than the old version when no article is present. For the string with “The” the code is much slower in both cases. But this can quickly be attributed to the actual “substringFromIndex:” method that both versions need to return the string to be sorted. Removing this operation, since we are only interested in the comparison timing, gives new numbers.

Title “The Lord of the Rings” with an assignment call instead of substringFromIndex.
Time for characterAtIndex: 0.665993
Time for hasPrefix: 1.568902

As you can see the difference is still 0.98 seconds between them but the time it takes to do 10 million substringFromIndex: calls has been stripped, better reflecting that in the case of “The” article being present the new call is 2x as fast. A title with “An” of course is even faster as the original method does not test for just the presence of “A” first but the entire “A ” and “An ” prefix.

So sometimes it does make sense to write your own versions of the built-in functions and lengthen your code when you can use the internal information in the algorithm to achieve more specific results. However, keep in mind it’s not really worth the time unless making millions of calls to that function.

As a side note, it’s faster in 32 bit than in their 64 bit counterparts. A meaningless statistic since the code is so basic that there is no advantage or disadvantage in the code itself that would affect the timing depending on the architecture.

For programmers out there looking to ignore articles when sorting, the above code will do the trick nicely when wrapped in the below category method of NSString and used from a NSSortDescriptor:

@implementation NSString (NSStringExtensions)

- (NSComparisonResult)ignoringArticleCompare:(NSString *)anotherString {
	NSString *string1 = removeArticleFromString(self);
	NSString *string2 = removeArticleFromString(anotherString);

	return [string1 compare:string2 options:NSCaseInsensitiveSearch | NSNumericSearch range:NSMakeRange(0,[string1 length]) locale:[NSLocale currentLocale]];
}

@end

Here is the code for also ignoring articles in English, French, German, Italian and Spanish:

static inline NSString* removeForeignArticleFromString(NSString *aString) {

	// A faster version than the original below
	NSUInteger length = [aString length];
	if (length) {
		unichar aChar = [aString characterAtIndex:0];

		// ", The, A, An, El, Ein, Eine, Einen, Einem, Einer, Eines, Un, Una, Une, Des, Der, Dem, Den, Die, Das, L', Lo, La, Le, Les, Los, Las, Il
		if (aChar == '\"' && length > 1) {
			aString = [aString substringFromIndex:1];
			aChar = [aString characterAtIndex:0];
			length--;
		}

		if (aChar == 'T' && length > 4 && [aString characterAtIndex:1] == 'h' && [aString characterAtIndex:2] == 'e' && [aString characterAtIndex:3] == ' ')
			return [aString substringFromIndex:4];
		else if (aChar == 'A') {
			if (length > 3) {
				if ([aString characterAtIndex:1] == ' ')
					return [aString substringFromIndex:2];
				else if ([aString characterAtIndex:1] == 'n' && [aString characterAtIndex:2] == ' ')
					return [aString substringFromIndex:3];
			}
		}
		else if (aChar == 'E') {
			if (length > 3) {
				if ([aString characterAtIndex:1] == 'l' && [aString characterAtIndex:2] == ' ') // el
					return [aString substringFromIndex:3];
			}
			if (length > 4) {
				if ([aString characterAtIndex:1] == 'i' && [aString characterAtIndex:2] == 'n' && [aString characterAtIndex:3] == ' ') // ein
					return [aString substringFromIndex:4];
			}
			if (length > 5) {
				if ([aString characterAtIndex:1] == 'i' && [aString characterAtIndex:2] == 'n' && [aString characterAtIndex:3] == 'e' && [aString characterAtIndex:4] == ' ') // eine
					return [aString substringFromIndex:5];
			}
			if (length > 6) {
				if ([aString characterAtIndex:1] == 'i' && [aString characterAtIndex:2] == 'n' && [aString characterAtIndex:3] == 'e' && [aString characterAtIndex:5] == ' ') {
					if (([aString characterAtIndex:4] == 'n') // einen
						|| ([aString characterAtIndex:4] == 'm') // einem
						|| ([aString characterAtIndex:4] == 'r') // einer
						|| ([aString characterAtIndex:4] == 's') // eines
						)
						return [aString substringFromIndex:6];
				}
			}
		}
		else if (aChar == 'U') {
			if (length > 3) {
				if ([aString characterAtIndex:1] == 'n' && [aString characterAtIndex:2] == ' ') // Un
					return [aString substringFromIndex:3];
			}
			if (length > 4) {
				if ([aString characterAtIndex:1] == 'n' && [aString characterAtIndex:3] == ' ') {
					if (([aString characterAtIndex:2] == 'a') //Una
						|| ([aString characterAtIndex:2] == 'e') // Une
						)
						return [aString substringFromIndex:4];
				}
			}
		}
		else if (aChar == 'D') {
			if (length > 4) {
				if ([aString characterAtIndex:1] == 'e' && [aString characterAtIndex:3] == ' ') {
					if (([aString characterAtIndex:2] == 's') // Des
						|| ([aString characterAtIndex:2] == 'r') // Der
						|| ([aString characterAtIndex:2] == 'm') // Dem
						|| ([aString characterAtIndex:2] == 'n') // Den
						)
						return [aString substringFromIndex:4];
				}
				else if (([aString characterAtIndex:1] == 'i' && [aString characterAtIndex:2] == 'e' && [aString characterAtIndex:3] == ' ') // Die
						 || ([aString characterAtIndex:1] == 'a' && [aString characterAtIndex:2] == 's' && [aString characterAtIndex:3] == ' ') // Das
						 )
					return [aString substringFromIndex:4];
			}
		}
		else if (aChar == 'L') {

			if (length > 3) {
				if ( [aString characterAtIndex:2] == ' ' &&
					([aString characterAtIndex:1] == '\'' // L'
					 || [aString characterAtIndex:1] == 'o' // Lo
					 || [aString characterAtIndex:1] == 'a' // La
					 || [aString characterAtIndex:1] == 'e')) // Le
					return [aString substringFromIndex:3];
				else if ([aString characterAtIndex:1] == '\'') // L' Without space suffix
					return [aString substringFromIndex:2];
			}
			if (length > 4) {
				if ([aString characterAtIndex:2] == 's' && [aString characterAtIndex:3] == ' ') {
					if (([aString characterAtIndex:1] == 'e') // Les
						|| ([aString characterAtIndex:1] == 'o') // Los
						|| ([aString characterAtIndex:1] == 'a' ) // Las
						)
						return [aString substringFromIndex:4];
				}
			}
		}
		else if (aChar == 'I') {
			if (length > 3) {
				if (([aString characterAtIndex:1] == 'l' && [aString characterAtIndex:2] == ' ') // il
					)
					return [aString substringFromIndex:3];
			}
		}
	}
	return aString;
}

Version 5.0.3

March 3rd, 2012

A new version of the Pedias is out!

5.0.3 is ready for download; use the ‘Check for Updates’ command found under the program menu or the Mac App Store’s Updates tab to get the update.

This version addresses mostly bug fixes, especially to plug-in searches (IMDb, Bol NL, DVD Palace and Board Game Geek) and the sort feature. For a full list of what’s new and fixed in each program, check out the What’s new? pages for DVDpedia, Bookpedia, CDpedia and Gamepedia.

Doghouse Stats

February 21st, 2012

Alex again here with some Doghouse stats. The Doghouse, our new data repository for the Pedia programs, is growing nicely:

We are nearing the 100,000 mark for DVDs in our database. This is a great milestone.
We have more than 140,000 books already, awesome.
61,000 CDs, guess people don’t use those too much anymore.
But only 6,000 games. Where are the gamers out there? Or maybe there just aren’t that many games to begin with?

Here’s where it gets interesting:

Directors in our database: 23,000. Wow, that’s a lot of directors.
People in movie credits: about 360,000. Ouch! This includes actors as well as other jobs that usually appear in credits at the end of a movie.
Geeky fact: we have a table that associates the credits with the movies and this table has 1,612,713 entries in it. That’s over One Million and a Half (capitals awarded for such a big number).

There have been 500,000 contributions from users like you and 200,000 have been matched to entries already contributed. The search rate is looking quite good with 80% matching on DVDs. But we are looking at raising that number every day.

Ok, right now you’re asking yourself, why is he boring me with all these numbers and stats? Is there nothing better on YouTube? The reason is simple: all this is only possible thanks to your contributions. The people who have taken the time and effort to submit good data and the moderators who are painstakingly and lovingly checking and fixing entries. And, of course, the great efforts of the wonderful people here at Bruji *self-pat on the back* and maybe a dog biscuit.

Seriously though, without user contribution we wouldn’t have a database for us to all benefit from. But, as the old adage goes, “garbage in, garbage out”. The data is only as good as the entries that are submitted. So if you’re submitting to the Doghouse, please try to have as good and reliable data as possible, this will benefit us all and make the database grow faster since our moderators will have a bit less work and can concentrate on more productive activities like watching Monty Python videos.

And if you search and can’t find something, be sure to contribute to the Doghouse after you’ve added it to your database (preferably including the UPC at the back of the item).

Interesting search facts:

One of the most failed search terms was “Pirates of the carribean”, notice the misspelling, it should be “Caribbean“. Also “Real Steal” which should be “Steel”. So if the movie you are searching for is not there, check your spelling and try again. If you’re not sure of the spelling and don’t have IMDb handy, try different spellings or just one word “Pirates”, though this might produce too many hits, in which case, try a combination of the title and a main actor (remember to set the search window limit to “None”): “pirates johnny depp”. Or title and director: “pirates gore” (for Gore Verbinski). Above all, have fun, don’t get frustrated, it’s a database not a mind-reading app (yet).

Speaking of fun, want to watch a movie with Johnny Depp in it and not sure which one? Use DVDpedia to get all the Johnny Depp movies (set the limit to Credits) and sort the search by Release. You’ll discover a bunch of movies you probably didn’t know or forgot existed. Or you’re a fan of David Cronenberg (and who isn’t)? Same deal: limit to Director, search “David Cronenberg” and start watching from your favourite source (if available).

Right, I’m off to the dungeon, have fun with the Pedias.

SQLite GUI tools

February 13th, 2012

Hello, I am Alex. For the past year I’ve been chained in a dungeon, fed on a steady diet of MySQL and PHP. [Ed. note: We do let him out once a month to play with some CSS.] I built the Doghouse infrastructure with these technologies. Recently I started learning a wonderful and beautiful programming language called Ruby. If you have any interest whatsoever in programming languages I really recommend giving Ruby a try (more on that in a future post). I’m currently building the future Doghouse moderator section with Ruby On Rails. Working with Rails and the pedias I have had a chance to look more closely at SQLite, so I thought I’d write a short post about it.

I have a new-found respect for SQLite.

As you know, SQLite is the database ‘engine’ on which the pedias are based. It is Apple’s default database schema. Being a Mysql user for a number of years now I wasn’t really interested in this seemingly less capable new-comer. But, lately, I’ve had a lof of dealings with Ruby on Rails, whose default database engine is also SQLite and have found I really like it for certain tasks.

For those of you who are only interested in a Graphical Editor to be able to manipulate your pedia data, skip to the GUI tools below.

It’s not for every project, especially ones that require a lot of inserts or updates to your database. But it’s perfect for portable applications and web sites that rely mostly on reading and not writing data. I read somewhere that the rule of thumb is that if your database takes less than 100,000 (100K) hits a day, then you’re find going with SQLite. This is, obviously, a big simplification, but not a bad starting point.

It’s extremely easy to set up, lightweight and very portable since the whole database consists of a single file and there are no server connections to worry about. It offers all the simplicity of a file-driven database (Excel, CSV file, Access, etc) with none of the shortcomings, namely it allows for relational databases as well as constraints and triggers.

You can find lots of good articles on SQLite usability and Mysql vs SQLite comparisons so I won’t bother, instead I’ll write about the Graphical Tools you can use to manipulate these databases.

GUI Tools

So, on to the most important thing, the GUIs or Graphical Tools for manipulating SQLite databases. Sure, you can use the terminal and issue all sorts of weird commands to manipulate your databases, but c’mon, who doesn’t love a GUI?

Sequel Pro
http://www.sequelpro.com/
This is the best tool for Mysql databases on the planet, no exceptions. And it’s free. If you work with Mysql databases, do yourself a favour and get it now. And do us all a favour and donate something to the developers to keep them upgrading this wonderful product.
It doesn’t yet have support for SQLite but it’s in the works. I just had to include it here because it’s so great and I work with it everyday monitoring and tweaking Doghouse performance.

Navicat Premium
http://itunes.apple.com/us/app/navicat-premium-essentials/id466416967?mt=12
This is a capable but very pricey option. Though there is a sale of the Premium Essentials http://itunes.apple.com/us/app/navicat-premium-essentials/id466416967?mt=12 right now in the App Store.

It’s not that great-looking but will do pretty much anything you need and has the advantage of also tackling Mysql databases so if you use both Mysql and SQLite like we do, you only need one tool.

I don’t very much like the interface or the way the tables are laid out or the fact that each table opens up a new window, making for a very cluttered workspace.

Not my tool of choice, but capable.

Base
http://itunes.apple.com/us/app/base/id402383384?mt=12
This is a nice-looking SQLite manager. Much nicer-looking than Navicat, albeit with less features.

The interface is simple and very nice when reading database contents.
However, when editing the database such as adding or altering tables and fields I find the interface strange and confusing. Things are hidden away in weirdly-placed pop-up menus. Almost as if it was initially intended only for reading databases, then the editing features were bolted on as an afterthought and the developer wasn’t quite sure where to put them.

I like it a lot more than Navicat Premium Essentials but, unfortunately, it’s more expensive, almost three times the price (now that Navicat Premium Essentials is on sale).

I think this is a nice app, especially for reading data. If it were a little cheaper I’d buy it, but I’m not paying $30 for something I don’t fully like.

SQLVue
http://itunes.apple.com/us/app/sqlvue/id426397771?mt=12
They don’t have a demo version on the App Store (this really pisses me off) but if you hunt around the Internet you can find a 7-day demo on their site:

http://www.logicalvue.com//Download/SQLVueTrial.dmg

I think this tool is ok, capable and simple for SQLite databases. The problem is I tried their tool to convert a Mysql database to SQLite called SQLite Migrator and could not get it to work. The SQLite Migrator relies on Apple’s ODBC Administrator app (no longer supplied with OS X, but you can download it separately) and ODBC Administrator in itself is not simple to configure. You first have to find an ODBC driver (from where?) for the connection you want to use, then get that working inside ODBC Administrator, create a new connection with that driver and to the database of your choice, then go back to SQLite Migrator and try to connect to this new connection you’ve created in ODBC Administrator. If that works, then you can (I assume) start dealing with your migration issues.

I’m sorry, but for a tool that costs $50 I expect it to be a little easier to create a connection just to get started. The days of ODBC connectors on the desktop are long gone (there’s a reason Apple doesn’t include this tool anymore, because it was just gathering dust and taking up space in your hard drive) and this is a step in the wrong direction.

So this experience left a really bitter taste in my mouth so I can’t quite like their SQLVue product.

All these tools (except Sequel Pro) seem to suffer from opening a new window for every task. If you are looking at a table structure and want to edit it you get a new window just to add or modify a field. This makes it confusing and cluttered.
SQLite Database Browser
http://sourceforge.net/projects/sqlitebrowser/
Lastly, there is this tool. It’s free so that’s great news, but it’s buggy, crashy, hideous and hasn’t been update since 2008 as far as I can tell. It is a port of a Windows app and it shows.

For very ocassional use this tool might be OK. But if you want to deal with SQLite databases and keep your sanity, I’d recommend using one of the other alternatives.

Conclusion

Well, it’s tough to say who the winner really is. Until Sequel Pro brings out support for SQLite I think you’re better off going with Navicat Premium Essentials. It’s not great, but I think that for $10 (on sale) it’s probably your best option at this point.

I would also like to add that you can use these tools on the Pedias by pointing them to the database at ~/Library/Application Support/Xpedia/Database.Xpd (where X is book, cd, dvd or game). Sqlite is also the backend of choice for any large Core Data program (XML and binary are also options with Core Data) so it might be useful for any number of Mac programs out there based on Core Data.

Adding Page Numbers to Print Templates

January 19th, 2012

Some of the Pedias’ printing templates add an automatic page break after a certain number of entries. Starting with version 5.0.2 of the programs, this page break can be used via CSS to style in a page number at the footer of the page.

To add a page number add the following CSS code to the template inside the <style></style> section at the top of the HTML code.

body {
counter-reset: page;
}
.pageBreak {
width: 100%;
text-align: right;
counter-increment: page;
}
.pageBreak:before {
content: counter(page) " ";
}

Of course you can change the formatting or font in the pageBreak property to fit the template that you’re modifying.

Searching for Cover Images

December 7th, 2011

When you download information for an entry and no cover image is included (or you don’t like the one that came along), this is how you can search for alternatives.

Ctrl-click (right-click) anywhere in the cover image well at the bottom of the main window to bring up the contextual menu like this:

Then choose either “Download from” and select a site to search or choose “Open Google Images”. (In DVDpedia you will also see the option to “Open MoviePosterDB”.)

When you choose “Download from” and select a site, the program will search for a cover image on that particular site and download the first cover image returned.

When you choose “Open Google Images”, the web view will open and start a search on Google Images for the selected title. To make sure you get the correct image the search will also include the format or platform depending on the Pedia you’re using.

When the window with your search results appears, click on the image you want and then click on the ‘See Full Size Image’ link at the top of the window to see a larger version of the image.

Now ctrl-click (right-click) anywhere on that larger image and select ‘Make Cover’ from the contextual menu that appears to make it the cover of your selected entry. (Or if you’re impatient like Conor, just click and drag the image over into the image well.)

To finish, click the “Done” button at the top right of the web view.

Statistics 5.0

December 1st, 2011

The new statistics in 5.0 use a monochrome pallet of blues to blend in with the muted tones of Lion. A few have asked for the bright colors of before. Since our programs are based on a number of open technologies, in this case HTML and CSS to render the statistics, the colors can be customized with a little CSS knowledge.

 

Open the program’s package: ctrl-click the program icon for a contextual menu to find “Show Package Contents”, then navigate to the /Contents/Frameworks/Pediabase.framework/Resources/statistics.html. This file contains the base for building the final statistics view. Open the file in a text editor to change the colors (TextEdit requires the use of the ‘Open’ command to select the “Ignore Rich Text” option, otherwise it opens looking like a web page).

At the top of the file there is a section of CSS that defines the colors:

.vertgraph ul li {

     background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#A1B0CF), color-stop(100%,#788AB0));

}

.vertgraph ul .red {

     background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#788AB0), color-stop(100%,#4f648c));

}

.vertgraph ul .green {

    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4f648c), color-stop(100%,#263e6d));

}

.vertgraph ul .blue {

    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#263e6d), color-stop(100%,#00184e));

}

The color classes are still named after the old color scheme. What you want to change here are the odd looking hex values, “#263e6d”. The first one on each line represents the top color and the bottom color of the bar. To help select new colors and create a gradient you can use ColorZilla’s gradient editor a handy website that will let you pick a color from a palette and produce the bit of code that you need to copy.

Click on one of the stops on the bottom of the color bar, then click on the color well to change the color. Once you have established the color you would like to use for a bar, copy the -webkit-gradient declaration from the code on the left, the highlighted section and replace the above color:

Repeat four times for each color bar and save the file. You are all set now with new eye-popping colors for your statistics.

For simplicity here are similar colors to what we used to have with version 3 and 4 of the Pedias, so you can copy paste them directly into the template.

.vertgraph ul li {

    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fcd83a), color-stop(100%,#febf04));

}

.vertgraph ul .red {

     background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ef4747), color-stop(100%,#c91414));

}

.vertgraph ul .green {

     background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#139e0c), color-stop(100%,#075e0a));

}

.vertgraph ul .blue {

    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4c90ff), color-stop(100%,#1938ff));

}

If you do change any of the colors be sure to make a copy of the statistics.html file outside of the program bundle. Since the file resides within the program it gets updated when you download a new version. With a copy of the file, you can drop it in as a replacement to set your custom colors again.