Sunday, July 10, 2011
#
In my current job as a Senior ALM Consultant, part of what I do is help organizations get TFS set up and configured. While a single server installation is pretty easy (and using the basic configuration to install TFS on Windows 7 is even easier), there are a few pitfalls and points of frustration when setting TFS up in a two-server configuration.
For the purposes of this discussion, I am assuming the following setup:
- - A database server (Data Tier) with SQL 2008 R2 to house the TFS Databases, Reporting Services, and Analysis Services.
- - A separate server (App Tier) with the TFS Application Tier and Sharepoint Services.
The scope here is not to go into the general details of how to install TFS (there’s an excellent guide at http://www.microsoft.com/download/en/details.aspx?id=24337 ), but rather to cover a few things you’ll want to square away in advance to make the overall installation process less painful.
1. Create your service accounts in advance!
The guide recommends three accounts (TFSSERVICE, TFSREPORTS, and WSSSERVICE). I generally either go with these three, or just use the TFSSERVICE account in all places. In any case, make sure you use a domain account for these purposes.
2. Ensure the account you will be using to set up TFS has access to your SQL instance!
You will generally install your SQL 2008 R2 instance first, or concurrently with your TFS install.
Since we’re in a two server environment, you need to make sure that the account you log into on the App Tier is also a valid account in SQL Server. IT will also need the SysAdmin server role, since we’ll be creating and updating databases as part of installation.
3. Make sure your setup account is an administrator on both servers!
Significant pain can be avoided if you make sure that whatever account you are using to set up and install SQL Server and TFS is a local administrator on your servers. Do not use the domain administrator account! Use a domain user account with the appropriate access rights set up.
If, when you are setting up any of the services, you are asked for credentials of an account with admin rights, then you do not yet have sufficient trust. Log into the server as a local admin, and grant your installation account access as an administrator.
4. Make sure Windows Firewall is configured correctly!
And by this, I do not mean just turn it off. Best practice is to keep your firewall on, and enable just the ports needed for SQL and TFS to talk.
In this case, on your database server, create a new Inbound Rule that opens the following TCP ports: 135,1433,1434,2383, and 4022. An explanation of these ports can be found at http://msdn.microsoft.com/en-us/library/cc646023.aspx .
5. Make sure Reporting Services is set up on your Data Tier!
You can do this via the Reporting Services Configuration Manager. You will need to hook to an instance, create databases, etc. - just follow the defaults and you will be in good shape.
6. Make sure you have SQL Client Tools Connectivity installed on the App Tier!
This is done primarily to allow us to test and make sure our Analysis Services instance is set up and running as part of installation. I generally install Management Studio as well to help in troubleshooting.
7. As you install your Application Tier, TEST all accounts and services where prompted!
This is pretty much one of the golden rules. There are a lot of opportunities as you go through the various steps to make sure everything is squared away - take advantage of these. If a test fails, then correct the issue first, and restart the wizard. This will help you work through a painless and successful installation!
Hopefully these tips help you out with your installation! And also remember to make sure you have the latest version of the installation guide, and follow it thoroughly.
Good luck!
-Bob Palmer
Friday, June 11, 2010
#
I've finally had a chance to continue my NHibernate tutorial series after a series of vacations and events. In this tutorial, I cover one of the most common relationships, that of the parent-child, in NHibernate. I also go through some optimization refactoring along the way.
You can view the entire Google Docs article here:
http://docs.google.com/Doc?docid=0AUP-rKyyUMKhZGczejdxeHZfMzBmdjdzZDlkaA&hl=en
As always, feedback is appreciate!
-Bob
Saturday, May 15, 2010
#
After a short break last week, I wanted to make sure I made time to publish the next in my series of tutorials on NHibernate.
This week I'll be covering Many to Many relationships, the hilo algorithm, IdBag element, and touch on Lazy Loading.
You can view the entire article at this link:
http://docs.google.com/Doc?docid=0AUP-rKyyUMKhZGczejdxeHZfMjZkdjd3cjJnMg&hl=en
As always, feedback and any technical bits I may have missed are always appreciated!
-Bob Palmer
Friday, April 30, 2010
#
In this NHibernate tutorial, I'll be digging into the ID tag and Generator classes. I had originally planned on finishing up a series on relationships (parent/child, etc.) but felt this would be an interesting topic for folks, and I also wanted to start integrating some of the current NHibernate reference.
Since this article also includes some reference sections (and since I have not had a chance to check for every possible parameter value), I used the current reference as a baseline, and would welcome any feedback or technical updates that I can incorporate.
You can find the entire article up on Google Docs at this link:
http://docs.google.com/Doc?id=dg3z7qxv_24f3ch2rf7
As always, feedback, suggestions, and technical corrections are greatly appreciated!
Enjoy!
- Bob
Friday, April 23, 2010
#
For this third tutorial, we'll be introducing users new to NHibernat to basic object relationships, starting with a simple many-to-one relationship.
I decided that it would make sense to at least get the readers through some basic relationship mapping (including varieties of parent/child and many to many relationships) before diverging into UI, since most folks are looking for enough to bootstrap themsevles into using NHibernate, and this almost always means some kind of relation between their objects.
You can find a link to the article at:
http://docs.google.com/Doc?docid=0AUP-rKyyUMKhZGczejdxeHZfMjJmM3c3M3Bnbg&hl=en
As always, comments, corrections, and suggestions are appreciated!
-Bob
Saturday, April 17, 2010
#
This is the second in a series of tutorials I am working on to help developers quickly get up to speed with NHibernate. In this tutorial, I'll be focusing on an implementation of a repository pattern.
As always, comments, suggestions, and any technical bits I may have missed are always appreciated!
You can view the entire article via this Google Docs link:
http://docs.google.com/Doc?docid=0AUP-rKyyUMKhZGczejdxeHZfMTVjMnBqYjVnNw&hl=en
Enjoy!
-Bob
Sunday, April 11, 2010
#
When I first learned NHibernate, I could best describe the experience as less of a learning curve and more like a learning cliff. A large part of that was the availability of tutorials.
In this first of a series of articles, I will be taking a crack at providing people new to NHibernate the information they need to quickly ramp up with NHibernate.
For the first article, I've decided to address the gap of just giving folks enough code to get started. No UI, no fluff - just enough to connect to a database and do some basic CRUD operations. In future articles, I will discuss a repository pattern for NHibernate, parent-child relationships, and other more advanced topics.
You can find the entire article via this Google Docs link:
http://docs.google.com/Doc?docid=0AUP-rKyyUMKhZGczejdxeHZfOGMydHNqdGc0&hl=en
Enjoy!
-Bob
Saturday, April 03, 2010
#
As you may have gathered from some of my previous posts, I've been spending some quality time at
Project Euler. Normally I do my solutions in C#, but since I have also started learning F#, it only made sense to switch over to F# to get my math coding fix.
This week's post is just a small snippet - spefically, a simple function to return a
fibonacci number given it's place in the sequence. One popular example uses recursion:
let rec fib n = if n < 2 then 1 else fib (n-2) + fib(n-1)
While this is certainly elegant, the recursion is absolutely brutal on performance. So I decided to spend a little time, and find an option that achieved the same functionality, but used a recursive function. And since this is F#, I wanted to make sure I did it without the use of any mutable variables.
Here's the solution I came up with:
let rec fib (n1 : bigint) (n2 : bigint) c =
if c = 1 then
n2
else
fib n2 (n1+n2) (c-1);;
let GetFib num =
(fib 1I 1I num);;
printfn "%O" (GetFib 1000);;
Essentially, this function works through the sequence moving forward, passing the two most recent numbers and a counter to the recursive calls until it has achieved the desired number of iterations. At that point, it returns the latest fibonacci number.
(Edited to change from Int to BigInt - Thanks for the feedback!)
Enjoy!
Sunday, March 28, 2010
#
Just a quick note - one of my side projects, a membership provider for ASP.net utilizing NHibernate for its persistence layer, is now on codeplex. The project URL is http://nhmemberprovider.codeplex.com/
Enjoy!
Saturday, March 20, 2010
#
In my office, I have a wall mounted monitor who's whole purpose in life is to display perfmon stats from our various servers. And on a fairly regular basis, I have folks walk by asking what the lines mean.
After providing the requisite explaination about CPU utilization, disk I/O bottlenecks, etc. this is usually followed by some blank stares from the user in question, and a distillation of all of our engineering wizardry down to the phrase 'So when the red line goes up that's bad then?'
This of course would not do. So I talked to my friends and our network admin about an option to show something more eye catching and visual, with which we could catch at a glance a feel for what was up with our site.
He initially pointed me out to a video showing GLTail and Chipmunk done in Ruby. Realizing this was both awesome, and that I needed an excuse to do something in XNA, I decided to knock out a proof of concept for something very similar, but with a few tweaks.
Here's a link to a video of the current prototype:
Essentially this app opens up a log file (even an active one) and begins pulling out the lines of text. (Here's a good Code Project link that covers how to do tail reading from an active text file:
http://www.codeproject.com/KB/files/tail.aspx).
As new data is added, a bubble is generated in the application - a GET statement comes from the left, and a POST from the right. I then run it through a series of expression checkers, and based on the kind of statement and the pattern, a bubble of an appropriate color is generated.
For example, if I get a 500, a huge red bubble pops out. Others are based on the part of the system the page is from - i.e. green bubbles are from our claims management subsystem, and blue bubbles are from the pages our scheduling staff use to schedule patients. Others include the purple bubbles for security and login, and yellow bubbles for some miscellaneous pages.
The little grey bubbles represent things like images, JS, CSS, etc - and their small size makes them work like grease to keep the larger page bubbles moving.
The app is also smart enough that if it is starting to bog down with handling the physics and interactions, it will suspend new bubbles until enough have dropped off that performance can resume (you can see this slight stuttering in the sample video).
The net result is that anyone will be able to look up on the wall monitor, and instantly get a quick feel for how things are going on the floor. Website slow? You can get a feel for both volume and utilized modules with one glance. Website crashing? Look for a wall of giant red bubbles. No activity at all? Maybe the site is down. Now couple this with utilization within a farm, and cross referenced with a second app showing the same kind of data from your SQL database...
As for the app itself, it's a windows XNA project with the code in C#.
The physics are handled by the Farseer physicis eingine for XNA (
http://www.codeplex.com/FarseerPhysics) which is just pure goodness. The samples are great, and I had the app up and working in two evenings (half of that was fine tuning, and the other was me coding with a kid in my lap).
My next steps include wiring this to SQL (I have some ideas...), and adding a nice configuration module. For example, you could use polygons, etc to tie to your regex - or more entertaining things like having a little human ragdoll to represent a user login.
Once that's wrapped up and I have a chance to complete some hardening, I will be releasing the whole thing into the wild as opensource.
Feel free to ping me if you have any questions!
-Bob