|
Posted 3/11/2009 by ccook, .NET Prog
|
| |
Achieving a high score on the Graduate Record Exam (GRE) is a base requirement for entering a graduate program in any major university, including the University of Florida. As an engineer, I found that getting a high score on the verbal portion of the test was more difficult than the analytical or math-based sections. Verbal exams, on both the GRE and SAT, tend to be a major hurdle for students because of the amount of vocabulary that needs to be memorized. Traditionally, the only technique to learn vocabulary words was by using Flash Cards repeatedly for several weeks prior to the test.
In my mind, creating and using Flash Cards was tedious and probably a less-than-optimal way to memorize vocabulary words because of the technology that’s available. I felt there had to be a faster, more efficient strategy. With that thought in mind, I set out to develop my own GRE vocabulary study application.
The result of using the application speaks for itself: I raised my GRE verbal score by over 10% with less than 15 hours of accumulated study time. That amounted to roughly 514 vocabulary words memorized in only 30 days.
Based on my successful use of the tool, I chose to make it publically available at GreatVocab.com and the site now has over 200 active users.
When it came to developing the application I had many options as an experienced computer programmer. I wanted something that was fast and could be easily expanded upon, including the seamless addition of future upgrades and feature-sets.
I chose Microsoft’s Model View Controller (MVC) Framework for these and other reasons.
Great Vocab explored the development process leveraging LINQ and MVC, along with the progressive releases of MVC, from Preview 2 all the way to the current Release Candidate 2. Early in the development cycle the MVC Framework was seen as a high risk foundation, but with time and attention I was able to produce a reliable application using the languages.
Great Vocab was designed to help students like myself to quickly learn SAT and GRE vocabulary words. This was accomplished using a training algorithm which was developed to guide the word selections of users.. To utilize the algorithm the application needs to rapidly pull from an unabridged dictionary with nearly 200,000 definitions while utilizing verbal, tensile, structural and synonym/antonym relationships in the query.
Adding to the technical challenges, I created an automated, in-context feature that gives a text citation relevant to each word as it’s being studied. This feature introduced a new requirement: rapid and frequent database queries to a full gigabyte of referential data.
The first challenge of the application’s development was gathering GRE and SAT vocabulary words and definitions for the database. Here, LINQ proved invaluable in saving development hours as well as some Regular Expression matching patterns.
The dynamic nature of LINQ with the use of a referential DataContext DBML made creating one off console applications extremely quick. That enabled rapid and custom data shaping from various sources into the database.
Using MVC for application development introduced a learning curve at the outset, but returned the investment with interest. Starting challenges included in-form state management, with its characteristic drop of the ViewState and ControlState. The challenges were lessened as the MVC Framework evolved and offered DataContracts which providd quick binding of the data to and from the forms.
In the later stages I found URL routing to be well advanced. With the MVC Futures it was easy to extend the relative URL routing to absolute routing. This enabled portions of the site to be declared secure, while all of the links would automatically resolve to a fully qualified URL when needing to move the user off or onto an SSL connection.
The meat of the application, layered out from MVC concerns, benefited from the dynamic nature provided by LINQ and its expression trees. Expressing the training algorithm within LINQ rather than Stored Procedures sped development greatly as the algorithm could be shaped at run time while delaying execution against the SQL server.
Another new Microsoft component was utilized to provide for visual interpretation of a user’s progress through the training program: .NET Charting. The charting controls were easily implemented on top of existing data with minimal shaping and rendered beautifully with little adjustment. Another benefit was that the controls allowed cached output, giving additional performance boosts.
The GreatVocab application tuning was performed using the SQL Server Tuning Advisor while running compiled LINQ Queries. This stressed the application with a load test via Microsoft’s Visual Studio Test Edition. The tuning yielded a quick 60% performance gain. Manual tuning and indexing of the queries provided further performance gains where needed.
Red Gate’s .NET Profiler was also used in detailing the performance of the application and refining the application. Remarkable performance was observed on the part of MVC, validating some claims to dramatic speed increases with MVC’s lighter request life cycle.
In sum, MVC and LINQ provided a strong framework upon which GreatVocab.com was developed. I look forward to its final release and potential adaptation into standards here on coming projects.
Share:
rating:
|
Posted 2/25/2009 by TomB, Acct Mgr
|
| |

