|
|
These blog entries are written by industry experts and leaders. We consider this content to be a good read for any software developer or web technologist.
March 2008 - Posts
-
Leroy was shocked when the source code appeared. It was familiar yet strange, like an old lover's kiss. The code was five years old – an artifact of Leroy's first project. Leroy slowly scrolled through the code and pondered his next move. It wasn't a bug that was bothering Leroy – there were no race conditions or tricky numerical conversions. No performance problems or uncaught error conditions. It was all about design …
public class BankAccount
{
public void Deposit(decimal amount)
{
_balance += amount;
LogTransaction("Deposited {0} on {1}", amount, DateTime.Now);
}
public void Withdraw(decimal amount)
{
_balance -= amount;
LogTransaction("Withdrew {0} on {1}", amount, DateTime.Now);
}
public void AccumulateInterest(decimal baseRate)
{
decimal interest;
if (_balance < 10000)
{
interest = _balance * baseRate;
}
else
{
interest = _balance * (baseRate + 0.01);
}
LogTransaction("Accumulated {0} interest on {1}", interest, DateTime.Now);
}
void LogTransaction(string message, params object[] parameters)
{
using(FileStream fs = File.Open("auditlog.txt", FileMode.OpenOrCreate))
using(StreamWriter writer = new StreamWriter(fs))
{
writer.WriteLine(message, parameters);
}
}
public decimal Balance
{
get { return _balance; }
set { _balance = value; }
}
decimal _balance;
}
"Times have changed, and so I have, fortunately", Leroy thought to himself. "And so will this code…"
To be continued… 
|
-
Aggregate is a standard LINQ operator for in-memory collections that allows us to build a custom aggregation. Although LINQ provides a few standard aggregation operators, like Count, Min, Max, and Average, if you want an inline implementation of, say, a standard deviation calculation, then the Aggregate extension method is one approach you can use (the other approach being that you could write your own operator).
Let's say we wanted to see the total number of threads running on a machine. We could get that number lambda style, or with a query comprehension, or with a custom aggregate.
var processes = Process.GetProcesses();
int totalThreads = 0;
totalThreads = processes.Sum(p => p.Threads.Count);
totalThreads = (from process in processes
select process.Threads.Count).Sum();
totalThreads =
processes.Aggregate(
0, // initialize
(acc, p) => acc += p.Threads.Count, //
accumulate
acc => acc // terminate
);
This particular overloaded version of Aggregate follows a common pattern of "Initialize – Accumulate – Terminate". You can see this pattern in extensible aggregation strategies from Oracle to SQLCLR. The first parameter represents an initialization expression. We need to provide an initialized accumulator – in this case just an integer value of 0.
The second parameter is a Func<int, Process, int> expression that the aggregate method will invoke as it iterates across the sequence of inputs. For each process we get our accumulator value (an int), and a reference to the current process in the iteration stage (a Process), and we return a new accumulator value (an int).
The last parameter is the terminate expression. This is an opportunity to provide any final calculations. For our summation, we just need to return the value in the accumulator.
StdDev
Now, let's compute a more thorough summary of running threads, including a standard deviation. Although we could get away with a simple double accumulator for stddev, we can also use a more sophisticated accumulator to encapsulate some calculations, facilitate unit tests, and make the syntax easier on the eye.
class StdDevAccumulator<TSource>
{
public StdDevAccumulator(IEnumerable<TSource> source,
Func<TSource, double> avgSelector)
{
SampleAvg = source.Average(avgSelector);
SampleCount = source.Count();
}
public StdDevAccumulator<TSource> Accumulate(double value)
{
TotalDeviation += Math.Pow(value - SampleAvg, 2.0);
return this;
}
public double
ComputeResult()
{
if (SampleCount < 2)
{
return 0.0;
}
return Math.Sqrt(TotalDeviation / (SampleCount - 1));
}
public double SampleAvg { get; set; }
public int SampleCount { get; set; }
public double TotalDeviation { get; set; }
}
Put the accumulator to use like so:
var processes = Process.GetProcesses();
var summary = new
{
TotalProcesses = processes.Count(),
TotalThreads = processes.Sum(p => p.Threads.Count),
MinThreads = processes.Min(p => p.Threads.Count),
MaxThreads = processes.Max(p => p.Threads.Count),
StdDevThreads = processes.Aggregate(
new StdDevAccumulator<Process>(processes, p => p.Threads.Count),
(acc, p) => acc.Accumulate(p.Threads.Count),
(acc) => acc.ComputeResult()
)
};

