Posted: March 6th, 2012 | Author: Matt Ruma | Filed under: Crystal Reports, Software Development, Windows Forms | No Comments »
Yesterday I updated a Windows Forms application to start using SAP Crystal Reports for Visual Studio 2010. The update went well, that is, until one of the end users reported that changing the destination printer no longer worked. Crystal Reports kept printing to the default printer.
I quickly discovered that setting the PrinterName on the Crystal Report no longer worked. No error was generated … it always contained an empty value.
qbReport.PrintOptions.PrinterName = “My Printer”
qbReport.PrintToPrinter(frm.PrinterSettings.Copies, frm.PrinterSettings.Collate, frm.PrinterSettings.FromPage, frm.PrinterSettings.ToPage)
Not at all unfamiliar with Crystal Report issues I hopped on their forums and quickly learned this was a bug. No big deal, just another day in Crystal Reports. I just had to switch from using PrintToPrinter to using the Print method on the PrintOutputController. This change involved adding about (10) more references to my project, pretty much all of the Crystal Reports references. I made the changes to my code.
Dim printReportOptions As New CrystalDecisions.ReportAppServer.Controllers.PrintReportOptions()
Dim printOutputController As New CrystalDecisions.ReportAppServer.Controllers.PrintOutputController()
printReportOptions.PrinterName = “My Printer”
printOutputController = qbReport.ReportClientDocument.PrintOutputController
printOutputController.PrintReport(printReportOptions)
Problem solved! Not exactly! When I attempted to print from the application on the end user’s workstation, I received an error complaining about PrintControl.dll not being registered. Ugh! Crystal Reports, why do you hate me so?
I headed back to the Crystal Report Forums and learned this too was a bug. The redistributable and merge modules didn’t contain PrintControl.dll. Way to go Crystal Reports!
I followed the recommend work around copied the files from my local machine to the end user’s machine. I then tried to register PrintControl.dll and received an error that it could not be registered because of missing dependencies.
Instead of trying to figure out just which dependencies I was missing, I just took all the files, in the directory where PrintControl.dll was, and copied them to the end user’s machine and then registered PrintControl.dll.
C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\Crystal Reports 2011\crystalreportviewers\ActiveXControls
Finally! Success! The end user was able to switch the printer at run time and Crystal Reports would be a good sport and print to the correct printer.
Sigh … I just lost a few more hours of my life to Crystal Reports … again! When will I learn! Hopefully this article saves someone, anyone, from wasting a few hours of their life having to deal with this mess!
Posted: December 24th, 2011 | Author: Matt Ruma | Filed under: Personal, Software Development | 1 Comment »
I owned my own custom software development shop, Creative Logic, for eight years, prior to joining the Epitec Group in 2010.
Running my own business had plenty of ups and downs and in the end I decided that I had given it a fair shake and was ready to “go corporate.” My personal ambitions as a business owner needed to take a back seat to other, more important, areas of my life, like my family. It wasn’t an easy decision, but it was the right decision.