As an old school gamer born in the Atari 2600 era, Quake III Arena came out during my gaming glory days back in 1999/2000. I have played countless hours and have many fun memories with this classic game. Recently, I had the pleasure of playing this during the closed beta for a month before the beta opened public yesterday.
The thing that is most impressive in playing the game is massive information architecture Web development that went into this project. Basically the id software development team crammed around a 500MB install package from the original Quake III to a 6.8MB plug-in for your Web browser. How was it done?? I have no clue and the infrastructure portion has to be massive!
Quake Live runs on a slightly updated version of the id Tech 3 engine, but the focus remains on usability rather than major graphical upgrades. Among other usability changes,Quake Live has a new, more streamlined HUD. While the game is free, Quake Live will be backed financially by in-game advertising from IGAWorldwide. IGA Worldwide is the leading dynamic in-game advertising network. Once a QUAKE LIVE player account has been created, an intuitive and engaging web site becomes each players’ unified interface for joining online games, practicing privately against computer controlled opponents, finding and communicating with friends, and monitoring match scores, leaderboards, statistics, and awards. Joining the perfect game is always one click away, as QUAKE LIVE’s skill matching system automatically suggests a selection of matches based on each individual player, using factors like skill, and connection quality. Plus, since the game is accessed and delivered entirely through the web, players can login and play from anywhere - with all of their personal game settings, custom controls and friends as close as the nearest web browser.
Source: www.idsoftware.com
Also, if any 352 staff members are up for some dueling, CTF or Team DM afterhours, add “352Jaxx” as a friend :).
Share:
rating:
|
Posted 10/27/2008 by PeterB, .NET Prog.
|
| |
For those of you that are interested:
Microsoft Pre-release Software Visual Studio 2010 and .NET Framework 4.0 Community Technology Preview (CTP)
http://www.microsoft.com/downloads/details.aspx?FamilyID=922b4655-93d0-4476-bda4-94cf5f8d4814&DisplayLang=en
Sorry for the short post, just trying to use PVR's Hassle-Free Blogging For Business Tips
Share:
rating:
|
Posted 10/21/2008 by PeterB, .NET Prog.
|
| |
Have you ever copied some code in order to place it on a new line, and then when you tried to paste it you hit CTRL-C instead of CTRL-V? If you have, then you probably have dealt with the frustration of losing what was in your clipboard. For most people this meant finding that code to once again copy it and then meticulously stare at the keyboard making sure that they hit the right key.
Well, there is one way to deal with this and that is using CTRL-SHIFT-V. This shortcut key will allow you to cycle through your clipboard and get back that code you just lost. If you hold CTRL-SHIFT while hitting 'V' you will begin to cycle through each element in your clipboard, probably starting with the new empty line you copied and then followed by the code you had intended to paste. This is actually a very handy shortcut key that I also find useful outside of this scenario.
For those of you who would rather not deal with ever losing your clipboard to a blank line, well there is an option for you too. If you go to Tools > Options > Text Editor > All Language > General you can uncheck "Apply Cut or Copy Commands to blank lines when there is no selection". From here, you will no longer have to deal with the unfortunate mistype of copying a blank line.
I recently came across this and many other great tips at Sara Ford's Blog. Within it you can find Visual Studio 2008 tips, which she publishes daily. I would recommend to anyone using Visual Studio to definitely add this to their list of RSS Feeds if they have not done so already.
Share:
rating:
|
Posted 8/26/2008 by PeterV, VP, Marketing
|
| |
So the iPhone topped Stephen Colbert's latest ThreatDown, a list of the top five threats to America. Why? A kill switch. Check out the video (skip ahead to 5:40):
Share:
rating:
|
Posted 8/22/2008 by ccook, .NET Prog
|
| |
RockScroll has been introduced on Scott Hanselfman’s blog. If you work with Visual Studio, this is a must. I have found it to be one of my most used features of Visual Studio. It keeps the ‘visual’ interpretation of even the largest of code files intact. Check it out:
http://www.hanselman.com/blog/IntroducingRockScroll.aspx
Share:
rating:
|
Posted 7/22/2008 by PeterV, VP, Marketing
|
| |
There are a ton of hosting shops out there, as I'm sure you're aware if you've ever search for hosting. And, if you've ever chosen the cheapest, I'm sure you're also aware there are some fly-by-night shops. Downtime, poor backups, bad customer service...you know what I'm saying.
As a developer, we've spent a ton of time looking at hosting. We originally did it in house (in a room with wooden beams under the server rack and a fire sprinkler overhead...yeah) and then moved it to more capable firms. Of the various shops we've worked with, and there have been tons, none comes close to Rackspace.
At first we just sent Rackspace the high-end projects that were mission critical. We figured they weren't competitive for smaller shared-hosting environments. Shame on us! Rackspace has become our go-to vendor now for hosting of all shapes and sizes, from a site with a few hundred users to sites with thousands of concurrent users across multiple boxes.
And now Rackspace is returning the favor. They've setup a page where our customers can request pricing. Those customers that come through our page will receive special pricing.
So if you're in need, take a look. It can't hurt, but it can certainly help!
Here's the page in question: http://www.rackspace.com/partners/solution_partners/index.php?partner_id=89

