Practicing Morse Code (CW) off-air can get pretty boring. Sure, you can get your iPhone app to send fake conversations, or practice various random words -- and there is value in all of that. But in the real world of high speed CW, it's all about being able to copy other people's call signs and their serial numbers.
Enter Morse Runner. This is a Windows app (runs fine in a VM) that does a great job of simulating CW contest exchanges, complete with variable speed, QRN, QRM, and fading. While I don't do a lot of contesting, I've found that Morse Runner is helping increase my immediate letter / number recognition speed. It's also a nice break from doing word practice on LCWO.
For me, the best part about Morse Runner is that it almost makes CW practice into a game. I started out with the speed set to 20 WPM, and over time I've progressed to running at 38 WPM. The app sends the simulated callers at variable speeds centered around the target CW speed, so if you set it to 38 WPM, you'll get anything from about 25 to 40 WPM. I don't usually get the 35+ WPM calls on the first try, but after a couple of repeats, I can nab 'em.
K7OG has written a connector that lets you use the N1MM contest logger to log the calls sent from Morse Runner. I'll probably give this a shot if I get more serious about contesting and want to use N1MM regularly.
What would be really cool is if you could connect a paddle + keyer to Morse Runner and have the option to send the exchanges programatically from Morse Runner as well as manually, from the paddle. This would better emulate the setup that most folks use in a contest, as well as giving you the freedom to send partial calls without triggering the automatic exchange in Morse Runner.