My family, the reason behind my decisions
Someday I’ll write a post that explains in more detail the reasons why I felt compelled to “go corporate.”
The Epitec Group had been a customer of mine for almost eight years up to that point, a great customer I might add. Being on the outside, looking in, I knew that if I ever joined the corporate ranks again; it would be with a company like the Epitec Group.
I liked their mission statement, their vision and their values, and what was most important to me, is that these weren’t just “words” on a page, these were words that the Epitec Group believed in, and followed, so much so, that it was ingrained into the company’s culture.
I like their people; I liked the ownership, the management, the sales team and yes, even the recruiters.
I liked that they were driven by processes and procedures, ensuring that that would continue to be successful because they had developed the right formula.
I like that they were not afraid of change when times dictated, which was important to me, as I think of myself as an agent of change.
Just because I was no longer a business owner, didn’t mean I wasn’t still an entrepreneur. If I was going to “go corporate” I needed to be part of a company that would embrace my inner entrepreneur. I need a company that would allow me to passionately contribute and innovate. I needed to be part of a company that would exercise the entire breadth of my skill set, to some degree. I also wanted to be part of a company that was like a family … something I was never able to succeed at on my own.
This past week we had our 2012 company kick-off, where we reviewed our goals for the previous year, our objectives for the coming year and our theme, which was BE212. The enthusiasm and excitement surrounding the kick-off is what really got me thinking about my decision of leaving the world of business owner and joining the corporate ranks. It was inspiring to see everyone excited at the opportunity to contribute to the continued growth of the company.
Have you ever heard that phrase, “Burn the ships?”
In 1519 Spanish Conquistador Hernando Cortez landed on the shores of Mexico in the Yucatan. He convinced a combined force of soldiers and sailors to join him in his quest to go after a greatest treasure in this distant land. They sailed on 11 ships and landed in a country that was control by a very large and powerful empire, the Aztecs.
Could it be possible for a small band of men to battle a nation and win? Cortez made a command decision that might have confused his men, he ordered them to, “Burn the ships.” His men refused at first and he gave the orders again and declared, “If we are going home we are going home in their ships.” Without an option to fail, to retreat, to not stay committed to their purpose, history reveals that in fact they did win.1
Almost two years later, I can look back, and without a doubt, say I made the right decision for myself and my family.