|
-
Here is the latest in my link-listing series. Also check out my ASP.NET Tips, Tricks and Tutorials page for links to popular articles I've done myself in the past. ASP.NET ASP.NET AJAX ASP.NET MVC Visual Studio -
VS 2008 Web Deployment Hot-Fix Roll-Up Now Available for non-English Languages: Last month we shipped a hot-fix release that fixes a number of bugs, adds a few features, and improves performance for web development scenarios in VS 2008 and Visual Web Developer 2008 Express. Last month's release only worked with the English-language VS 2008 products. Yesterday we shipped an update that now works for all VS 2008 languages except Portuguese and Russian (which are still to come in the future). Silverlight -
Using Silverlight 2's DataGrid with WCF + LINQ to SQL: This 15 minute video blog demonstrates how to build a LINQ to SQL object model on the server and publish it using WCF. It then demonstrates how to build a Silverlight client that uses the new Silverlight DataGrid control, and which calls the WCF service to retrieve the LINQ to SQL data to populate it with. -
Simple Editing of Web Service Data in a DataGrid: Mike Taulty has a nice blog post that shows how to create a WCF service on the server, and then use it from a Silverlight 2 client to retrieve data, bind it to a DataGrid, allow users to update rows, add/delete rows, and then save it back to the server using Silverlight 2 Beta1. -
Sorting with Silverlight 2's DataGrid Control: The DataGrid control in Silverlight 2 Beta1 doesn't yet have built-in column sorting support (it is coming in Beta2). That hasn't stopped Matt Berseth though! In this post he shows how to implement sorting using a custom header column approach. Also check out Matt's post here, which provides a DataGrid test page that shows off a number of the current DataGrid features. .NET Hope this helps, Scott 
|
-
One of the core priorities we focused on when building IIS 7 was to enable a rich .NET extensibility model that provides developers with the hooks to easily plug-in and extend the web server. These extensibility hooks are provided in the web-server pipeline (enabling scenarios like the new IIS7 Bit Rate Throttler), within the configuration system (enabling developers to create new web.config schema settings), within the health monitoring system (enabling developers to add custom trace events), and within the admin tool (enabling developers to plug-in new admin UI modules). We added these extensibility hooks so that anyone can easily extend and enhance the web server using .NET. We also selfishly wanted them so that we can ship regular feature packs that add additional features to the core web server. IIS 7 Admin Pack Preview 1 Released Last week the IIS team shipped the first technical preview of some really cool administration modules that I think web developers will find super useful. This preview adds several new features to the IIS7 Admin Tool: -
Database Manager: Built-in SQL Server database management, including the ability to create, delete, and edit tables and indexes, create/edit SPROCs and execute custom queries. Because it is integrated in the IIS administration tool it all works over HTTP/SSL - which means you can use the module to remotely manage your hosted applications (even with low-cost shared hosting accounts), without having to expose your database directly on the Internet. -
Log Reports: Built-in report visualization with charting support for log files data. Full range selection and custom chart creation is supported, as well as the ability to print or save reports. Like the database manager you can use this module remotely over HTTP/SSL - which means it works in remote shared hosting scenarios. Below are some screen-shots and simple walkthroughs of the Log Reporting and Database Manager administration UI modules: Log Reporting Admin Module Have you ever deployed a web application onto a server and wondered how much load it is getting?, what the average response time from the server is?, or whether many server errors are occurring (and if so on what URLs)? All of these settings are carefully logged by IIS in a text based log file. Today most people use command-line tools like the IIS Log Parser utility to query and analyze these files. The IIS 7 Admin Pack and the new "IIS Reports" admin module now enable you to also query and chart your reports graphically within the IIS admin tool: Out of the box the "IIS Reports" admin module comes with a bunch of pre-built logparser-based reports that you can easily run on your sites and applications: Below is a simple graphical report we could pull up that looks at the HTTP status codes being returned by my "TestSite" application (note how we are using the "bar graph" visualization option): Reports can optionally be filtered using a date range. You can also push the print or save buttons within the report page to generate a printer or a local saved version of the report. The IIS7 Admin Tool is a rich client application (built using WinForms) - but it does all of its remote access and work using HTTP based web-services that connect to the remote web-server. This means it will work through firewalls, and a hoster does not need to open up ports in their network in order to enable it. Once a hoster installs the IIS 7 Admin Pack on their web-servers, remote customers managing their hosted sites using the IIS admin tool (which is built-into Vista and available as a download for Windows XP clients) will automatically be prompted to enable the IIS Reports admin module (the install of the client-side module is seamless). They'll then be able to use the reports module inside their admin tool to pull up reports for their remote hosted sites. Note: hosters can optionally disable this feature if they want, or choose to restrict or customize the list of reports provided. Hopefully most hosters will chose to just make this a standard feature of all IIS and ASP.NET plans they offer. Database Manager Module Have you ever deployed your application and database to a remote hosting provider and wanted to make a quick change to the database (but your hosting provider didn't support accessing it using the SQL admin tool)? Using the new "database manager" module within the IIS admin tool you can now remotely access your database and make changes to it using HTTP/SSL through the web-server. Just connect your IIS administration tool to your remote site and click the new "Database Manager" icon: By default the Database Manager module will look at the <connectionStrings> section of your web application's web.config file, and allow you to easily access any of the databases your hosted application is using. For example, below my TestSite application has a "NorthwindConnectionString" setting in the <connectionStrings> section of my web.config (which is why it shows up in my list of connection nodes). When I click it I can view and edit my SPROCs and Table Schema (including indexes): We could right-click on any table to edit the row data within it, or alternatively perform a custom SQL query to retrieve a custom set of data: What is nice is that a hoster can easily enable all of the above database admin features for both dedicated and shared hosting plans (even when there are hundreds or thousands of customers on a single server). Like all other modules in the admin tool, all communication between the rich client front-end and the backend at the hoster is done over HTTP/SSL based web-services (meaning it goes through firewalls and doesn't require the hoster to open any new ports - nor expose the SQL server directly on the Internet). Hopefully this database administration module will just be a standard feature that all IIS hosters enable - which will make remote hosted data management much easier going forward. Summary Over time you'll see even more admin UI modules be shipped in the IIS 7 Admin Pack and many more features enabled (Carlos, who runs the dev team building the admin tool, is actively asking for suggestions on what you'd like to see via his blog - so drop him a comment if you have a suggestion or want to provide some encouragement). You can download the first technical preview of IIS 7 Admin Pack release here as well as learn more about it via the online documentation here. The above modules work with both the IIS7 release in Vista SP1 as well as Windows Server 2008. Hope this helps, Scott 
|
-
Given this simple Employee class:
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
}
How many employees do you expect to see from the following query with a Distinct operator?
var employees = new List<Employee>
{
new Employee { ID=1, Name="Barack" },
new Employee { ID=2, Name="Hillary" },
new Employee { ID=2, Name="Hillary" },
new Employee { ID=3, Name="Mac" }
};
var query =
(from employee in employees
select employee).Distinct();
foreach (var employee in query)
{
Console.WriteLine(employee.Name);
}
The answer is 4 – we'll see both Hillary objects. The docs for Distinct are clear – the method uses the default equality comparer to test for equality, and the default comparer sees 4 distinct object references. One way to get around this would be to use the overloaded version of Distinct that accepts a custom IEqualityComparer.
Let's try the query again and project a new, anonymous type with the same properties as Employee.
var query =
(from employee in employees
select new { employee.ID, employee.Name }).Distinct();
That query only yields three objects – Distinct removes the duplicate Hillary! How'd it suddenly get so smart?
Turns out the C# compiler overrides Equals and GetHashCode for anonymous types. The implementation of the two overridden methods uses all the public properties on the type to compute an object's hash code and test for equality. If two objects of the same anonymous type have all the same values for their properties – the objects are equal. This is a safe strategy since anonymously typed objects are essentially immutable (all the properties are read-only). Fiddling with the hash code of a mutable type gets a bit dicey.
Interestingly – I stumbled on the Visual Basic version of anonymous types as I was writing this post and I see that VB allows you to define "Key" properties. In VB, only the values of Key properties are compared during an equality test. Key properties are readonly, while non-key properties on an anonymous type are mutable. That's a very C sharpish thing to do, VB team.