Share:
rating:
|
Posted 3/22/2008 by ccook, .NET Prog
|
| |
You learn something new every day, but it’s not every day you learn something really useful. Alt in Visual Studio has to be one of the most useful text editing shortcuts I have come across since copy and paste (kudos to Mr. Evol). Alt allows you to select vertical regions of text, the usefulness of which I demonstrate below.
Say you would like to add the namespace using statements to a string builder within a new class, say Class1.

There are three namespaces so you can quickly create the three append lines.

Now one could copy each namespace individually, or, just select them all with Alt.

Copy that block and paste it into the first append to get

This demo’s code is of course useless, but the technique is invaluable.
Share:
rating:
|
Posted 3/21/2008 by ccook, .NET Prog
|
| |
We recently moved our development from CVSNT to SVN, which has been working out great. The two are very similar, what was once done in CVS, can for the most part be done in SVN. For example an update in CVS and SVN are accomplished with:
cvs update
svn update
One useful flag for cvs update was –C, for a clean update. In a clean update the working copy is updated to match the current version. In SVN, an analogous flag is not available (or at least I cannot find it). There is a revert command available which will bring all of the versioned files to the previous revision, effectively an update clean, with exceptions. The extra files remain (new files), and any new changes on the server are not considered. The revert command simply rolls the versioned files back to what they were at the last update or checkout. In order to recreate the clean update in SVN, I decided to run revert, a manual cleanup and then an update. The first and last are trivial, but manually cleaning the new files out at the command line took some work and the solution is presented here.
Creating an update clean equivalent
SVN provides a status command which lists the files and their status within a working copy.
svn st --no-ignore
Now in order to find only the new files (indicated by ‘?’), the output is filtered with AWK. To do this the output from SVN is piped (redirected) to AWK. The parameters for AWK tell it to split the lines on ‘?’, remove some whitespace, then print the filename (second parameter) for all lines with ‘?’.
svn st --no-ignore | awk -F? "/?/ {gsub(/ /,"""""",$2);print $2}"
With the list of extra files in the pipe we simply need to delete them. Unfortunately ‘delete’ does not accept redirected output like ‘rm’ from UNIX, so I just quickly knocked one out. The source for rmp, written in c# is also included.
svn st --no-ignore | awk -F? "/?/ {gsub(/ /,"""""",$2);print $2}" | rmp
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace rmparam
{
classProgram
{
staticvoid Main(string[] args)
{
string path = "";
if (args.Length == 1)
path = args[0];
Console.WriteLine(path);
string currentLine = Console.In.ReadLine();
while (currentLine != null)
{
Console.Out.WriteLine(path + currentLine);
if (String.IsNullOrEmpty(currentLine) == false)
File.Delete(path + currentLine);
currentLine = Console.In.ReadLine();
}
}
}
}
In order to resolve some path issues on the delete an optional parameter is available to set a base path to delete from.
svn st --no-ignore | awk -F? "/?/ {gsub(/ /,"""""",$2);print $2}" | rmparam "C:\PathToWorkingCopy\\"
The complete command set, which could easily be placed in a bat.
svn revert –R
svn st --no-ignore | awk -F? "/?/ {gsub(/ /,"""""",$2);print $2}" | rmparam "C:\PathToWorkingCopy\\"
svn update
I’m not happy with the dependence on the binary and fixed whitespace length, but it does work. Enjoy!
Share:
rating:
|
Posted 3/12/2008 by DanV, Tech Dir.
|
| |
The majority of advice on how to disable browser caching seems to revolve around how to make it work in IE. However, in Firefox the fixes don't always seem to work. Below are some notes and sample code on how to make it work for both browsers:
The SetNoStore() seems to be a necessity for FireFox
The
HttpCacheability.NoCache has an issue in IE (not sure about FireFox) when you
are on a secure (https) page and are trying to send a file by setting the
headers. It causes the file download to not work properly.
SetValidUntilExpires(), SetRevalidation() – unsure if this is a requirement
at this time. Was added because it was still giving problems in FireFox before
SetNoStore() was found.
SetExpires() I tried to set this to 5 days in the
past and I still got the 2 second window.
public static void DisablePageCaching()
{
//Used for disabling page caching
HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();
}
Share:
rating: