Posterous theme by Cory Watilo

Great software

In a running series, I’ll make mention of the software I think is great and helps me on a day-to-day basis.  In my inaugural post, I’ll plug WinSplit Revolution.  When used in combination with AutoHotkey, it makes my multi-monitor setup easier to use by allowing me to flip windows from one screen to another with the click of a mouse button.
Here is the autohotkey script I use to make the mouse control the monitor switching function.  Holding down the right mouse-button and then clicking the left mouse-button pushes a window one monitor to the left.  Holding down the left mouse-button and clicking the right mouse-button pushes a window one monitor to the right.
~RButton & LButton::Send ^!{Left}
~LButton & RButton::Send ^!{Right}

Cool Inkscape Jazz

I turned a coworker onto Inkscape recently.  Inkscape is a free open source vector graphics program that is great for making illustrations.  Don’t know if it will stick for him but it definitely has for me.  Despite a few kinks in the Windows interface around dropdowns (mainly in the font dialog), it is a very slick piece of software and a joy to work with.
Along the way, I should mention a couple other pieces of software.  Inkscape is fantastic but it definitely plays a particular role in the team of applications I use both for documentation purposes at work as well as general fun with graphics.
Paint.NET is useful for graphic manipulation and effects.  While Inkscape is capable of including bitmap graphics such as pictures as part of your illustration, it doesn’t do a whole lot of processing of regular images.  It mostly works for generating illustrations made from geometric shapes and is great for text as well.  Paint.NET is a great free, open source pixel manipulator that I use for effects and saving screen captures.
I also have to give a nod to two of Google’s free products, Sketchup for simple 3D object generation and Picasa for organizing pictures and doing basic touchups.
Here are a couple examples of things I’ve made using them:
Media_httplh6ggphtcom_qyrcw

Media_httplh5ggphtcom_mjhxe
Media_httplh3ggphtcom_gftyv

Media_httplh5ggphtcom_tydbm

So here are a couple of my favorite pointers when it comes to using Inkscape.  Hopefully they’ll be as useful to you as they have been to me.

Guides and Tutorials

First of all, Inkscape comes with excellent tutorials under its help menu.  Start there.
After those, the first place I go for a reminder or a refresher is a Quick Guide to Inkscape.  The guy who wrote it is prolific on the subject, I see his posts everywhere.  But this guide is short, sweet and to the point with good examples.  Good job.
There is also a free online version of the published Inkscape manual.  This is definitely a more in-depth reference for those advanced features like filters.
As for third-party resources, three good ones are Screencasters at heathenx.org, the Inkscape tutorials blog and Nicu’s howto.  Screencasters is probably my favorite as they walk you through the entire by showing it in video.  The “splat” with my name on it above is from one of their tutorials.
I also use the “glassy button” effect quite a bit (seen in the third picture), which is shown in this tutorial on YouTube.  The only difference I do from this tutorial is that instead of trying to draw a Bezier curve to make the rounded glassy edge, I draw an ellipse that I just use the bottom curve from.  That keeps the curve symmetric, since my hand drawings aren’t.  If you want to get really specular on the glassiness, try doing multiple stops on your white gradient.  The one above employs three or four stops.

Other stuff

One thing that I recently discovered that looks interesting but I haven’t yet used is a tool that makes animated slide presentations from inkscape pictures.  It’s called JessyInk and looks promising.  I believe you need to have an svg-aware browser to view them.  This means that in IE you need to load something like Adobe’s SVG viewer plugin, or in Firefox you may need to enable SVG viewing (had to do this on one of my installations but not another…weird) by going to about:config and setting svg.enabled to true.
That’s about all I can think of for now.

Enabling IMAP access in Exchange 2007