|
-
I've been working on some tutorials for the www.asp.net site on the topics of forms authentication, authorization, membership, and roles. The first set of tutorials covered security basics and examined forms authentication in detail; the second set looked at the Membership system and the SqlMembershipProvider. The third set of tutorials are now available online and focus on the Roles framework and the SqlRoleProvider.
- Creating and Managing Roles [VB | C#] - examines the Roles framework and the SqlRoleProvider. Shows how to create new roles and manage these roles from a web page interface.
- Assigning Roles to Users [VB | C#] - looks at the Roles framework methods for assigning and removing users from roles.
- Role-Based Authorization [VB | C#] - shows how to perform role-based URL authorization, as well as how to programmatically grant or deny functionality based on the currently logged in user's role(s). Also looks at using the LoginView control to display different content based on the logged on user's role.
All tutorials are available in C# and VB versions, include a complete, working source code download, and are available to download as PDF. The next batch of tutorials examines creating administrative pages to manage user accounts.
Enjoy! - http://asp.net/learn/security/
|
-
The least intuitive LINQ operators for me are the join operators. After working with healthcare data warehouses for years, I've become accustomed to writing outer joins to circumvent data of the most … suboptimal kind. Foreign keys? What are those? Alas, I digress…
At first glance, LINQ appears to only offer a join operator with an 'inner join' behavior. That is, when joining a sequence of departments with a sequence of employees, we will only see those departments that have one or more employees.
var query =
from department in departments
join employee in employees
on department.ID equals employee.DepartmentID
select new { employee.Name, Department = department.Name };
After a bit more digging, you might come across the GroupJoin operator.
We can use GroupJoin like a SQL left outer join. The "left" side of the join is the outer sequence. If we use departments as the outer sequence in a group join, we can then see the departments with no employees. Note: it is the into keyword in the next query that triggers the C# compiler to use a GroupJoin instead of a plain Join operator.
var query =
from department in departments
join employee in employees
on department.ID equals employee.DepartmentID
into
employeeGroup
select new
{ department.Name, Employees = employeeGroup };
As you might suspect from the syntax, however, the query doesn't give us back a "flat" resultset like a SQL query. Instead, we have a hierarchy to traverse. The projection provides us a department name for each sequence of employees.
foreach (var department in query)
{
Console.WriteLine("{0}", department.Name);
foreach (var employee in department.Employees)
{
Console.WriteLine("\t{0}", employee.Name);
}
}
Flattening a sequence is a job for SelectMany. The trick is in knowing that adding an additional from clause translates to a SelectMany operator, and just like the outer joins of SQL, we need to project a null value when no employee exists for a given department – this is the job of DefaultIfEmpty.
var query =
from department in departments
join employee in employees
on department.ID equals employee.DepartmentID
into employeeGroups
from employee in employeeGroups.DefaultIfEmpty()
select new { DepartmentName = department.Name, EmployeeName = employee.Name };
One last catch – this query does work with LINQ to SQL, but if you are stubbing out a layer using in-memory collections, the query can easily throw a null reference exception. The last tweak would be to make sure you have a non-null employee object before asking for the Name property in the last select.

|
-
Last month I blogged about our ASP.NET MVC Roadmap. Two weeks ago we shipped the ASP.NET Preview 2 Release. Phil Haack from the ASP.NET team published a good blog post about the release here. Scott Hanselman has created a bunch of great ASP.NET MVC tutorial videos that you can watch to learn more about it here.
One of the things I mentioned in my MVC roadmap post was that we would be publishing the source code for the ASP.NET MVC Framework, and enable it to be easily built, debugged, and patched (so that you can work around any bugs you encounter without having to wait for the next preview refresh release).
Today we opened up a new ASP.NET CodePlex project that we'll be using to share buildable source for multiple upcoming ASP.NET releases. You can now directly download buildable source and project files for the ASP.NET MVC Preview 2 release here.
Building the ASP.NET MVC Framework
You can download a .zip file containing the source code for the ASP.NET MVC Framework for the release page here. When you extract the .zip file you can drill into its "MVC" sub-folder to find a VS 2008 solution file for the project:
Double-clicking it will open the MVC project containing the MVC source within VS 2008:
When you do a build it will compile the project and output a System.Web.Mvc.dll assembly under a \bin directory at the top of the .zip directory. You can then copy this assembly into a project or application and use it.
Note: the license doesn't enable you to redistribute your custom binary version of ASP.NET MVC (we want to avoid having multiple incompatible ASP.NET MVC versions floating around and colliding with each other). But it does enable you to make fixes to the code, rebuild it, and avoid getting blocked by an interim bug you can't work around.
Next Steps
Our plans are to release regular drops of the source code going forward. We'll release source updates every time we do official preview drops. We will also release interim source refreshes in between the preview drops if you want to be able to track and build the source more frequently.
We are also hoping to ship our unit test suite for ASP.NET MVC in the future as well (right now we use an internal mocking framework within our tests, and we are still doing some work to refactor this dependency before shipping them as well).
Hope this helps,
Scott 
|
-
-
Video on the web is now one of those common scenarios that every user takes for granted, and increasingly every major site is incorporating in some form (product videos, training videos, richer advertising scenarios, user generated content, customer testimonials, etc). One of the challenges when adding video to a site, though, is delivering it in a way that doesn't cost a fortune. Network bandwidth costs a lot of money, and the cost of high quality video usage can quickly add up. The blog post below provides a quick overview of some of the options you can use to reduce the cost of delivering video, and discusses a new free download - the IIS 7.0 Bit Rate Throttling Module - that was released a few days ago and which enables you to easily save money when serving video from an IIS web server using any video technology (including Silverlight, Windows Media Player and even Flash). Option 1: Using a Video Hosting Service One approach you can take to reduce video bandwidth costs is to use a video hosting service like YouTube or the free Microsoft Silverlight Streaming Service. This allows you to use someone else's network to deliver the video content, and avoid having to pay the bandwidth costs yourself. If you aren't familiar with the Silverlight Streaming service, it allows you to upload up to 10GB of videos and download 5 Terabytes/year of video content (at up to a 1.4 Mbps bit-rate) for free. You can build any custom Silverlight client player application you want to embed the video within it. This means it doesn't require a specific video player look and feel, nor a service logo/watermark to play the video. This allows you to fully integrate the video into your site and use whatever UI you want to host it. Option 2: Hosting Video on Your Own Servers Sometimes using a video hosting service doesn't make sense (for example: you want to use custom authentication to grant/deny user's access, you want to play really long video segments, or you want to serve up custom ads in your videos). Instead you might want to serve the video up from your own servers and have complete control over it. There are typically two options you can use to deliver the video from your servers: using a streaming approach or a progressive video download approach: Streaming Server Scenario In a streaming scenario a client (like Silverlight, Windows Media Player, Flash or Real Networks) connects to a streaming server. The streaming server then sends down the video stream to watch, and typically enables a user to dynamically skip ahead/behind, pause or stop the video stream. When the user closes the browser or navigates away from the page the video stream automatically stops transmitting. Windows Media Services (WMS) is a free streaming server download available for Windows, and can stream video to both Windows Media Player and cross-platform Silverlight browser clients. It is generally regarded as the most server scalable and cost effective way to enable video streaming on the web, and handles both on-demand file streaming scenarios (for example: streaming a .wmv file) as well as live stream scenarios (for example: a sporting event like the Olympics that is happening live in real time). Windows Media Services can be used on any version of Windows Server - including the new Windows Server 2008 Web Server edition (which only costs $469, enables up to 4 processors and 32GB of RAM, and supports IIS, ASP.NET, SharePoint, and Windows Media Services). Progressive Download Scenario In a progressive download scenario a client (like Flash or Silverlight) downloads a video directly off of a web-server, and begins playing it once enough video is downloaded for it to play smoothly. The benefit of using a progressive download approach is that it is super easy to setup on a web-server. Just copy/ftp a video up to a web-server, obtain a URL to it, and you can wire it up to a video client player. It doesn't require any custom web-server configuration, nor require a streaming server to be installed, in order to enable. The downside of using a progressive video download approach, though, is that web-servers are by default designed to download files as fast as possible. So when a user clicks to watch a video on your site, your web-server will attempt to transmit it to the client as fast as possible. This is fine if the user decides to watch the entire video. But if the user stops watching the content half way through the video (or navigates to a different page), you will have downloaded a bunch of video content that will never be watched. If the remaining un-watched video content is several megabytes (or even tens of megabytes) in size, you will end up over time spending a lot of money on bandwidth that is not benefiting your business/site at all.... IIS 7.0 Bit Rate Throttling Module Last week the IIS team shipped a new free IIS 7.0 bit-rate throttling module that makes progressive video scenarios much cheaper in cost. The bit rate throttling module enables you to easily configure bandwidth throttling rules for any type of media content downloaded from an IIS web server (including .WMV, .MOV, .FLV and .MP3 files). Out of the box, the bit rate throttling module causes IIS to quickly transmit a burst of initial media content when a file is requested. By default the rules are set to look at the mime-type and bit-rate encoding of the file, and send as fast as possible enough of the media file to play 20 seconds of it. Once the video client has 20 seconds of the media to play, the IIS bit rate throttling module will then throttle down the transmit rate to equal the bit-rate encoding of the file. It will then monitor whether the video player on the client ever closes or navigates to a different video, and automatically stop the remainder of the file being sent if the user goes away. For example, if you are playing a 35MB video file that is encoded at a bit-rate of 500 Kbps, IIS will send a 20 second burst of the video (20 seconds @ a 500Kbps encoding == 1.25MB of content) as fast as possible to start the video client playing, and then download the remainder of the video at a download rate of only 500 Kbps (enough so that the user always has 20 seconds of video cached on the client so that they never get buffered). If after a minute the user gets bored and either stops the video or navigates to a new page, IIS will detect that they went away and stop transmitting the remainder of the 35MB file. Since IIS only downloaded 80 seconds of total video in this scenario (the 60 seconds that the user watched + the 20 second buffer window), only 5MB instead of 35MB of network bandwidth ended up being used. 30MB of bandwidth savings repeated hundreds or thousands of times a day can easily translate to thousands of dollars of bandwidth savings per year.... IIS 7.0 Bit Rate Throttling Module Download and Installation You can download and learn more about the IIS 7.0 bit-rate throttling module here. Once installed, you can click the "Bit Rate Throttling" node in the IIS admin tool: And then configure whatever bit-rate throttling rules you want on a per file or per file-type basis: The below whitepapers describe how to enable and use it more: Also check out Mike's post here and Vishal's post here and here for more details. Hope this helps make your video scenarios more cost effective, Scott 
|
-
I was experimenting with the new SyndicationFeed class in 3.5 earlier this year and devised a mashup LINQ query:
string[] feedUrls = { "http://www.OdeToCode.com/blogs/scott/rss.aspx",
"http://www.pluralsight.com/blogs/mainfeed.aspx",
"http://feeds.feedburner.com/ScottHanselman"
};
var items =
from url in feedUrls
let feed = SyndicationFeed.Load(XmlReader.Create(url))
from item in feed.Items
where item.PublishDate > DateTime.Now.AddDays(-30)
orderby item.PublishDate descending
select item;
// display the most recent 15 items
foreach (SyndicationItem item in items.Take(15))
{
Console.WriteLine("{0} : {1}",
item.PublishDate.Date.ToShortDateString(),
item.Title.Text);
}
The code is able to filter and sort RSS items from an arbitrary number of blogs with a 6 line query expression. I was thinking of this code when I ran across Scott Hanselman's Weekly Source Code 19 – LINQ and more What, Less How. Scott's reader David Nelson had the following observation:
I disagree with Siderite, in that I think the LINQ example is more readable than the iterative example; however, as has been pointed out, it leaves no room for error handling or AppDomain transitions. This is a problem with LINQ in general; in trying to make everything very compact, it leaves too little room to maneuver.
The LINQ query I'm using isn't production code. If just one blog is down and the XmlReader throws an exception, the entire operation is borked. One solution is to wrap the feed reading into a method that uses exception handling and returns an empty SyndicationFeed in case of an exception - then invoke the method from inside the query. Could anything else go wrong? Sure - one null PublishDate on an item and again we'd be borked. Bullet-proofing a LINQ query might take some work, especially when dealing with third party types.
As LINQ moves us into the "What" instead of the "How", it might be harder to see these types of error scenarios. LINQ is a fantastic technology, but like everything in software, it is a good idea to look the gift horse in the mouth.

|
-
After a three month hiatus, I am back to authoring the Toolbox column for MSDN Magainze. (Thanks to James Avery for authoring the column the last three months.) There has also been some changes to the content you'll find in Toolbox. When the column debuted in January 2006, it was designed to examine two to three indespensible developer tools and a book review. Specifically, it aimed to cover commercial tools designed by third-party vendors that weren't priced beyond levels that would require top-tier managerial approval to buy (in other words, it should not include products costing several thousands of dollars).
The focus of the column has shifted a bit. Instead of focusing exclusively on commercial ISV products, the column is more dedicated to examining community-created projects and open-source software. We are also launching a new section in the Toolbox column called Blogs of Note, where I share and review interesting and informative technology-focused blogs. The column still includes a commercial ISV software reviews and a book review.
The March issue of Toolbox includes coverage on:
- Firebug - a free, open-source client-side Web development tool for the Mozilla FireFox browser. With Firebug you can quickly examine and modify the HTML, CSS, and JavaScript of a page, all directly within the browser. A must-have tool for web developers.
- Scott Guthrie's Blog - Scott is one of the original creators of Microsoft's ASP.NET and, today, is the Vice President of the Microsoft Developer Division. His blog is a fountainhead of information on current and upcoming web technologies and tools.
- Extending Reflector with Add-Ins - a look at the popular disassembler and class viewer, Reflector, along with information about a variety of free, community-created Reflector Add-Ins.
In addition, I reviewed Lynn Beighley's book Head First SQL (O'Reilly). Here is a snippet from the review:
Most books that teach SQL do so with dry prose and focus on business and accounting scenarios. O'Reilly's Head First SQL by Lynn Beighley turns this approach on its head, and to great effect. The topics covered in Head First SQL are familiar: the fundamentals of the SELECT, INSERT, UPDATE, and DELETE queries; JOINs; subqueries; data normalization; data and relational integrity; and so on. But the unique presentation in Head First SQL makes it fun to learn and easy to remember.
...
Head First SQL shines in its ability to explain concepts in a way that makes even the most complicated scenarios seem like common sense. The chapter on JOINs is the most lucid and digestible description I've read yet. The same is true for the chapter on subqueries.
I hope you like the shift in focus of the Toolbox column. I invite any feedback, comments, or constructive criticism you may have about the column at mitchell@4guysfromrolla.com. Likewise, send me any suggestions for products, blogs, or books to review!
On a side note, it appears that the MSDN Magazine website has been retooled and many past links to my Toolbox columns are now broken. Boo. I've always been a firm believer that URLs are a public interface and therefore must remain in tact for the lifetime of the website (in theory, then, forever); it's frustrating that Microsoft doesn't share these same ideals.
As always, if you have any suggestions for products, blogs, or books to review for the Toolbox column, please send them to me at mitchell@4guysfromrolla.com
|
-
I'm slowly recovering from keynoting at MIX last week, and have been digging my way out of backlogged email the last few days. I'm going to try and finish catching up on blog comments this weekend - apologies for the delay in getting back to some of your questions. To kick-start my blogging again I thought I'd post a new link-listing series. Today's post is mostly focused on ASP.NET and web related links. I'm going to be doing more Silverlight and WPF posts soon. ASP.NET ASP.NET AJAX ASP.NET MVC -
Thoughts on ASP.NET MVC Preview 2 and Beyond: Phil Haack from the ASP.NET team has a great post where he talks about the ASP.NET MVC Preview 2 release, as well as some of the features and work that will show up in the next preview drop. One of the major focuses in Preview 3 will be improvements to the testing workflow of controllers. -
ASP.NET MVC Test Project Integration with NUnit and Rhino Mocks: Joe Cartano from the VS Web Tools team walks-through using some NUnit and Rhino Mocks project templates that he has created. These plug-into the new VS 2008 tools support for ASP.NET MVC, and enable you to easily get a test project started when you create a new ASP.NET MVC application. .NET Hope this helps, Scott 
|
-
Back when I wrote Visual Studio Hacks the book I also started the companion site, I kept up for awhile and then it gradually got swept to the sideline. When I was getting ready to work on the second edition of the book (which O'reilly decided not to do) I revived the site and started posting to it again, I also got Jim Holmes and Mike Wood to write some articles. Then it went back into hibernation. The other day I was thinking about the site and figured I either need to kill it off, or try and revive it.
Well, I decided to revive it. I threw out all the old custom code (I love deleting code!) and converted the site to Graffiti, tweaked the design a little bit, and re-launched it. Now comes the difficult part, actually getting some fresh content on it. Another thing I decided is to make the focus of the site more of a blog. It will still feature articles, and I am working on a couple of screencasts, but the blog will be the most active part of the site.
Because I know that I don't have a ton of time, between consulting and other projects, I decided to look for someone to help out with the site. The other day I ran across Darren Stokes who was writing some excellent Visual Studio posts over on his blog and have convinced him to join forces and write for Visual Studio Hacks instead. I am thrilled to have him on board and I think between the two of us we will be able to turn Visual Studio Hacks into the premier Visual Studio focused site. His first Visual Studio Links post is already up.
From a business perspective my main goal with the site is to help increase the visibility of The Lounge, and in particular the .NET Small Publishers Room of The Lounge. You will notice I nixed all the google ads and am only running The Lounge ad.
Third time is a charm they say, let's hope that turns out to be true for this site. Check it out, subscribe to the feed, let me know what you think.
-James
| |
|