About Me

Training

Nothin But .Net Developer Bootcamp

Navigation

Search

Categories

On this page

Nothin But .Net - A .Net Developer Bootcamp
Sharpen You Sword!!
I forgot my mouse today.....big deal!!
Article : Hacking Email: 99 Email Security and Productivity Tips
One Small Gotcha With Custom Actions For Windows Services
Handling 3rd Party Dependencies (Including your own)
November MSDN Mini-Tour Content
Late Announcement
Another Awesome Speaker Added to MSDN Canada Speakers Bureau
Hot off the press!!
Patterns Presentation at Winnipeg .Net User Group
Patterns Presentation at Regina .Net User Group
Clean up your (NAnt) build files by taking advantage of fileset references

Archive

Blogroll

 Agile Developer Venkat's Blog
 Ayende @ Blog
 B#
 Barry Gervin's Software Architecture Perspectives
 Boy Meets World
 Brad Abrams
 Canadian Developers
 Christopher Steen
 Claritude Software News
 Clemens Vasters: Enterprise Development and Alien Abductions
 Coding Horror
 Coding in an Igloo
 Dare Obasanjo aka Carnage4Life
 Darrell Norton's Blog [MVP]
 David Hayden [MVP C#]
 Don Box's Spoutlet
 Eric Gunnerson's C# Compendium
 EZWeb guy: Jeffrey Palermo [C# MVP]
 Fear and Loathing
 Generalities & Details: Adventures in the High-tech Underbelly
 Greg Young [MVP]
 Greg's Cool [Insert Clever Name] of the Day
 IanG on Tap
 Ingo Rammer's Weblog
 ISerializable - Roy Osherove's Blog
 James Kovacs' Weblog
 Jason Haley
 Jean-Luc David
 Jeremy D. Miller -- The Shade Tree Developer
 JetBrains .NET Tools Blog
 Jimmy Nilsson's weblog
 John Bristowe's Weblog
 John Papa [MVP C#]
 Jon Skeet's Coding Blog
 JonGalloway.ToString()
 Jump the Fence or Walk Around
 Lambda the Ultimate - Programming Languages Weblog
 Larkware News
 Lutz Roeder
 Marquee de Sells: Chris's insight outlet
 Martin Fowler's Bliki
 Mike Nichols - SonOfNun Technology
 MSDN Magazine - .NET Matters
 MSDN Magazine - All Articles
 OdeToCode Blogs
 Onion Blog
 Planet TW
 Raymond Lewallen [MVP]
 Rockford Lhotka
 RodMan's Corner
 Roger Johansson's blog
 Sahil Malik - blah.winsmarts.com
 Sam Gentile's Blog
 Scott Bellware [MVP]
 Scott Hanselman's Computer Zen
 ScottGu's Blog
 secretGeek
 Service Station, by Aaron Skonnard
 Signum sine tinnitu--by Guy Kawasaki
 Stephen Toub
 Steve Eichert's Blog
 Steven Rockarts
 The Blog Ride
 The Coding Hillbilly
 The Daily WTF
 TheServerSide.net: News
 Tim Gifford
 Vance Morrison's Weblog
 you've been HAACKED

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

RSS 2.0 | Atom 1.0 | CDF

Send mail to the author(s) E-mail

Total Posts: 519
This Year: 28
This Month: 0
This Week: 0
Comments: 1593

 Thursday, November 30, 2006
Thursday, November 30, 2006 5:33:24 PM (Mountain Standard Time, UTC-07:00) ( Presentations )

I have been pretty quiet on the blogging front as of late and I am glad that I can finally announce the reason!

I have just finished finalizing (updated) material, and a location, for a course that I will be delivering in February 2007. The course will be a one week, intense bootcamp for .Net developers. The following overview outlines (at a very high level) what will be covered.

 

Overview

Nothin’ But .Net is a five day boot camp that will focus on pragmatically applying .Net within the context of developing a working N-Tiered application. Registrants will learn about advanced features of .Net (2.0/3.0) as they are applied to the task of building a complete application from the UI layer all the way down to the mapping layer.

WARNING!!!!

If you are expecting to come to this course to learn about how to have VS.Net automatically generate an “application” for you, then this course is NOT for you.

This course is all about taking control of the .Net framework and having it work the way you want. This course will place a heavy emphasis on getting back to the basics and making .Net do things the way you want it to, in a predictable and testable way.

This course will focus on a code centric view of application development vs. the typical databinding/designer magic covered by many typical .Net courses. You will walk away with a deep understanding of fundamental aspects of .Net and how these pieces can be used to develop and deliver enterprise scale applications.

Core Concepts Overview

  • Expanding the capabilities of developing with VS.Net - Enter ReSharper (a productivity add-in for Visual Studio .Net)
  • There’s more to life than generated code
  • Automation for the developer
  • Generics ( they’re not just for collections )
  • Back to basics - Rules Of Good Object Oriented Design
  • Dependency Injection
  • Object Relational Mapping in .Net
  • Applying the dependency inversion principle
  • Domain Driven Design
  • Passive View/Supervising Controller (Model View Presenter)
  • Creating layered architectures
  • Driving out functionality and design through testing
  • Taking Control Of Databinding
  • Behavior (Test) Driven Development
  • Core design patterns applied
  • Pragmatic Productivity Tools For Developers

Although the list may look rather daunting, the majority of the bullet points will be covered during the evolutionary design and construction of the sample project.

One of the main goals of the course is to show how to effectively use behavior (test) driven development, design patterns and a solid toolset to develop a portion of a non-trivial application.

The course will allow students to pragmatically apply BDD practices as well as teach people how to utilize fundamental OO concepts and techniques that will allow for them to have cleaner, more loosely coupled architectures. It will also be an opportunity for students to see what is involved in creating applications that utilize a Rich Domain Model,and the supporting infrastructure that is required to use "Plain Old Objects".

I have successfully delivered this course several times in Canada over the past year with great success. I anticipate that people who are interested will find that this is a very unique course offering, not typical of what is being delivered in the mainstream.

There are only spots for 12 people to register. The course costs $2500/CAD for a full 5 days. The fee covers:

  • 5 (8 - 12 hour days, depending on the audience availability) of bootcamp style instruction
  • Book - Patterns Of Application Architecture
  • ReSharper 2.0 License
  • Breakfast, lunch(and Supper if people opt for the 12 hour day)

The course is going to be hosted at DevStudios in Edmonton, Canada, and will run for the week of February 26 - March 2, 2007.

This is an initial informational message. If you are interested in finding out more about the course feel free to contact me at bitwisejp@gmail.com. A link to the registration page will follow shortly!!

Comments [11] | | # 
 Thursday, November 23, 2006
Thursday, November 23, 2006 10:35:13 AM (Mountain Standard Time, UTC-07:00) ( C Sharp )

Lots of people ask me "How do you get better as a developer?" my answer is simple, "Develop"!! You can read all you want, until you start applying what you are learning the information is useless.

On that note, I greatly appreciate the work that Billy McCafferty is doing for the dev community by taking the time to create and publish a set of Refactoring challenges. It takes a lot of personal time and effort to put something like that out there (speaking from experience), so show him your appreciation by downloading the code and "Refactor mercilessly". As a mentor in a dev shop, some (one) of the keeners are eager to download the code and clean it up, which gives me an opportunity to share some small nuggets of wisdom also!!

Thanks again Bill.

Comments [0] | | # 
 Monday, November 20, 2006
Monday, November 20, 2006 11:17:04 PM (Mountain Standard Time, UTC-07:00) ( Tools )

I love coding, consulting, teaching, and presenting (in that order too!). One of the things I get a big kick out of is giving a presentation and having people remark about how fast I can navigate around windows without the mouse!! I have to admit, I can't take the credit. While I am pretty pleased with my typing speed; it is the small, fast, targeted utilities that allow me to slice through windows like a hot knife through butter.

What's my point? I showed up at work today without my mouse ( I have a laptop with a trackpad, how I loathe trackpads) and realized that I was going to have to work the day without the mouse.

Aside from the odd tasks that are a bit of a pain to accomplish without a mouse (resizing windows, moving windows etc) I realized that I do not use my mouse much at all anymore.

My mouse of choice currently is the Logitech MX Revolution:

 

The MX is a phenomenal mouse with an extremely small transmitter and rechargeable battery, it also has a wicked free spin mode that allows you to traverse long documents extremely fast.

 

OK, enough of the advertising, I'll get back to how you can become more effective using the keyboard. I'll highlight some tools and techniques that you can start using today to slowly make yourself more in a less mouse reliant state!!

  • Develop your touch typing skills. You don't need to become a fast typer. You just need to become more effective at using all of your fingers on all of your hands, without looking at the keyboard. Even if you make mistakes, your errors will be corrected faster as you are always looking at the screen. Look at downloading a good, fun, typing tutor and spend a couple of minutes in the morning and afternoon going through some exercises. Don't try to tell me that you don't have the time!!
  • Drop your mouse for a week. That's right, I actually said 'drop' your mouse for a week. There is nothing like going cold turkey to force you to learn the keyboard shortcuts you need to learn to navigate around windows properly. This March, I forced myself to not use my mouse for a 2 week period. It was during this period that I developed the baseline of my mouseless computing experience. Trust me, it will be a big investment, with bigger rewards.
  • The ALT key is your friend. Learn to use the ALT key to navigate your menu items and you will fly through windows, sure lots of apps have other shortcuts that allow you quicker access to some options, but ALT is universal throughout windows. If you are stuck in a scenario where you can't find a predefined shortcut key hit ALT and start working your way through the menus. If the menus are built properly you should be able to navigate through the menus without using the arrow buttons. Example, if you are in a list view in windows explorer and you want to create a new item (folder,text document etc) just hit ALT -> F -> W -> Pick the item you want to create, hit enter if you just want to create a new folder, as that is the first item in the list.
  • Download some launcher utilities. The 2 I am currently running on my system are SlickRun and Launchy. SlickRun is an awesome floating command prompt.
  • I used to use SlickRun to launch all of my programs, but now that I am using Launchy for that, I now use SlickRun to navigate quickly to folders on my machine, as well as for configuring MagicWords that are basically little macros that can execute by typing in the name of a command. I just hit the hotkey for SlickRun start typing and it fills in as I go!!
  • Launchy is another floating command prompt style application that allows you to quickly launch any executable it has been configured to recognize. Unlike SlickRun, I can configure Launchy to look at any directory I want (at all .exes), and when I hit the hotkey to launch Launchy it presents me with a floating dialog which I can start typing into for it to filter a list of applications:
  • Once it finds the application that I want, I can hit enter and it launches it. Launchy can launch almost anything you can think of. Administrative Tools, display, any program under program files, any program under your custom utils folder (as long as you tell it to). Launchy also comes with a bunch of awesome skins and,like SlickRun, you can customize the hotkey so that it and SlickRun play well together.
  • If you are a Visual Studio Developer, and if you read this blog it is probably safe to say that you are. You should invest and take a look at purchasing either ReSharper or CodeRush. My personal favorite is ReSharper. Being a test driven developer ReSharper just seems to be a bit more fluid for me. From folks that I have talked to who use CodeRush, they also have nothing but awesome things to say about it. I cannot stress enough how much ReSharper has revolutionized my coding experience inside of studio. If ignorance is bliss, then lots of VS developers are in heaven!!! What I mean is, you do not realize how bad an editor studio is until you code with ReSharper for a while and then try to disable it and code with plain old studio. Don't take my word for it, download a copy and follow along in one of my Applied TDD Videos. I am planning to make some ReSharper specific posts sometime in the near future.
  • Last on the short list of essentials is Firefox 2 coupled with the Hit-A-Hint extension. Hit-A-Hint coupled with Firefox 2 has become my way to achieve completely mouseless browsing!! When you load up a web page, you can hit and hold down the space bar and numbers will appear next to every link on the page (including images). Type in the number of the link you want to click and release the space bar. Voila, you are off:

There are definitely other tips and tricks I could dish out for getting rid (almost) of your mouse, but hopefully this information gives you some ideas to chew on. Happy 'mouseless' computing!!

Comments [10] | | # 
Monday, November 20, 2006 10:53:36 PM (Mountain Standard Time, UTC-07:00) ( Articles )

Just got sent this link to an article outlining 99 tips for working effectively, and securely, with emails!!

Enjoy.

Comments [0] | | # 
Monday, November 20, 2006 10:52:57 AM (Mountain Standard Time, UTC-07:00) ( Continuous Integration )

It's been a while since I used studio to create a deployment project. I am using NAnt to package my files for distribution, I then create a Setup project in my solution that basically points at the NAnt output and creates an MSI from it.

I created an installer for a windows service, and added a custom commit action to make sure the ServiceInstaller ran during the commit phase of the installation.

Upon running the installer I was prompted with the following error message while nearing completion of the installation:

After a bit of digging around it seems that I have to also add a custom install action that is identical to the commit action. Once that is done, the error disappears and the service installs correctly.

Make sure you also add the custom action to the Uninstall step, otherwise the service will not be removed from the computer during uninstall.

Hope this helps someone else.

Comments [0] | | # 
 Sunday, November 19, 2006
Sunday, November 19, 2006 9:10:06 PM (Mountain Standard Time, UTC-07:00) ( Continuous Integration )

I received the following question a couple of days ago:

What do you suggest when having a (in house) library being used by several independent projects?

In practice the simplest solution to this problem, and also (by coincidence) the one that causes the least headaches is to treat those "libraries" as just that, "libraries". It can be too tempting to come up with fancy solutions that brings in the source code of these "shared" projects into your solutions so that you can edit the library code on the fly when needed. This ,however, can open up a maintenance nightmare, as a change that is required for one dependent project may inadvertently cause a bug or disable functionality in another dependent project.

To save myself the pain of dealing with these shared projects, I treat them like I would any third party library. I take the dll's and place them in a subfolder of the lib folder of my project. The lib folder is where I place any 3rd party assemblies that I happen to be using on a project. Here is an example for a project I recently completed:

 

Inside each of these respective subfolders is all of the dll's required for that third party dependency. All I would have to do is create a new subfolder named using the in house library I want to consume, and I would drop the latest current version of that assembly into the folder under the lib directory.

As I am developing my dependent app against this library, I am shielded from any changes that may be going on with the "shared" project, as I am just making references to the dll that lives in my lib folder. If a feature gets added into the shared library that I would like to consume in my dependent project, I could follow these steps:

  • Rename the existing library in my lib folder to something like : $LIBNAME$.bak
  • Drop in the new assembly into the lib folder
  • Run any unit/integration tests to ensure that the new assembly does not break any existing functionality in your dependent app. If it does, and you require the new feature, you will will obviously have to fix the dependent app. 
  • Delete the old version of the assembly as it no longer needs to be in the lib folder

As you can see, extremely simple. This has worked for me on small, and very large projects. Hopefully you can take this idea and use it to fit your shared library dependency issues.

Comments [4] | | # 
 Friday, November 17, 2006
Friday, November 17, 2006 12:46:16 AM (Mountain Standard Time, UTC-07:00) ( .Net 2.0 | Patterns | Presentations )

Lots of people ask why I don't usually post my powerpoints and code that I deliver at presentations that I give. For the most part, because of my dynamic and on the fly presentation style, I often show up with no code and build out scenarios on the fly. The resulting code often only makes sense to look at in the context of being an attendee of the presentation.

The same can be equally said for my powerpoints. When I actually have slides prepared, they are used as mere launchpads into either conversation or demonstrations of a new concept.

That aside, I have had a lot of requests for the content from my first mini tour I conducted as part of the MSDN Canada Speakers bureau. I spoke in Regina, Winnipeg, and Saskatoon on three consecutive nights. The code that resulted from each session was quite different, so I decide to post the code that came out of the last session.

The presentation was focused on introducing people to the concept of design patterns. While meant to be a 100 level talk, I definitely threw one 400-500 level example into the mix to spice things up.

Here are the links to the content:

 

 

Feel free to use the slide deck and accompanying source code if you want to deliver your own presentations built on the material. If you do so, I would definitely appreciate being recognized for the work.

If you have any questions I will definitely try to get them answered.

Comments [4] | | # 
 Wednesday, November 15, 2006
Wednesday, November 15, 2006 2:42:54 PM (Mountain Standard Time, UTC-07:00) ( Family )

Seeing as how this is a personal announcement, I shouldn't be surprised that I did not announce this sooner. Last week my wife and I celebrated our 10th wedding anniversary!! At 28 (we got married right out of high school) and 4 kids later, we have been blessed beyond measure.

Here are a couple of tips that have really helped us solidify a strong relationship:

  • Talk about everything
  • Compromise
  • Remember that it's not all about "you"
  • Pray together
  • Laugh together
  • Set goals together and work together to achieve them
  • Don't hide from conflict
  • Cuddle Lots

I could keep on listing these, but I don't want this post to turn into "Tips for a successful marriage".

The main point was to shout out this personal milestone that we both feel extremely blessed to have achieved.

Comments [5] | | # 
 Wednesday, November 08, 2006
Wednesday, November 08, 2006 1:33:28 PM (Mountain Standard Time, UTC-07:00) ( Presentations )

As you can probably tell by the amount of posts I am making today, I have a bit more spare time on my hands than normal!! I am currently in the Saskatoon Inn (in Saskatoon) killing time before I give my last presentation on this small mini tour I have taken part in. I have definitely been relaxing in the down time between presentations. I spent a small bit of time catching up on some blog skimming and I noticed that James Kovacs has been added to the MSDN Canada Speakers bureau.

All I have to say is, "what the heck took so long"""!!! Seriously, this has been a long time coming. James has been presenting in and around Calgary and surrounding areas for quite a while now. His depth of technical knowledge is amazing; and he is a very accomplished eloquent public speaker.

Watch for James as he inevitably makes his way around the conference circuit in the future. And if you really want to see what he's made of contact your local user group and have them bring him in for a presentation.

Congratulations James.

Comments [0] | | # 
Wednesday, November 08, 2006 1:19:59 PM (Mountain Standard Time, UTC-07:00) ( Tools )

The company that continues to build butt kicking tools for .Net developers has just released version 2 of their insane profiler for .Net applications. DotTrace is my personal unreserved choice for profiling in .Net. With the introduction of version 2 they have added a host of new features the most notable being the addition of memory profiling.

If you are an existing license holder, then the price for upgrading is a big "0.00". That's right, version 2 is free if you already have a license for version 1. Do these guys know how to license or what?

If you haven't taken the time to give DotTrace a whirl, I encourage you to go and download the latest trial and take it for a spin.

While you are there pick up version 1 of UnitRun (if you already have ReSharper, you already have UnitRun).

Comments [2] | | # 
Wednesday, November 08, 2006 1:08:17 PM (Mountain Standard Time, UTC-07:00) ( Presentations )

Last night I had the awesome honor of presenting at the Winnipeg .Net User Group. The presentation was an introduction to design patterns, with the final example stetching into a 400 - 500 level implementation.

There were awesome questions generated, and I got to meet and hand out with some awesome people.

Next and final stop on the mini tour, Saskatoon.

Comments [0] | | # 
Wednesday, November 08, 2006 12:58:57 PM (Mountain Standard Time, UTC-07:00) ( )

Well, tonight I had an awesome time giving an information filled presentation to the Regina .Net User Group. The venue was awesome and I was pleasantly surprised by the number of people that showed up. The presentation started at 6:30PM and went strong until 8:30PM.

There were not a lot of questions, but the ratings and comments from the attendees was awesome. It is always great to receive a mixture of both positive and negative feedback. I am constantly reminded by others, as well as myself, that I sometimes try to cover too much stuff in one presentation. I have a bit of a tendency to ramble!!

Comments [7] | | # 
 Wednesday, November 01, 2006
Wednesday, November 01, 2006 8:17:07 PM (Mountain Standard Time, UTC-07:00) ( Agile | Tools )

Imagine you have a buildfile and you have the following compile element that makes use of a couple of third party assemblies:

 

        <csc target="library" output="${dist.dir}\${app.library.name}" debug="${debug}">
            <sources>                
                <include name="${app.src.dir}\**\*.cs" />                
                <exclude name="${app.src.dir}\**\AssemblyInfo.cs" />
            </sources>    
            <resources>
                <include name="${config.dir}\mapping\*hbm.xml"/>
            </resources>
            <references>
                <include name="${lib.dir}\filehelpers\DotNet 2.0\FileHelpers.dll"/>
                <include name="${lib.dir}\binsor\Castle.Windsor.dll"/>
                <include name="${lib.dir}\log4net\log4net.dll"/>
                <include name="${lib.dir}\nhibernate\NHibernate.dll"/>
            </references>
        </csc>
 

Pay close attention to the references element. Notice how I am explicitly including the names of libraries that I want to  that "references" fileset.

Most people who are using NAnt are familiar with the concept of a fileset. Essentially it is a set of files that belong to a logical unit that you can make use of during the NAnt build process.

Assume I have another target that needed to perform a similar compile. I could just copy the references element, but that would be unnecessary duplication. What I can do is create a fileset that can be later referenced and used by other targets/tasks in the build file.

 

I'll start by creating the filset near the top of my build file (before any targets):

 

    <fileset id="deploy.lib.fileset">    
        <include name="${lib.dir}\filehelpers\DotNet 2.0\FileHelpers.dll"/>
        <include name="${lib.dir}\binsor\Castle.Windsor.dll"/>
        <include name="${lib.dir}\log4net\log4net.dll"/>                
        <include name="${lib.dir}\nhibernate\NHibernate.dll"/>                                
    </fileset>

 

Notice how I have changed the element to be of type filset vs references. The references element is a special subclass of fileset reserved for the csc task. You will also notice how I have given the fileset an id. It is this id that will allow me to reference this fileset elsewhere. I can now replace the fileset I was originally using in the csc task with a reference to the fileset that contains all of the references that should be used for the compile task:

 

        <csc target="library" output="${dist.dir}\${app.library.name}" debug="${debug}">
            <sources>                
                <include name="${app.src.dir}\**\*.cs" />                
                <exclude name="${app.src.dir}\**\AssemblyInfo.cs" />
            </sources>    
            <resources>
                <include name="${config.dir}\mapping\*hbm.xml"/>
            </resources>
            <references refid="deploy.lib.fileset"/>                
        </csc>

  

You can see now that the references element in the csc task now uses the refid attribute to link back to a fileset that I have already defined elsewhere in the build file. Think how many filesets you may take advantage of when building your apps using NAnt:

  • sources
  • references
  • resources

And that is just a small sample. Streamlining and refactoring the build file is just as important as refactoring and improving the code base of the app that the build file is building.

Hopefully this has given you one more tool with which you can go and clean up some duplication that may exist in your build file.

Comments [3] | | #