One of my most frequently requested posts is my initial exploration into using Ruby to export my Groupwise calendar to iCal format. The code I posted there was simple, and it almost worked. I figured that’d be the jumping off point for a lot of people to dive in and explore the options Ruby has from there. In retrospect, though, I should also have posted my final version that I worked out a few weeks later.
So now I’d like to introduce timshadel.com/code. It’s the start of a simple public Subversion repository where I can share my half-baked code ideas, and where you could watch some of my ideas evolve over time. I’ve run across several small scripts and even medium-sized projects that I figured might be worth sharing, not because they’re stellar code showing the best kind of professional attention to detail, but because there was some aspect about them that I thought was fun to play with and I always like to see examples to start with when I’m investigating a new topic.
So, without further ado, proceed to the full version of my script that turns Groupwise calendars into working iCal files. Please note that I no longer use Groupwise, so I’m not likely to make any more improvements to it, but as it stands it should be able to dump not only your appointments, but the attendees and their email addresses into a format that even Google Calendar can read. Also note that Google Calendar may send reminders to your invitees; so watch out.
If you’ve got comments or improvements, feel free to share them in the comments.
Building internal IT systems is as much about the data that passes through your application as it is about the logic that operates on it. I’ve scanned log files of web servers for years. I often use a combination of grep, sed, and other tools to look into specific problems. These are often one-off curiosities that don’t require a GUI.
Since before taking over management of this team in July, our app has had some long-running cases where we see ERROR level items in our logs. Some I question whether they should be logged as errors, while some are disconcerting. The application works well overall, but in the spirit of No Broken Windows I’d like to clean up some of the sources of these errors.
Here’s a little snippet of the JBoss log file, showing some standard log output from Hibernate:
After a minute or two I formulated this little command-line string to give me a count of the classes that had the most errors:
This cuts through the log file, locates only errors, slices out the classname from the log message, sorts the remaining list, and then counts up the number of times each classname appears in the sorted list.
Interpreting these results can be a bit tricky. I take it really informally. This doesn’t represent the number of bugs in the modules, or even the classes with the most software defects. For me, this is simply a list that shows from among the classes that do log errors, which classes have experienced conditions that trigger those error logs most frequently. For our setup, that usually means that there’s some data from another system coming in that doesn’t meet some assumptions. Other causes may include intermittent connection problems to other systems that just get noticed on one part of the code.
I’m not certain of the exact outcomes that will result from this little discovery exercise, but I’m betting that our code will be a bit cleaner and a bit more robust for it.
Tonight we’ll be deploying the first beta of a major new feature of our product that my team’s been working on since September. Don’t get me wrong, we’ve release updates to our product every two weeks. Our branching strategy is such that we have one month cycles on /trunk that branch on release, and are followed up by a second release two weeks later with some new functionality, but no major restructuring. That keeps us building along happily every two weeks with a way to take on bigger work on the four week branch.
Pieces of it have been growing in the app for some time, but tonight we flip on the central piece for a few small groups. We had a hectic day yesterday, and ultimately discovered a networking problem two teams away that prevented us from hitting our well-publicized deadline last night (always make sure to setup your QA environment as closely as possible to your production environment). All that should be resolved today. Everything’s done.
Now there’s nothing more to do for this release but sit and wait to see which way the wind blows.
Release team took 3 hours to respond to the build request I spent all early-morning working on. That made it very late for the QA guy.
When we sent an updated release, they asked for us to re-email something we had sent just 1 hour before.
I can’t get a login to my dev machines without going through the generic HelpDesk ticket system. I can’t select the appropriate party to assign the ticket to. I’m stuck with no access.
I can’t have more than 100 MB of email space. Today I had to dump all my archived mail to mbox for the 2nd time in one month.
I can’t get access to the hardware load balancer configs without going through the generic HelpDesk ticket system either. I just guessed about where to assign it. It’s now lost in neverland.
The release team doesn’t own the boxes they build on, so 90 minutes after my second request they were still trying to build but running out of disk space on some partition they had no rights to. They are now planning to build on another machine, and aren’t interested in my local automated build system’s binary output. (It’s all done and even automated on our side, but _they_ haven’t done it yet.)
I can’t connect via POP to pull mail from a common mailbox to streamline turning customer requests into JIRA issues.
Virus scanners eat gigantic portions of my team’s CPU cycles, to do nothing useful, effectively reducing the speed of the CPU purchased by the company.
They’re recently installed BlueCoat and have institutionalized the Man-In-The-Middle SSL attack for all outgoing SSL traffic.
I must write English instructions of how to deploy my application, and then have them executed by a person that has access to the boxes, but very little knowledge of the application. I cannot run any automated commands to accomplish this process.
So today I’m grumbling because I have a different set of priorities that others in the company. That’s life, but today I’m grumbling.