While trying to mail-enable Redmine for receiving mail, we added a new account to our Exchange 2007 server.
While IMAP access to the account quickly worked, the same could not be said for sending email to the account.  45 minutes later and some head scratching, we hadn’t found the way to force Global Address Book updates from the Exchange Management Console GUI, but had found the Exchange Management Shell command to do so, Update-GlobalAddressList.  Even this left us waiting 20 minutes without success.
Then, when we looked in Exchange Management Console at the Mailbox itself, we noticed it was listed as a Legacy Mailbox.  Huh?  Apparently we had manufactured the mailbox using Exchange 2003 active directory tools, which made an Exchange 2003 mailbox.
We deleted and recreated the mailbox using Exchange Management Console.  It showed up in the GAL!  I could send email to it!  But I couldn’t log in through IMAP anymore!  Bah.
After much gnashing of teeth and research, a few tools were necessary to do the troubleshooting.  First, using the Event Viewer to look for authentication events on the Exchange server was necessary.  It showed some Success Audits from my earlier logins with the 2003 mailbox but none (not even failures) for the 2007 mailbox.
Using telnet to go to port 143 (the default IMAP port) showed that the IMAP service was indeed running.  The Exhange Management Console also showed that IMAP access was enabled on our mailbox.
We then used the “Set-ImapSettings –LoginType PlainTextLogin” command to allow us to issue cleartext passwords through our login session.  From there, two important pieces of information clued us in.
The first was that using the “0 login <username> <password>” IMAP command to log into another existing mailbox worked.
The second was that we noticed a Success Audit in the Event Viewer for a logoff of the new mailbox when we hadn’t done anything.
The theory is that the old mailbox was still hanging around because of my prior IMAP login (or for whatever reason) and the name was blocking access to the new mailbox of the same name.
Bingo: delete the mailbox and make a new one with a different name.  Login through telnet works!  Set the logintype back to SecureLogin and login through an IMAP client works!  Sending email to the account works!
And only a couple hours spent.  Could have been worse I guess.

Redmine plugins

I’ve found a number of the Redmine plugins to be innovative and look to be very useful.  Aside from the installation process being, well, command-line driven, they are simple to install and configure, for the most part.
Nothing against the venerable command-line.  I’m perfectly comfortable there.  However, with such a beautiful interface all around, seeing a prompt is fairly ugly in comparison.  And the actuality is that the platform-neutrality of a web interface gets muddied when you have to use the CLI due to the inevitable vagaries of cmd.exe versus bash, etc.  Proper environment variables and such are flies in the ointment.  Module and theme installation page in the Administration section, anyone?
But back to the plugins, the ones I found interesting were:
  • Code Review – automatically create and track issues by commenting on code in the repository.  Slick!
  • Question – Turn issue comments into questions directed at particular users (such as other developers who might have some useful knowledge).  Generates emails.  Great for knowledge capture that might otherwise be lost in forums or emails.
  • Embedded – Create a new tab that allows you to embed non-frames html files.  Useful for auto-generated html such as code documentation, test and coverage reports, etc.
Plugins that are interesting but I had trouble with:
  • Simple CI – Simple monitoring of continuous integration status via an RSS feed.  Looks rudimentary but useful, since the build server is the only important infrastructure not tied into Redmine, but it claimed my TeamCity RSS Feed was invalid even though it worked fine with Outlook.  More troubleshooting.
  • ezLibrarian – Resource reservation/tracking tab for things like books, machines, etc.  While it looks good in theory, the installation left incorrectly labeled tabs and fields.  Looks like an issue with the localization files (the author is not a native English-speaker).  The link given here is also not up to date, as I was able to get a more recent version from his github repository.  However, it did no better.  And what is Booty bay?
  • ezFAQ – from the same author.  A promising looking FAQ generator.  The docs say it doesn’t work with the 0.8.x series however, which is the latest stable.  Too bad.  It also modifies the Redmine core, which makes me leery.  Pass.
More to come on these as they actually see use in our production.
One note about configuring plugins after installation.  While most do not have a configuration section on the Administration > Plugins page, some do.  Some rely on custom fields in the projects, some do not.  Some add settings tabs in the projects.  All need to be enabled in Project > Settings > Modules.
The real trick, is however, that roles need to have permissions enabled on the new module as well.  Administration > Roles and Permissions takes you to the right place.  Look for the new module under each role and choose the appropriate permissions.  Most modules give no rights to any roles by default.