Me (far left) with the management team for our 2012 company kick-off
I just finished my 2010 tax statements for Creative Logic, which turns out to be the last step in officially closing Creative Logic down … It’s time to “burn the ships.” No turning back, I’m committed. This is that path that I have chosen, this is the path that I have enjoyed walking for the past couple of years and will continue to do so.
I looked forward to another exciting year with the Epitec Group servicing our customers, our consultants, our employees, our partners and our community!
In my next post I’ll talk about our company kick-off, without giving away any secrets, what we did, what we are doing, what we are going to do, and oh, the scavenger hunt!
1 http://toolstolife.com/articles/Burn-the-Ships-467:
Posted: November 3rd, 2011 | Author: Matt Ruma | Filed under: Software Development, Speaking | No Comments »
This past Saturday (Oct 29th) I attended the Ann Arbor Day of .NET at Washtenaw Community College.
I want to thank Jason Follas, Jay Harris and Scott Zischerk, the organizers, for making the Ann Arbor Day of .NET such a success! Also thanks to the sponsors, Telerik, JetBrains, TechSmith, Infragistics and DevExpress, for their support and all the free goodies! Lastly, thanks to the speakers and everyone that attended!
It was great to see friends, and finally meet friends face-to-face that I follow on Twitter, e.g. Sarah Dutkiewicz. I find the more I am involved in the developer community the more I enjoy these events, and events like CodeMash, as I get the opportunity to get to know my peers, and make some new friends.
There were (5) tracks for the day: Cloud, Frameworks and Platforms, Soft Skills, Tools and Mobile, which amounted to over 20 sessions. It was a fantastic line-up of awesome topics with awesome speakers!
I attend quite a few conferences each year, but this conference was a bit different for me … as this was the first time I was going to be presenting.
A couple months back I presented a Lighting Talk to the Great Lakes .NET User Group (MIGANG) on Sucking Less. This was my first presentation to a group of my peers, but it only lasted 10 minutes. This time I was going to have to speak for almost an hour, and on top of that, entertain questions at the end.
I was very nervous, but received some excellent advice from David Giard and Jeff McWherter, such as:
- Just do it! If you want to start speaking then start. If you want to be a better speaker then keep speaking.
- The audience is forgiving, if you make mistake, move on, and don’t get bogged down with a botched demonstration.
- If you are asked a question that you don’t know the answer to or one that is outside of the scope of the talk just let the person know you are available to answer that question afterwards … you want to focus on the questions that are relevant to the talk and ones that you can answer.
- Your first couple of times presenting, you’ll spend more time working on your presentation, then enjoying other sessions … and that is alright.
- Adjust your presentation to the people. If only your mom, dad and few other show up to listen to you, then rearrange the room (if possible) to a more intimate setting.
- Be prepared, for a new presenter or new presentation, you won’t be able to enjoy other sessions, like you use to. You’ll be focused on making tweaks to your presentation, practicing, and in my case, dealing with first-time jitters.
- Practice, practice and practice.
This was excellent advice and was much appreciated. It helped me out immensely with my first presentation.
My time to present finally rolled around … I felt ready. I was up against some solid sessions and speakers, sessions that given the choice between mine and these other sessions, I would have attended the other sessions. The other sessions were “Developing Apps for Windows 8” by Susan Anspaugh-Yount and Stone Soup or Creating a Culture of Change by James Bender.
My presentation was going to discuss the importance of patterns in software development; my title – and the one that my presentation was submitted under – was simply going to be the “Importance of Patterns.” I usually like things with a bit more of an edge, but was pressed for time, and this would work.
My abstract for the presentation was:
Patterns can be found in all areas of your life, from creating grocery lists to crafting robust software applications. This session will introduce you to the concept of patterns, their history and benefits. We’ll look at some different uses of patterns in crafting software applications, including design patterns, architectural patterns and user interface design patterns. We’ll chase a rabbit and look at where patterns fail or might not be used correctly. You’ll leave this session able to identify patterns and successfully use them in all facets of the design and construction of software applications.
Prior to my session starting I changed the title to “I <3 Patterns.” This better represented my passion for being the best software developer I can be and how I think patterns can help us become better software developers.
The session before mine, “Develop IT: Intro to PowerShell” by Sarah Dutkiewicz, was wrapping up and people began filing out. I started setting my laptop up, organizing my note cards and was ready to go … unfortunately I still had to wait for 10 minutes, until my session “officially” started.
To my surprise, the room was packed! My mom and dad must have forgotten the date, because they were noticeably absent. Time seemed to move to a crawl, 9 minutes to go, 8 minutes to go, it was taking forever … and the silence was a bit unnerving to my already frazzled nerves.
So I started to show family photos, why not! Something to break the ice, and thankfully it did. Someone asked if “there were twins somewhere in the pictures”, to which I chuckled and answered “no.” That killed another 5 minutes and I asked the audience if they minded getting started early … which they didn’t … see we got things underway 5 minutes early… I had a lot of information to share, and no use waiting any longer, everyone was ready!
I gave a short introduction of myself and let everyone know that I had been writing code since the Commodore 64. This comment brought smiles, to both young and old … you could see the nostalgia wash over the older attendees while younger attendees were thinking “this dude is way old!”
I thought the presentation went well. Once I started the information just flowed and people seemed engaged.
The crowd was awesome! Great mix of people! Very attentive, interested and engaged … I was very thankful. The time flew by … and it was over. Unfortunately I didn’t get a chance to ask or answer any questions as closing ceremonies were about to begin.
I did overhear some comments people were saying as they left, the best one was, “I’m glad my team attended this session … this is going to help us [develop better software].” That made my day! Someone walked out of the session having learned something! It was an awesome feeling!
With all that being said, I do have some things I need to improve on, those being:
- Save some time at the end for questions and answers. If I had spent more time practicing I would have had the timing down better.
- Spruce up the slides … just a bit. Little more color and maybe a relevant picture or two. My slides were just black text on a white background.
- When switching from section to section, in my slides, I’m going to add all the sections, and highlight the current section.
- This way people know where we went and where we are going.
- There was a lot of information presented, and I think this will help “recap” during the presentation as opposed to just the end.
- Ask for feedback. I wish I would have had a short questionnaire for people to fill out so I could get some feedback on what I needed to work on.
- Practice, practice and practice.
Thanks to everyone that attended my session, I was honored that you took time out of your busy day to sit and listen to this geek rattle off about his love of patterns for almost an hour! It was very much appreciated!
If you attended my session and have any feedback, please send it to me at mattruma@gmail.com.
Thanks and God bless!
You can find the slide deck at http://www.slideshare.net/raz0rf1sh/i-lt3-patterns.
Posted: August 18th, 2011 | Author: Matt Ruma | Filed under: Software Development | 2 Comments »
Here is the summary of my first lightning talk at the Great Lakes Area .NET Users Group … if you saw the talk I would really appreciate any feedback or insight you might have.
If I had to sum up my goal for each day, it would be simple, I just want to suck less than I did yesterday.
I’d like to share with you how I try to suck less by tapping that same creative process that I use to write awesome code and channel it into making usable and appealing user experience.
Here is the poster child for a poor user experience, FileMakerPro.
Looking at this user experience one can not help but wonder, what was this person was thinking … or better yet, not thinking!
Is this just some cruel trick played by God … does He give developers the ability to create awesome code and then limit, or leave out entirely, the ability to create an equally awesome user experience?
I’m going to assume that there is some awesome code behind FileMakerPro … but for some reason that awesomeness failed to translate to the user experience.
The next version of FileMakerPro didn’t look much better, but it did allow skinning … now you could have variations on the ugly user experience.
Every day, we developers think of creative solutions and write creative code to solve problems, but for many of us, that creative process seems to disappear when we get to the user experience. Why is that? Does it really have to be like this?
Perhaps a better understanding of creativity and the creative process will shed some light on this.
A lot of the material I am about to discuss comes from a video series entitled “Everything is a Remix”, by Kirby.
The act of creation is surrounded by a variety of myths. One person might think that creativity comes via inspiration, another might think creativity is a product of geniuses.
The truth is … creativity isn’t magical: it’s just a process.

