I set a bunch of goals for myself last year, publicly, and while I didn’t meet them all exactly, I think it was a worthwhile exercise, and really helped to focus me throughout the year. One of the activities that Brian H. Prince suggests in his “Driving Your Career” series is very similar: sit down every year and figure out what your goals are, because they may change from time to time.
I’ll have a number of personal and internal-to-my-employer goals that I won’t list here, so what follows is only a subset of my overall goals set:
- Read books. I’ve already purchased way more books than I need to. Attending the book club that I helped organize last year is practically out of the question due to schedule changes, but among the books I plan to read on my own include: Domain Driven Design, at least one F# book, Beautiful Code, James Bender’s new TDD book, among other non-dev books like Soul of the Lion and Atlas Shrugs.
- I don’t really have any certification goals, but to keep my PMP I probably need to get some PDUs this year. Attend PMP user group meetings and sessions, that sort of thing.
- I will put at least one app into an Android Marketplace, hopefully one free app and one pay app.
- Conferences and presentations a-go-go: I’ve already got speaking engagements scheduled at two conferences in Louisville and Detroit, not to mention a remote speaking engagement for a college, and probably other events as the year goes on. I also intend to attend the normal array of events, including Stir Trek, Central Ohio Day of .NET, GiveCamp, etc. My goal last year was 3 speaking engagements. At this rate, I’ll quadruple that in this year.
- User group involvement: as an officer of the local .NET group now, I will definitely be involved in a major way for regular meetings and special events. I doubt this will involve much speaking, as it will a lot of behinds-the-scenes work, which is totally fine. I will do my best to help this community grow and improve as much as I can, not only in CONDG, but the community as a whole.
- Project Euler: while I definitely overachieved on this last year, the amount of time I’ve spent on it in the last quarter has dropped drastically. I’d like to get at least another 25-30 of these problems knocked out this year.
- Blogging: I’m nowhere near the volume I used to do in the pre-MBA, pre-children days, but my blog posts are rising back up, in volume certainly, but also in quality (I hope). This is in major part due to the much more interesting and fulfilling work I’m doing full-time these days.
I have some other surprises up my sleeve too, which I won’t reveal until the appropriate time. Suffice it to say, I’m very, very busy, but this could really be a red-letter year for me (and my family, of course).
So: keep me honest. If you see me slacking, or haven’t heard from me in a while, beat me over the head on Twitter, or in a comment here, or in person for that matter.
A project that I’m working on has a number of web pages that need to be tested for performance, and the tool we’re using is Visual Studio Team System 2008.
Previously, I had a single ‘web test’ that sent out a ‘get’ request to every page that needs performance tested. This works fine, but has room for improvement: it’s difficult for me to make changes en-masse to each of these pages. For instance, if I want to send out a ‘get’ request before each report that clears various caches before running the perf test, so that each page is running against a ‘cold’ database and web server. I could put each test in its own webtest, but now I’m essentially copy & pasting everything, and as the number of tests grow that can be a real hassle.
So I took a queue from collegue Mel Grubb who is an expert on using T4 to generate code. I decided that a T4 template is the best way to maximize flexibility while minimizing work. To add a T4 template, just create a file with a ‘tt’ extension. This should work in Visual Studio 2008 (SP1?). I created a template not dissimilar from this one:
I simply lifted the XML in TestXml from a WebTest that VS built for me (all those test files are just plain old XML). I plugged in some string.Format stuff where necessary. I then have a hardcoded dictionary that contains all the information I need to generate individual web tests. Once I save this template, I’ll have files “BrowserReport1.webtest” and “BrowserSummaryReport.webtest”, etc. I have to add those files into the project manually, but there are ways of adding those files automatically with T4. Since this is something of an adhoc situation, I’m not really concerned with that at this point.
Now to run those tests, just go to ‘test view’ in Visual Studio, select the reports you want to run, click the “run selection” button (looks like a ‘play’ symbol) and away you go:
Since I’m looking at performance, I had to add columns for Start Time, End Time, and Duration to the “Test Results” window by right clicking on the header and using “Add/Remove Columns”.
This approach saves me time, because to add a new test, I simply add another entry into that hard-coded dictionary. To make tweaks to all the tests (add/remove/update those cache-buster hits, for instance) I simply make the change in the single template.
I can’t possibly thank and praise everyone who deserves it, but here goes:
Thank you Jim Holmes and the whole CodeMash board for doing all the tough grinding that goes into the delicious CodeMash sausage. Best dev conference in the world.
Thank you all the amazing speakers, including but not limited to: Shawn Wallace, Jon Kruger, Phil Japikse, Chad Fowler, Josh Holmes, Joe O’Brien, Bill Sempf, everyone! Your hard work results in insightful, inspiring sessions.
Thank you to all the awesome sponsors, including but not limited to: Rich Dudley (ComponentOne), Bart, Tim, and all the Quick Solutions guys, Pillar guys, Sophic/Improving Enterprises guys, Brian Noll and JetBrains, everyone! You guys have possibly the most thankless jobs at CodeMash–your hard work and efforts are noticed and appreciated.
Thank you to all the random friends & acquaintances (new and old) that I sat down with during meals, cocktail parties, at the bar, in the game room, etc. Including but not limited to: Arnulfo Wing and the other munchkin guys (Matt Ruma and Johannes), Dean Weber, Seth Petry-Johnson, Alexei Govorine, Kendall Miller, the guys from the MonoDroid open space (Kirk and Jeffrey), Kevin Hazzard, and, well, we would be here all day if I had a better memory. Some of the best parts of CodeMash are the conversations outside the sessions.
Thank you to the Kalahari staff. A crowded hotel packed full of nerds has to be challenging sometimes, but the service and friendliness from every staff member is never short of amazing.
Another big thank you to Bill Sempf, who gave me the opportunity to contribute in a small way as a presenter, among a lineup of superstar speakers that I otherwise have no business even being mentioned in the same breath. Bill is a remarkable man.
That wraps up another stellar CodeMash. Now I need to get cracking on my personal & professional goals for 2011.
I got a Literati eReader from The Sharper Image for Christmas. The hardware itself isn’t half-bad, but the software is atrociously lacking in features. So how do I hack this thing to make it better?
Well, I haven’t been able to, yet. But here’s what I’ve observed so far:
- It’s running some form of Linux. I don’t know this for a fact, but based on the GPL/LGPL/BSD/MIT license information in the manual, and what I’ve read about it in reviews, it’s a safe bet.
- The firmware can be loaded from an SD Card by holding down “Q” while powering on. I don’t have a copy of any firmware to work with though…
- A port scan of the device when connecting to my router reveals ports 25, 110, 119, 143, 465, 563, 587, 993, and 995 but I’ve be unable to connect to any of them to do anything useful or get any useful information.
- There is a file “.kobo/Kobo/Kobo eReader.conf” file on the internal storage that can be used to hijack the “Store” tab in the software to a web address of my choice. This isn’t particularly useful, as I haven’t yet determined if it runs JavaScript, and if there’s any way to use that to my advantage anyway.
That’s all I got on the software front. I also cracked the thing open to see if there’s anything easily hackable in the hardware. I couldn’t find anything, but here’s how I did it in case you’re interested. Make sure to turn it off first:
- Gently pry and slide off the white portion first.
- Unscrew the two screws holding the gray portion on, and then gently slide it off as well.
- Voila, open. Be careful not to touch the “reset” button while you’re working.
- Here’s the external SD-card slot and a bit of the LCD.
- This is a shot of the circuit board below the screen. The white connector goes to the external USB jack.
- The main circuit board is double sided. I couldn’t get a good shot of the other side without cutting wires.
- I assume this is the connection between the screen and the main circuit board. I believe the battery is right behind the LCD.
Make sure not to lose any of the tiny screws. I used a small pocket knife as a screwdriver, but obviously a glasses-repair sized phillips head would be preferable. There are four tiny black screws that hold the main circuit board in place, but as you can see above, there’s plenty of solder and wiring that keep the main board from really going very far.
I was hoping to find an SD card or some sort of internal USB port, or…something. Unfortunately, everything looked very hard-wired and unhackable (at least unhackable by me).
All-in-all, a disappointing experience. I post this with the hope of either saving someone else the time, or helping some smarter hacker than me to spark an idea.
One of the standard Android buttons that is required to be on every phone is the “menu” button. This brings up a little options menu on the bottom of the screen with icons and text labels that perform some action. For instance, on the main screen of the official Twitter app, you’ll get an options menu with two buttons: “Settings” and “Sign out”.
It’s easy to add an options menu with MonoDroid.
In the activity class, just override two methods: OnCreateOptionsMenu and OnOptionsItemSelected. The first one will construct a menu when the user hits the menu button. The second will respond to the action they clicked. Here’s how my code looks right now:
OnCreateOptionsMenu
The “Add” method overload on the IMenu that I’m using takes arguments: groupId, itemId, order, title, respectively. GroupId and ItemId almost seem arbitrary to me at this point. Order is the numeric order of how the options will be displayed, and title is the text that will appear with the icon.
Note that there is no Add overload with a parameter to specify the icon. I added a refresh icon to the project (since MonoDroid doesn’t seem to have Android.R.Drawable.IcMenuRefresh yet for some reason) named “ic_menu_refresh.png”, so once I get the option added, I turn right around and give it an icon with the SetIcon method.
OnOptionsItemSelected
I’m switching on the title of the option selected, which may or may not be good practice, but it works fine. You could also switch on the ItemId (see above) if you want. Note that the “ToS” is just an extension method that I wrote because I was tired of getting jerked around by the weird Java string/ToString stuff. The “Refresh” option only calls the Refresh method that I’m using elsewhere. Finally, while the default case might never happen, notice that this method returns a “bool”, so it’s a good catch-all that leaves the rest of the work to the super class.
That’s option menus in a quick nutshell. An easy way to add common functionality without junking up your layout. Feel free to take a look at the complete code at my MonodroidStockPortfolio project on GitHub.
After the recent Gawker issues, I decided that I need to take a better approach to password management. I saw someone tweet about LastPass (“the last password you’ll ever need”), so I decided to give it a shot. It’s an online “vault” for all your passwords, coupled with plugins for every major browser (including an extension that is available for the new Opera 11 and its new extension framework). Most browsers have password managers built in, but this one crosses over each browser, and indeed, each computer where you have LastPass plugins installed. So if I happen to be using Chrome on my desktop to create a new account somewhere, then LastPass will save that username and password to an organized vault. Then later, if I happened to be using Opera on my laptop, LastPass will pull that login information for me.
Additionally, LastPass will optionally generate very strong random passwords for you. And if you need to retrieve your password at any point, you can view your entire vault through the browser plugins, or login to their site.
Give it a try. If you use the same password everywhere, or are constantly forgetting your passwords (like me), then LastPass may be just the thing you need. Just make sure your LastPass password is very strong, and not used anywhere else.
One of my concerns about my MonoDroid app is that the more features I add, the messier the code is getting. I’m not using an IoC container, for instance, so all my dependencies are hard-wired. I couldn’t figure out a way to hook up one of the great IoC containers out there already (StructureMap, Ninject, etc) without resorting to the service-locator pattern, which really doesn’t get my code less messy (though it does prevent hard dependencies).
With that in mind, I looked to figure out a way to get ‘hooks’ into my app somehow to provide a central place to wire up my dependencies and inject them where necessary. My first thought was to use PostSharp. While this approach may or may not ultimately be the best one, PostSharp is such a terribly useful tool, that I’m bound to want to use it for something else anyway. A quick glance at PostSharp docs indicated that it might be Mono compatible, but what about MonoDroid?
I fiddled with it for a while, posted on both the MonoDroid mailing list and the SharpDevelop forums, fiddled some more, and with some help from Gael, got it working rather easily.
Step 1: Download and install PostSharp.
Step 2: Add a reference to PostSharp.SL.dll to your MonoDroid project. Yes, you read that right, the Silverlight PostSharp library.
Step 3: Add a file PostSharp.Custom.targets to your MonoDroid project with the following contents:
Step 4: Compile. At this point, you shouldn’t be getting a build error, and you should probably get a ‘warning’ message from PostSharp in your VS output window saying that you don’t have any aspects yet, dummy!
Step 5: Create an aspect. Here’s a (pretty useless) sample aspect that I used to test with:
Step 6: Use the aspect. In my case, it was simple as decorating an arbitrary method with the aspect attribute that I just created.
Step 7: Done! You can now use all the PostSharp AOP goodness in your MonoDroid app that you want to. Below is a logcat screenshot of my aspect in action.
Note that this scenario (PostSharp on MonoDroid) is not supported officially by SharpCrafters, so if you run into any problems, you’re more or less on you’re own. Gael was kind enough to push me in the right direction, and he might help you too, but don’t count on it.
It came to my attention recently that while the WordPress migration went generally well, it wasn’t properly handling a lot of the embedded Youtube videos. So, I wrote a little app to go through and do all the corrections (mostly just removing large swaths of whitespace). I have the old data backed up, so if you see anything that looks like it might have been mangled, let me know.
In the meantime, enjoy the fruits of my labors: my back catalog of old “Tuesday Tube” posts!
This has been a busy year, and I’m just going to use this post as a chance to reflect on what I’ve accomplished this year. I will then probably have a 2011 goals post later (probably right after Codemash).
I started this year still working for Quick Solutions. I had a great time at Codemash 2010, and learned quite a lot. Around this time I started meeting with a mentor at Quick and laying out some plans. I generally believe that plans are for fools, but I managed to accomplish most of my plans, in spirit at least, if not to the letter.
I had a goal to read a couple dev books each quarter. I didn’t read all the books that were on my list, but I did read roughly my targeted amount. Additionally, I captained a dev book club for a few months, which was a lot of fun, and was more fulfilling than just reading a book by myself.
I did take and pass the PMP exam, which seems like such a distant memory now. I’m not a project manager or a manager of any sort yet, but I’m confident that I will get there when I need to.
I have only contributed to OSS projects in minor, minor ways this year. This is definitely a failed goal. However, in terms of community involvement, I am quite active, and was just recently elected as an officer to the CONDG user group, and I also volunteered at Stir Trek to carry pizza boxes and stuff swag bags. So I’ve not just been sitting on my duff either.
I did not write a mobile development white paper. Instead, I’ve been participating in the MonoDroid private beta program, and I will be “co-presenting” with Bill Sempf at CodeMash on MonoDroid (and possible other conferences). I am currently working on a MonoDroid app, and I hope to release that to the marketplace soon.
I had a goal to give at least 3 presentations in the local dev community. Well, take out the word “local” and I accomplished that easily with presentations in Maryland, Virginia, and Grand Rapids, as well as a couple minor sessions at local events too. It also goes without saying that I attended plenty of conferences, local and otherwise.
I’ve been recently slacking on my Project Euler, but I have solved 65 problems, for an average of about 1.25 problems solved per week, which is actually must better than the goal I set for myself initially.
I also managed to take a new job with Telligent, and transition to being a remote worker.
All of this, and one other minor thing: my second child (Emma Groves) was born this year.
So, all in all, I’d say it’s a pretty darn successful year, and I have a lot to be proud of. I couldn’t have done it alone, of course. My wife Ali has been a constant support, especially through all the travel, late nights, studying, etc. Both of the companies I worked for this year have a ton of great people that I’ve leaned on for knowledge, support, and guidance. This includes Jayme Davis, Craig McKeachie, Jim Holmes, Chris Farrell, Craig Stuntz, all my Twitter friends, the team of guys at the AG, my current product team, anyone who still reads this blog, and many many others. A cast of thousands, if you will. Thank you, everyone.
Well, it’s been a long journey, but I’ve finally arrived at WordPress. In case you haven’t been here since the beginning, here’s a brief history of mgroves.com:
I first bought the domain/hosting through easycgi.com. I really didn’t have a clear reason why, but I put some stuff up there like my resume, some music reviews, and some other random junk. All static. I was employed with OSU, but not as a web developer.
Blogs and RSS were really starting to take off (not that they were brand new, but they were really getting popular) in late 2005. I decided that blogging might be fun, so I slapped together a home-made blog engine with PHP (which I was just starting to learn). I had a layout and structure similar to slashdot, and I borrowed the slashdot “image-representing-a-category” motif too. I had a table-based layout. Unlike slashdot, my site was really ugly.
A few months later, I moved to the web development group at OSU, which had a fantastic designer. He saw my site and practically hung himself. I convinced him to live, and also to make a nice new design for me. I also took that opportunity to improve my blog-engine a little bit as well.
Soon, I was posting like a madman, up to 3 times a day. Not particularly rich content, but certainly there was plenty of it. During this period, I reached the front page of Digg twice, once for a post I did about hidden stuff in logos, and once indirectly about AJAX (which was also becoming a big deal at the time). The traffic blew up my site (the fabled Digg effect), so I once again adjusted my blog engine to give it caching. Hotlinking was also sucking up a lot of bandwidth, so I adjusted my software to watermark every image. At some point, I switched hosting to Dreamhost to save some money (though I lost the ability to use ASP/ASP.NET, which I still kinda regret).
And that’s where I was for a long while. I got another redesign, and made minor tweaks here and there. I got a couple checks from Google AdSense, Commission Junction, etc. Not much, but it easily covered hosting. My blogging frequency dropped off when I was getting my MBA at night, and then dropped even further when my son was born.
Early last year, I decided that my blog engine was becoming too painful to use. I was married, had a kid, and didn’t have time for fooling around with my weak homegrown engine when there are so many free, feature-rich engines out there already. The Habari guys had visited the Columbus PHP Group, so I decided to give them a go. The migration from my database schema to their’s wasn’t too bad at all.
However, as much as I liked the Habari guys, and their ideas about blogging/CMS, Habari had some flaws, missing features, and wasn’t getting updated very much (one or two updates in a year). Sure, it’s open source and I could contribute, but that’s really at odds with my purpose for getting a blogging engine in the first place. In the interim, I had used WordPress for a couple of projects and sites here and there and really got to like it.
So, here I am. Static -> Custom blog engine -> More custom blog engine -> Habari -> WordPress.










