qmake and the Info.plist File

I use the Qt library and qmake to build my bloodstain pattern analysis software. qmake is a great tool for cross-platform development because it lets you use one relatively succinct description [a .pro file] to generate Xcode projects, MSVC projects, and makefiles. On the Mac OS X side of things, I use one qmake .pro file to generate three xcode projects: release, beta, and demo. My directory structure looks like this:

Example File Structure

Example File Structure

Overall this works well, but there’s an issue with the Info.plist file.

Continue reading

WP-Syntax Style Sheet Order Fix

I’m using Ryan McGeary‘s excellent WP-Syntax plugin for syntax highlighting of code in WordPress. [It is now maintained by Steve Zahm.]

Update [7 Apr 2014]: I’m, uh, no longer using Ryan’s WP-Syntax plugin… I switched to Crayon Syntax Highlighter so I could have more control over the layout. The examples below are using Crayon now.

Without the plugin, simply using the <code> tag, code looks like this:

/* Hello World program */

#include <stdio.h>

int main( int argc, char *argv[] ) { printf("Hello World");

return 0; }

With the WP-Syntax plugin, it is formatted to make it much more readable:

One problem with the plugin though is that the CSS style sheet for the plugin is being included after some external Javascript in the head element of the HTML document. This prevents some browsers from loading the CSS in parallel which can delay loading of the page. A good way to catch these kinds of things is to use Google’s Page Speed plugin.

Continue reading

Techozoic Fluid Child Theme CSS

So I’m using Jeremy Clark‘s Techozoic Fluid WordPress theme for this site. Kinda cool, eh?

Update [27 Mar 2017]: I’m now using Raam Dev‘s Independent Publisher as my base theme.

I wanted to modify and minify the style.css file and make a couple of other changes. Given these other changes, I decided the best solution was to make a WordPress child theme. So I followed the instructions and expected that the header would reflect my new style.css file.

Alas, taking a look at the page source, it did not:

So I took a look at themes/techozoic-fluid/header.php, and found the problem on line 76:

It looked like get_template_directory_uri() was returning the main theme’s directory, not the child theme. Sure enough, the docs state:

In the event a child theme is being used, the parent theme directory URI will be returned, not the child theme directory URI

The fix was simple. Changing it to the following grabs the css file from the child theme:

Voilà!

QImageWriter and Writing JPEGs

If you are using the QImageWriter class in Qt to write JPEG files, you may have noticed that it creates large files.

For example, saving out a capture of a window in my app resulted in a 332 kB file. If I run that through ImageOptim [mentioned previously], this is reduced to 266 kB. Huh? What’s happening here?

Digging into the code, I looked at what jpegtran [which is what ImageOptim is running] did to reduce file size. It turns out there are two options you can turn on in libjpeg to reduce file size when writing out JPEGs: optimize and progressive scan. These are both lossless operations, so by turning both of these options on we can reduce the size of the image files without sacrificing any quality.

If I turn on just the optimize option, the file size reduces to 287 kB. Turning both optimize and progressive on reduces the files size to… 266 kB – the same as ImageOptim.

I should also note that writing PNGs using QImageWriter is almost useless given the size of the files it produces [at 100% quality]. The same window capture I mention above results in a 6.6 MB PNG! This can be reduced to a much more manageable 242 kB if you run it through ImageOptim. The problem is, unlike JPEG, the time to optimize a PNG is not trivial, so even if there are switches to do something similar, the time it takes to optimize would result in long delays writing out the PNG file. I haven’t fully investigated this, so there may yet be a solution.

To handle the JPEG issue, I filed a Qt report and patch: Support additional JPEG write options: ‘optimize’ and ‘progressive’ [QTBUG-20075].

The patch modifies the following files:

  • src/gui/image/qimageiohandler.cpp
  • src/gui/image/qimageiohandler.h
  • src/gui/image/qimagewriter.cpp
  • src/gui/image/qimagewriter.h
  • src/gui/image/qjpeghandler.cpp

It adds two options to the QImageWriter class: ImageOption::Optimize and ImageOption::Progressive. It is used like this:

Magic! Smaller JPEG files for free. I hope this patch will eventually make its way into the release version of Qt.

I can’t see any reason why the optimize option within libjpeg defaults to false in the first place – any ideas?

(19 Jan 2015): I submitted a patch for this which has been merged into the Qt codebase. This fix will be part of Qt 5.5.

ImageOptim

ImageOptim is a cool tool by Kornel Lesiński for Mac OS X used to optimize images. Why would I want to do that you ask? It reduces the size of images so they take up less disk space. This means if you are working on a website, it will load a little faster for your users. If you are working on games, it can reduce the amount of data being sent to the GPU which can speed up the loading of textures [make sure you are using lossless compression of course].

ImageOptim is a front-end to several image optimizing tools including AdvPNG, OptiPNG, Pngcrush, JpegOptim, jpegtran, and Gifsicle. It works on PNG, JPG, and GIF images.

ImageOptim Example

ImageOptim Example

Photoshop is especially bad at creating small files when it saves them. It’s incredible the number of images on the web that can be optimized to save everyone time and money. Anyone running a website should consider using ImageOptim or a tool like it on their images.

QSignalMapper Example

Qt is a great development framework. I’ve been using it for years and I’m still discovering new & improved ways to do things. For example, I had a rather clunky bit of code to put menu items in the help menu which would open up various pages on my website.

myMainWindow.h

myMainWindow.cpp

Wow. That’s chunky code. Any additional menu items required a declaration of another one line function which of course meant modifying the header and the cpp file. Messy.

Then I discovered QSignalMapper which let me tie a QString to a given QAction so I would only need one slot to handle any URL opening.

Continue reading

IMoL: Update From Durban, South Africa

IMoL logo from original 2003 blog Well I’m in Durban and almost out of time!

(Note: This is a post from my 2003 travel blog IMoL: Travels and Travails.)

I left Storms River for Port Elizabeth where I stayed only one night then headed to East London. I stayed at a place called The Sugar Shack right on the beach – a surfer’s hostel. I met a surfer dude named Andy who is my age and working there and saw what could have been had I become a surf bum…

From East London, I headed up to Hogsback in the mountains to do some hiking. Tolkien used to live in this area when he was a boy and rumour has it the Misty Mountains and some of the other things from The Lord of The Rings came from this area. I can see why people might think that as it is quite stunning.

After a couple of days there, I went to Cintsa, back on the coast. I did a day trip into the Trans-Kei and visited a job creation project in the area. They have a little village where they do tours to show the traditional lifestyle of the people. In order to maintain and expand the place, they cut down alien wood (trees that are not indigenous to South Africa) to make furniture, they create leather goods, and they sell seedlings to local farmers. It was quite interesting and I even joined in with the traditional healers to do a little dance and bang on the drums. We also visited a ship wreck on the coast, where we saw lots of dolphins, and stopped at a nice lagoon for a swim and a bit of cliff jumping.

From there, I went to Coffee Bay where I partied a bit, chilled on the beach, and took a drumming lesson. Last night I arrived in Durban to pick up some more anti-malarial drugs before heading up to Swaziland. Unfortunately, I’m almost out of time, so I’m going to have to skip KwaZulu-Natal to get to Swaziland and Kruger. I guess that leaves me some things to do when I come back.

Talk at you later.