Copying
The Creative Process has it’s roots in something that is scorn and often misunderstood, even though it gives us so much … and that is copying.
We learn by copying. We can’t introduce anything new until we’re fluent in the language of our domain, and we do that best through emulation.
I’m teaching my son how to program an introduction to python book. All of his lessons involve typing in a program found in the book. It is by copying that he is beginning to understand statements like print or for loops.
If you think about it all artists spend the beginning years of the careers producing derivative work.
- Bob Dylan’s first album contained eleven cover songs.
- Richard Pryor began his stand-up career doing a not-very-good imitation of Bill Cosby.
Nobody starts out original. We need copying to build a foundation of knowledge and understanding.
Transforming
After we’ve grounded ourselves in the fundamentals through copying, it’s then possible to create something new through transformation. Taking an idea and creating variations. This is time-consuming tinkering but it can eventually produce a breakthrough.
- Christopher Sholes’ modeled his typewriter keyboard on a piano. This design slowly evolved over five years into the QWERTY layout we still use today.
- And Thomas Edison didn’t invent the light bulb — his first patent was “Improvement in Electric Lamps“ — but he did produce the first commercially viable bulb… after trying 6,000 different materials for the filament.
These are all major advances, but they’re not original ideas so much as tipping points in a continuous line of invention by many different people.
Combining
But the most dramatic results can happen when ideas are combined. By connecting ideas together creative leaps can be made, producing some of history’s biggest breakthroughs.
- Henry Ford and The Ford Motor Company didn’t invent the assembly line, interchangeable parts or even the automobile itself. But they combined all these elements in 1908 to produce the first mass market car, the Model T.
- And the Internet slowly grew over several decades as networks and protocols merged. It finally hit critical mass in 1991 when Tim Berners-Lee added the World Wide Web.
It’s just that simple! It’s just a process made up of three pieces: copying, transforming, and combining.
Story Time
And the perfect illustration of the creative process at work is the story of the personal computer.
It all started with a company called Xerox.
Xerox invented the first mouse-driven system computer with a graphical user interface that mimicked a desktop. It had documents, files, folders, menus and scroll-bars.
Steve Jobs visited Xerox to see this new computer. Jobs was quickly convinced that all future computers would use a graphical user interface, and copied every single one of the aforementioned features into the Lisa, and later into the Mac.
But it was the first combination it incorporated that set the Mac on a path towards long-term success.
Apple aimed to merge the computer with the household appliance, like a TV or a stereo. Up to this point computers were intended for professional use. The Mac was going to be for the home and this produced a cascade of transformations.
- Apple removed one of the buttons on the mouse to make its novel pointing device less confusing.
- Then they added the double-click for opening files.
- The Mac also let you drag icons around and move and resize windows.
- The Mac introduced the menu bar, which stayed in the same place no matter what you were doing.
- The Mac added the trash can to make deleting files more intuitive and less nerve-wracking.
All features missing from Xerox’s computer.
And lastly, through compromise and clever engineering Apple managed to pare down the Mac’s price to $2,500, more that $15,000 cheaper than Xerox’s computer.
This Is How We Do It
We now understand that creativity is just a process. It’s the same process that we use to write our code, and it can be the same process we use to create user experiences that suck less.
I’m going to share with you my teams process for designing user interfaces, that is very similar to the creative process we just discussed, it just breaks out the processes in a few more steps.
Trolling
We create a virtual pile of information.
We sign up for every web application that offers a free account, just to look at how these companies are designing their use experience, and take screen shots. For those applications that don’t offer a free account we just search for screenshots of their application.
We check out websites like feedmyapp.com or web2go.com that have a library of web applications.
We might spend time on a sites like themeforest.net, ui-patterns.com, smashingmagazine.com looking at templates, design patterns and tips in general.
Isolating
Now it’s time to sift through this virtual pile of information.
We identify graphic elements that we like, maybe we like how Product X displays their menu, or how Product Y handles searching.
We identify a design pattern on how to collect comments in your web application.
We identify an icon library that matches the graphic elements gathered above.
We create a color scheme based on a single color, from which we can create a color wheel of complementary colors.
Borrowing
Now that we know what we want to do we now need to figure out to do it.
If it’s a web application, we’re looking at the HTML and the style sheets. If it’s a Windows application we’ll download code samples look at the XAML.
For one project we had to mimic Google dashboard … including the rotating image based on the time of the day. We spent a lot of time looking at how Google implemented this through the HTML and stylesheets and then created our own variation.
Buying
Sometimes pieces are still missing so we have to purchase them.
There may be a particular icon library we just got to have or a graphic from istockphoto.com or a custom logo from 99designs.com. If we found a template on themeforest.net that we want to model our application after we will purchase it.
Building
Once we have all the graphical elements of the design we then start building out the application. We might leverage the layout of basecamphq.com, with some design elements for zendesk.com, sprinkled with some icons we downloaded from iconpot.com and lastly, some of our own secret sauce.
Proving
This where we take the user experience we built and put it in front of the user. A few more rounds of transformations and combinations and our product is ready for release.
It’s just that easy … no magic … just following the process.
Real World Example
This is our internal project management software … when we first are coding it, we leave the user interface pretty bland, so it forces us to focus on the functionality.
After looking at a variety of web applications, we copied, transformed and combined to get our final result.

