Working Towards Inkscape Release 0.91

It’s been over a year since Inkscape‘s last release, version 0.48.4, and we’re working towards producing a new release in the coming months. We’ll be numbering this 0.91, as we’re planning to aim for a 1.0 release once we feel the quality is up to snuff.

The long delay since the last release is mostly because we’ve replaced the internal renderer, libnr, with Cairo.  Overall, switching to Cairo has brought many fixes and performance boosts, but as can be imagined there are corner cases where things have regressed, so those have occupied developer attention.  Currently we know of several performance regressions we believe are related to Cairo.

We’ve just completed a bug-fixing spree targeting regressions in particular.  We’re hoping for 0.91 to be as regression-free as possible compared with 0.48.4, but accept that we may have to compromise on a few of the more intractable bugs.

Next, we’ll be engaging in a larger scoped bug hunt, to try to fix as many general bugs, with emphasis on the remaining regressions and on some of the oldest bugs in our tracker.

The Inkscape community is really bustling these days, adding features, speaking at conferences, and prepping for the upcoming release.  We’d love to welcome back old Inkscapers, and invite new developers to come join in – Inkscape’s a very friendly community, and there’s plenty to do and good docs on how to get started.  There are tons of patches in our bug tracker likely ready to go, but just need folks to review and test them to make sure they don’t have undesirable side-effects.  Many of Inkscape’s bugs are well defined with reproducible test cases, and oftentimes a fix is obvious after studying the code a bit, so even newbie developers can have a huge impact on the next Inkscape release’s quality.  Come join in!

Drawing Grids with Cairo and Hamster Graphics

A while ago I discovered a nifty python-cairo graphical animation codebase produced in association with the Hamster Time Tracker project. It includes several snazzy experiments, but I can’t tell whether it’s been used for any “real” projects outside Hamster.  Could be a nifty way for prototyping simple 2D games.

My particular interest is with strategic style games, and many of those utilize either square or hexagonal grids.  A lot of PC strategy games adopted square (or square isometric) grids, partly because they’re simpler to implement.  But as a kid I found wargames and Traveller in particular to be fascinating, and so I’m most interested in games using hexagonal grids.

The core object in Hamster Graphics is the Sprite.  So I’ve modeled the hex map by making each hex a separate sprite.  This allows for per-hex interactivity and animation, which is pretty cool.

However, for large maps, having each hex implemented as a Sprite subclass proved to use too much memory.  So instead I’ve created lightweight GridElement classes that you can use to define your game map, and which generate the corresponding Sprite only as needed.  This way, if you have a 1000×800 hexagon map, but the user can only see a 20×15 section of the map, you only need to have 300 sprites active.

I’ve implemented a simple example of this code, which implements hexagonal, rectangular, and triangular(!) grids.  When the mouse cursor hovers over the hexes they light up.  The top left and top right hexes can be clicked on, which toggles the grid between the three different shapes.

Math Contests in the Pacific Northwest

The first day of the last math class in my university education, the professor said, “Many of you will go on to illustrious jobs in engineering and science, yet what we’ll learn in this class is so deeply theoretical that none of you will have any use for it in your careers. Nor will your children, but they might figure out what it’s good for, and your grand children might put it to actual use in their careers.”

To say it was a difficult class would be a massive understatement. I knew I was in deep trouble after the first quiz. I needed help. Fortunately, one of my classmates was Tom Clymer, one of the smartest (and nicest) people I’ve met so far in my life, and readily joined a little study group with me. I was fortunate because he’s a math freak of the highest caliber; we didn’t need calculators when we studied with him, because he could do the arithmetic faster in his head than we could type the equations into the devices. To make a long story short, I can’t say I aced the class, but I did pass, and I owe it all to him.

After grad school, Tom scored a job at JPL, but later left to pursue his true passion – helping our young people hone their math skills. He authors math tests for competitions around the Northwest and has organized them for his daughter’s school district.

The reason I’m writing this is because this week Tom has organized a kickstarter campaign to organize math contests around the Northwest. Please watch his video and consider making a contribution to Tom’s endeavor. With all the cuts being made to school programs everywhere, this is something meaningful that we can do to help inspire today’s children to find something use for that godawful math Tom and I learned at Caltech.

Tom Clymer teaching Calculus

mv_smart

Doing a bit of spring cleaning on my filesystems, I found myself with several directories that had mostly the same files that I wanted to merge together.  Of the files the directories had in common, a few were different and would need examination, but the rest would be identical and could simply be discarded.

Basically I needed a more powerful version of `mv -n` which considered md5sums.  Here’s the script I cobbled together to solve this:

#!/bin/bash

DEST=${@: -1}
FILES=${@:1:$(($#-1))}

for file_path in ${FILES} ; do
    if [ -d "${file_path}" ]; then
	echo "${file_path} is a directory"
	continue
    fi

    file=$(basename $file_path)
    echo ${file}
    dest_file=${DEST}/${file}
    if [ ! -e ${dest_file} ]; then
	mv -i ${file_path} ${dest_file}
	continue
    fi

    a=$(md5sum $file_path | cut -d' ' -f1)
    b=$(md5sum $dest_file | cut -d' ' -f1)

    if [ "$a" = "$b" ]; then
	# files are the same; keep destination copy
	#echo "$file is already in $DEST - $a = $b" 
	rm $file_path
    else
	echo "$dest_file exists and differs from $file.  Skipping."
    fi
done

Nothing terribly special, but since then I’ve found this handy in more than a few cases, so I’m posting in case others might find it useful too, or could suggest improvements.

1 2 3 4 5 31 32