Relocating TeamCity build agents

I logged into TeamCity today and was surprised to see no active agents.  Further investigation showed that I had entirely lost the connection between the server and the agents.  This is bad.
Fortunately, there was nothing seriously wrong.  We had moved the build agents and build server to a new VM server, which had necessitated converting the VM format and installing a new set of VM tools (VMware Server => ESX).  Evidently this was enough to confuse the TeamCity server.
After verifying that IP connectivity was working, I restarted build agents.  Upon restart, the agents reconnected to the server, however they were not recognized as the same as before.  This means I lost the configuration associated with these build agents.  Since our build agents are specialized to build for different environments, I lost the mappings for particular projects to go to particular build agents.
Fortunately, TeamCity makes this kind of stuff pretty easy.  A few clicks later and I was back in business.  While it would be nice if TeamCity were a bit more resilient to changes and could recognize the agents better, this wasn’t too difficult.

Redmine themes

There doesn’t appear to be a lot of documentation or reviews on the various themes for Redmine.  There are a few themes provided on the Redmine Themes List, along with one I found outside the list, Modula Mojito and its sibling Martini.  While they all look reasonably attractive, I had to try a couple to get a feel for any difference.
I tried two from the official theme list, Squeejee and Watersky.  While both initially seem like just color redefinitions of the basic Redmine UI, Watersky caught my attention because of its use of the famfamfam silk icons and the more light-hearted blue.
Whether these differences are more than skin deep remains to be seen.  Fortunately, Redmine makes it extremely easy to switch themes.  Just unzip the theme into the themes directory and restart the Redmine service, then choose the new theme from the Settings page.
Noteworthy is the SP theme, which is not yet released but is most assuredly a deep reworking of the Redmine UI.  Be sure to check out the demo which is just amazing.  Very professional and sure to be a virtual requirement for Redmine usage soon after release.  Fortunately the designers, Shane and Peter, have agreed to open source the theme.  Hopefully this will work itself in (as the default theme?) the mainline Redmine distribution.
Great work!

Moving Redmine Wiki pages and Connecting to the Bitnami MySQL instance

Apparently, you can’t move wiki pages between
Redmine projects like you can with Redmine issues.
I found this out because I was trying to rename a project’s URL in Redmine, but once the identifier is assigned, I guess you can’t do that either.  Or perhaps you can using a similar method to what I discuss here, I just didn’t think to go back and try mucking with the ID directly in MySQL.
In any case, the next best thing is to go into the MySQL tables and reassign the wiki_id of the pages you want to move.  So I made my new project, then tried to find a client with which to manipulate the tables.
I’m running Bitnami’s Redmine 0.8.4 on Windows, and after a little while I came across the MySQL GUI Tools Bundle.  They have a nice Windows installer, which worked fine.
The only trouble I had initially was getting the credentials.  I didn’t have any network issues, as I loaded the tools directly on the same server.  When it asked me for the connection details, I found I had to look up the username and password.  These are stored in Redmine’s database.yml file, under the production instance, which is located in Redmine’s config directory.
The GUI Query tool complained that I didn’t specify a default schema, mainly because I had no idea which one’s were available.  Apparently Bitnami gets in on the act here, since once I was able to open the database I could see the schema name is actually “bitname_redmine”.  This was ok by me.
The last piece was actually getting the identifiers and issuing the update.
From the “wikis” table I was able to get the id (not “project_id”) of the wikis in question.  I had to do the select manually since there didn’t seem to be a simple way to make the tool show me the table contents automatically.
Then the query was something like:
UPDATE wiki_pages
SET wiki_id = <new>
WHERE wiki_id = <old>
Executing the query worked, and then I was able to list all of the pages under the index of the new Wiki through Redmine.  One last touch was to copy and paste the contents of the old start page to the new start page manually.  Then I deleted the old start page and I was done.