By leveraging the same process we use to create awesome code we can create and awesome user experience … just follow the process … and we can all suck less!
Here is a list of resources that I use to help me create awesome user experiences:
Icons
Inspiration
Best Practices
God bless and keep coding!
Posted: August 18th, 2011 | Author: Matt Ruma | Filed under: Software Development | No Comments »
Yesterday I presented my first lightning talk at the Great Lakes Area .Net User Group meeting.
What is a lightning talk? It’s just a ten minute talk prior to the main speaker. It can be a wide array of topics from demonstrating a development tool, new programming language or on a particular soft skill.
I was extremely nervous, as it was the first time I was speaking in front of a group of my peers.
I had scrapped my original topic two days prior to the meeting and was scrambling to complete my new – and hopefully improved – talk, as well as practice it.
I took advantage of my team and asked them to sit through a preview of my talk … more than once. With their help I was able to streamline my talk, making sure it had a beginning, middle and end, as my wife would say, and cut out unnecessary words.
I was ready for my big – at least in my eyes – debut.
I think the talk went well, my delivery was more like reading than speaking, something I knew about and need to work on. I bobbled my conclusion … further practice would have helped. Other than that, I felt good afterwards. The Twitter feed was kind, and I got a good response. It was a lot of fun – especially now that it is over – and a great opportunity to share some of my experiences with my peers.
It is something I would recommend every developer to do … at least once. I’m thinking about approaching other user groups in the area to do the same talk just so I can get more practice … and suck less!
What did I talk about? I’ll share that in my next post.