<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>tsJensen.com</title>
    <link>http://www.tsjensen.com/blog/</link>
    <description />
    <language>en-us</language>
    <copyright>Tyler Jensen</copyright>
    <lastBuildDate>Tue, 04 Nov 2008 03:25:45 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.1.8139.823</generator>
    <managingEditor>tyler@tsjensen.com</managingEditor>
    <webMaster>tyler@tsjensen.com</webMaster>
    <geo:lat>40.230954</geo:lat><geo:long>-111.680067</geo:long><image><link>http://www.tsjensen.com/blog/</link><url>http://www.tsjensen.com/images/tsjensen.gif</url><title>tsJensen</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/tsjensen" type="application/rss+xml" /><item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=ad85d194-75db-48fd-9bde-d7c2f7f4fd71</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,ad85d194-75db-48fd-9bde-d7c2f7f4fd71.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,ad85d194-75db-48fd-9bde-d7c2f7f4fd71.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ad85d194-75db-48fd-9bde-d7c2f7f4fd71</wfw:commentRss>
      <title>Apple, I'm a PC and You're a Hypocrite</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,ad85d194-75db-48fd-9bde-d7c2f7f4fd71.aspx</guid>
      <link>http://feeds.feedburner.com/~r/tsjensen/~3/441664967/Apple+Im+A+PC+And+Youre+A+Hypocrite.aspx</link>
      <pubDate>Tue, 04 Nov 2008 03:25:45 GMT</pubDate>
      <description>&lt;p&gt;
One of the latest Apple ads makes fun of Microsoft for spending more on marketing
than on fixing Vista. Time for all you fruit computer junkies to face some cold hard
facts:
&lt;/p&gt;
&lt;p&gt;
Let's take our most recent SEC filing quarter for both companies and compare spending
on sales, marketing and administration versus research and development and then average
that spending per employee.
&lt;/p&gt;
&lt;p&gt;
Microsoft spends about $25,000 per employee on R&amp;D and $43,000 on sales, marketing
and administration.&lt;br /&gt;
A ratio of 1 to 1.72.
&lt;/p&gt;
&lt;p&gt;
Apple spends about $16,300 per employee on R&amp;D and $51,200 on sales, marketing and
administration.&lt;br /&gt;
A ratio of 1 to 3.13.
&lt;/p&gt;
&lt;p&gt;
So relatively speaking, Apple spends nearly twice as much on sales, marketing and
administration as Microsoft does.
&lt;/p&gt;
&lt;p&gt;
And that's one reason why I'm a PC. You can keep your fruit computer.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=ad85d194-75db-48fd-9bde-d7c2f7f4fd71" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/tsjensen?a=5t7nN"&gt;&lt;img src="http://feeds.feedburner.com/~f/tsjensen?i=5t7nN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/441664967" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,ad85d194-75db-48fd-9bde-d7c2f7f4fd71.aspx</comments>
      <category>Commentary</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2008/11/04/Apple+Im+A+PC+And+Youre+A+Hypocrite.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=a1f59f86-a95c-40f8-9854-61bc3ec42109</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,a1f59f86-a95c-40f8-9854-61bc3ec42109.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,a1f59f86-a95c-40f8-9854-61bc3ec42109.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=a1f59f86-a95c-40f8-9854-61bc3ec42109</wfw:commentRss>
      
      <title>What is Enterprise Software Architecture</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,a1f59f86-a95c-40f8-9854-61bc3ec42109.aspx</guid>
      <link>http://feeds.feedburner.com/~r/tsjensen/~3/440233837/What+Is+Enterprise+Software+Architecture.aspx</link>
      <pubDate>Sun, 02 Nov 2008 19:54:07 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
I just posted this on a linkedin group to which I belong, but I thought I'd also like&#xD;
to pose the question here.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I'd like to get a discussion started that attempts to define enterprise software architecture.&#xD;
My own definition seems to be evolvoing with every enterprise for whom I've worked.&#xD;
In the abstract, for me, enterprise software architure is the art of putting the pieces&#xD;
of multiple puzzles together into one great work of art.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
There are many puzzles to choose from and every enterprise has a unique mix. There&#xD;
are multiple teams with various skillsets and experience. There are multiple business&#xD;
processes sometimes with unique and strange business rules. Technology platforms that&#xD;
differ, communications protocols that won't communicate with one another, languages,&#xD;
frameworks, compilers, IDEs, components, and hardware that vary from team to team&#xD;
and department to department. Ours is the task of taking these disparate and often&#xD;
incongruous pieces and molding them into one coherent masterpiece of technology and&#xD;
human resources to get more done, get it done better, quicker, cheaper and easier.&#xD;
And if we do our jobs well, it may be that no one will notice that we did it at all.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
What do you think?&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=a1f59f86-a95c-40f8-9854-61bc3ec42109"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/tsjensen?a=oX17N"&gt;&lt;img src="http://feeds.feedburner.com/~f/tsjensen?i=oX17N" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/440233837" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,a1f59f86-a95c-40f8-9854-61bc3ec42109.aspx</comments>
      <category>Commentary</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2008/11/02/What+Is+Enterprise+Software+Architecture.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=0ddcfcc7-864e-4091-97ef-26184626dc07</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,0ddcfcc7-864e-4091-97ef-26184626dc07.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,0ddcfcc7-864e-4091-97ef-26184626dc07.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=0ddcfcc7-864e-4091-97ef-26184626dc07</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>To Outsource Or Not to Outsource, That is the Question</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,0ddcfcc7-864e-4091-97ef-26184626dc07.aspx</guid>
      <link>http://feeds.feedburner.com/~r/tsjensen/~3/430847902/To+Outsource+Or+Not+To+Outsource+That+Is+The+Question.aspx</link>
      <pubDate>Fri, 24 Oct 2008 15:56:19 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
I just posted the following note on a LinkedIn group I follow in answer to a post&#xD;
about so called "software factories," which is a nice euphemism for overseas developers&#xD;
working for much less than they deserve struggling to meet the unreasonable demands&#xD;
of their bosses. This represents my opinion on the subject: &#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
Never forget that you get what you pay for. Hiring an overseas or even local "software&#xD;
factory" or consultancy to build your software can be problematic at best and a complete&#xD;
waste of time and money at worst. &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
First, if you cannot communicate, forget about it. Building software is 99% communication&#xD;
and 1% technology. Okay, perhaps I overstate the case. A little. But you cannot overestimate&#xD;
the importance of clear, effective communication. &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
Second, unless you have the internal people required to manage such a relationship,&#xD;
your project will fail. This means you need project management and technical people&#xD;
in your own organization that you know well and trust. They need to be supremely competent.&#xD;
This is especially true if you plan to hire a firm outside of your own geographical&#xD;
area. &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
Third, plan for time and budget overages. It is the nature of consulting to promise&#xD;
a low price and quick turnaround and then when you are committed to the project and&#xD;
it is "nearly done," you will be informed that there is much more to do, generally&#xD;
due to legitimate changes in requirements because you did not fully understand what&#xD;
you wanted when the project first began. This is the boon and bane of software development&#xD;
whether internal or external. &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
Finally, you can have success outsourcing your software development project, but do&#xD;
not make the mistake of thinking that it will save you an enormous amount of time&#xD;
and money, especially for a single application project. It takes time to develop a&#xD;
working relationship with an outside consultantcy, especially one that is half way&#xD;
around the world. If you have multiple projects, long term goals, and a huge budget&#xD;
of time and money, it may in fact be cost effective to have a relationship with a&#xD;
so called "software factory." But if you are a small organization and have one or&#xD;
two projects, you will nearly always be better off hiring a professional locally,&#xD;
usually through one of the many technical recruiting companies, to come into your&#xD;
organization as a contractor to work on-site building exactly what you want as you&#xD;
discover over time what it is you want exactly.&#xD;
&lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=0ddcfcc7-864e-4091-97ef-26184626dc07"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/tsjensen?a=cgVsM"&gt;&lt;img src="http://feeds.feedburner.com/~f/tsjensen?i=cgVsM" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/430847902" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,0ddcfcc7-864e-4091-97ef-26184626dc07.aspx</comments>
      <category>Commentary</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2008/10/24/To+Outsource+Or+Not+To+Outsource+That+Is+The+Question.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=d207b2e3-0971-4d68-b836-3fa17ec453cc</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,d207b2e3-0971-4d68-b836-3fa17ec453cc.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,d207b2e3-0971-4d68-b836-3fa17ec453cc.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d207b2e3-0971-4d68-b836-3fa17ec453cc</wfw:commentRss>
      
      <title>ASP.NET MVC RedirectUrl on Login</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,d207b2e3-0971-4d68-b836-3fa17ec453cc.aspx</guid>
      <link>http://feeds.feedburner.com/~r/tsjensen/~3/395236259/ASPNET+MVC+RedirectUrl+On+Login.aspx</link>
      <pubDate>Wed, 17 Sep 2008 14:20:31 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
In my first attempt at creating a real applicaiton using the new ASP.NET MVC project&#xD;
template (&lt;a href="http://www.codeplex.com/aspnet/Wiki/View.aspx?title=MVC&amp;amp;referringTitle=Home"&gt;Codeplex&#xD;
Preview 5&lt;/a&gt;), I found that when I clicked a new tab I'd created linked to a specific&#xD;
controller and an action I'd decorated with the &lt;strong&gt;[Authorize(Roles = "user")]&lt;/strong&gt; attribute,&#xD;
the "out of the box" Login action did not redirect me to the that controller/action&#xD;
combo once I had successfully logged in.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Here's my solution to the problem. First, I added a hidden value in the Login.aspx&#xD;
form. Second, I added a parameter to the Login action in the Acount controller (AccountController.cs).&#xD;
Let me know if you've found a better way.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Here's the code for the form:&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;pre class="csharpcode"&gt;&#xD;
          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&#xD;
          &lt;span class="html"&gt;form&lt;/span&gt;&#xD;
          &lt;span class="attr"&gt;method&lt;/span&gt;&#xD;
          &lt;span class="kwrd"&gt;="post"&lt;/span&gt;&#xD;
          &lt;span class="attr"&gt;action&lt;/span&gt;&#xD;
          &lt;span class="kwrd"&gt;="&amp;lt;%=&#xD;
Html.AttributeEncode(Url.Action("&lt;/span&gt;&#xD;
          &lt;span class="attr"&gt;Login&lt;/span&gt;&#xD;
          &lt;span class="kwrd"&gt;"))&#xD;
%&amp;gt;"&lt;/span&gt;&#xD;
          &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&#xD;
          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&#xD;
          &lt;span class="html"&gt;div&lt;/span&gt;&#xD;
          &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&#xD;
          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&#xD;
          &lt;span class="html"&gt;table&lt;/span&gt;&#xD;
          &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&#xD;
          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&#xD;
          &lt;span class="html"&gt;tr&lt;/span&gt;&#xD;
          &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&#xD;
          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&#xD;
          &lt;span class="html"&gt;td&lt;/span&gt;&#xD;
          &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; Username: &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;=&#xD;
Html.TextBox(&lt;span class="str"&gt;"username"&lt;/span&gt;) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; Password: &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;=&#xD;
Html.Password(&lt;span class="str"&gt;"password"&lt;/span&gt;) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt;&lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="checkbox"&lt;/span&gt;&lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="rememberMe"&lt;/span&gt;&lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; Remember&#xD;
me? &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="rem"&gt;&amp;lt;!--&#xD;
Added to handle the returnUrl --&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;=&#xD;
Html.Hidden(&lt;span class="str"&gt;"returnUrl"&lt;/span&gt;, ViewData[&lt;span class="str"&gt;"ReturnUrl"&lt;/span&gt;].ToString()) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt;&lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="submit"&lt;/span&gt;&lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Login"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Here's the code for the Login action:&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;pre class="csharpcode"&gt;&#xD;
          &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Login(&lt;span class="kwrd"&gt;string&lt;/span&gt; username, &lt;span class="kwrd"&gt;string&lt;/span&gt; password, &lt;span class="kwrd"&gt;bool&lt;/span&gt;?&#xD;
rememberMe, &lt;span class="kwrd"&gt;string&lt;/span&gt; returnUrl) { ViewData[&lt;span class="str"&gt;"Title"&lt;/span&gt;]&#xD;
= &lt;span class="str"&gt;"Login"&lt;/span&gt;; &lt;span class="kwrd"&gt;string&lt;/span&gt; url = (&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(returnUrl)&#xD;
? Request.QueryString[&lt;span class="str"&gt;"ReturnUrl"&lt;/span&gt;] ?? &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty&#xD;
: returnUrl) .Trim(&lt;span class="str"&gt;'/'&lt;/span&gt;); ViewData[&lt;span class="str"&gt;"ReturnUrl"&lt;/span&gt;]&#xD;
= url; &lt;span class="rem"&gt;// Non-POST requests should just display the Login form &lt;/span&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (Request.HttpMethod&#xD;
!= &lt;span class="str"&gt;"POST"&lt;/span&gt;) { &lt;span class="kwrd"&gt;return&lt;/span&gt; View(); } &lt;span class="rem"&gt;//&#xD;
Basic parameter validation&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; errors&#xD;
= &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(); &lt;span class="kwrd"&gt;if&lt;/span&gt; (String.IsNullOrEmpty(username))&#xD;
{ errors.Add(&lt;span class="str"&gt;"You must specify a username."&lt;/span&gt;); } &lt;span class="kwrd"&gt;if&lt;/span&gt; (errors.Count&#xD;
== 0) { &lt;span class="rem"&gt;// Attempt to login&lt;/span&gt;&lt;span class="kwrd"&gt;bool&lt;/span&gt; loginSuccessful&#xD;
= Provider.ValidateUser(username, password); &lt;span class="kwrd"&gt;if&lt;/span&gt; (loginSuccessful)&#xD;
{ FormsAuth.SetAuthCookie(username, rememberMe ?? &lt;span class="kwrd"&gt;false&lt;/span&gt;); &lt;span class="kwrd"&gt;if&lt;/span&gt; (url&#xD;
!= &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; url.Length &amp;gt; 0) &lt;span class="kwrd"&gt;return&lt;/span&gt; RedirectToAction(&lt;span class="str"&gt;"Index"&lt;/span&gt;,&#xD;
url); &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; RedirectToAction(&lt;span class="str"&gt;"Index"&lt;/span&gt;, &lt;span class="str"&gt;"Home"&lt;/span&gt;);&#xD;
} &lt;span class="kwrd"&gt;else&lt;/span&gt; { errors.Add(&lt;span class="str"&gt;"The username or password&#xD;
provided is incorrect."&lt;/span&gt;); } } &lt;span class="rem"&gt;// If we got this far, something&#xD;
failed, redisplay form&lt;/span&gt; ViewData[&lt;span class="str"&gt;"errors"&lt;/span&gt;] = errors;&#xD;
ViewData[&lt;span class="str"&gt;"username"&lt;/span&gt;] = username; &lt;span class="kwrd"&gt;return&lt;/span&gt; View();&#xD;
} &lt;/pre&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=d207b2e3-0971-4d68-b836-3fa17ec453cc"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/tsjensen?a=DJG2L"&gt;&lt;img src="http://feeds.feedburner.com/~f/tsjensen?i=DJG2L" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/395236259" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,d207b2e3-0971-4d68-b836-3fa17ec453cc.aspx</comments>
      <category>Code</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2008/09/17/ASPNET+MVC+RedirectUrl+On+Login.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=143e6e84-645b-471f-b6ed-ed8addf3a422</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,143e6e84-645b-471f-b6ed-ed8addf3a422.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,143e6e84-645b-471f-b6ed-ed8addf3a422.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=143e6e84-645b-471f-b6ed-ed8addf3a422</wfw:commentRss>
      
      <title>Taking a Comment Holiday to Escape the Spammers</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,143e6e84-645b-471f-b6ed-ed8addf3a422.aspx</guid>
      <link>http://feeds.feedburner.com/~r/tsjensen/~3/390323830/Taking+A+Comment+Holiday+To+Escape+The+Spammers.aspx</link>
      <pubDate>Fri, 12 Sep 2008 04:29:40 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
I upgraded to the latest version of dasBlog a few days ago and inadvertently allowed&#xD;
comments without requiring approval. A spambot comment got through and while I quickly&#xD;
turned on the "require approval" feature, it was too late. Since then I've been bombarded&#xD;
with stupid link spam comments. I even deleted the one post that seemed to be the&#xD;
bot target and created a new post with the same content. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
No luck. After many similar spam comments today being posted to the most recent post&#xD;
on my blog, I'm giving up. I'm taking a comment holiday. It won't bother anyone really&#xD;
because I don't get many real comments. I'll enable the comment functionality some&#xD;
day in the future.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Meantime, if you have a comment, feel free to email me and I'll post it as an addendum&#xD;
to the relevant post.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=143e6e84-645b-471f-b6ed-ed8addf3a422"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/tsjensen?a=Z5oFL"&gt;&lt;img src="http://feeds.feedburner.com/~f/tsjensen?i=Z5oFL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/390323830" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,143e6e84-645b-471f-b6ed-ed8addf3a422.aspx</comments>
      <category>Commentary</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2008/09/12/Taking+A+Comment+Holiday+To+Escape+The+Spammers.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=22b6ed69-fe4f-4e2a-959f-95c7a0175b54</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,22b6ed69-fe4f-4e2a-959f-95c7a0175b54.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,22b6ed69-fe4f-4e2a-959f-95c7a0175b54.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=22b6ed69-fe4f-4e2a-959f-95c7a0175b54</wfw:commentRss>
      
      <title>Live Writer Source Code Format Plugin</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,22b6ed69-fe4f-4e2a-959f-95c7a0175b54.aspx</guid>
      <link>http://feeds.feedburner.com/~r/tsjensen/~3/390180684/Live+Writer+Source+Code+Format+Plugin.aspx</link>
      <pubDate>Tue, 09 Sep 2008 18:22:07 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
I've just installed the plugin &lt;a href="http://blogs.msdn.com/mikeormond/archive/2006/08/24/716900.aspx"&gt;blogged&#xD;
about by Mike Ormond&lt;/a&gt; and here's an example of it's output taken from code in the &lt;a href="http://www.codeplex.com/atrax"&gt;Atrax&#xD;
project I've just published to Codeplex&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="csharpcode"&gt;&#xD;
          &lt;span class="kwrd"&gt;namespace&lt;/span&gt; Atrax.Library { [DataContract,&#xD;
Serializable] &lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; QueryResult&#xD;
{ &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span class="rem"&gt;/// The original&#xD;
query sent by the client.&lt;/span&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt; [DataMember] &lt;span class="kwrd"&gt;public&lt;/span&gt; Query&#xD;
Query { get; set; } &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span class="rem"&gt;///&#xD;
Status code sent back to query client's callback url.&lt;/span&gt;&lt;span class="rem"&gt;///&#xD;
&amp;lt;/summary&amp;gt;&lt;/span&gt; [DataMember] &lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; StatusCode&#xD;
{ get; set; } &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span class="rem"&gt;/// Status&#xD;
description sent back to query client's callback url.&lt;/span&gt;&lt;span class="rem"&gt;///&#xD;
&amp;lt;/summary&amp;gt;&lt;/span&gt; [DataMember] &lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; StatusDescription&#xD;
{ get; set; } &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span class="rem"&gt;/// The&#xD;
XML schema for the result XML.&lt;/span&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt; [DataMember] &lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; ResultSchema&#xD;
{ get; set; } &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span class="rem"&gt;/// The&#xD;
result produced by the query processor, usually XML.&lt;/span&gt;&lt;span class="rem"&gt;///&#xD;
&amp;lt;/summary&amp;gt;&lt;/span&gt; [DataMember] &lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; Result&#xD;
{ get; set; } } } &lt;/pre&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=22b6ed69-fe4f-4e2a-959f-95c7a0175b54"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/tsjensen?a=LBZvL"&gt;&lt;img src="http://feeds.feedburner.com/~f/tsjensen?i=LBZvL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/390180684" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,22b6ed69-fe4f-4e2a-959f-95c7a0175b54.aspx</comments>
      <category>Code</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2008/09/09/Live+Writer+Source+Code+Format+Plugin.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=d4fb8f17-34b4-496b-b6b2-104e8f1277ec</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,d4fb8f17-34b4-496b-b6b2-104e8f1277ec.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,d4fb8f17-34b4-496b-b6b2-104e8f1277ec.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d4fb8f17-34b4-496b-b6b2-104e8f1277ec</wfw:commentRss>
      
      <title>Testing Windows Live Writer with dasBlog</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,d4fb8f17-34b4-496b-b6b2-104e8f1277ec.aspx</guid>
      <link>http://feeds.feedburner.com/~r/tsjensen/~3/390180685/Testing+Windows+Live+Writer+With+DasBlog.aspx</link>
      <pubDate>Mon, 08 Sep 2008 22:05:55 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
I've run into a little snag with my blog. I installed (rather copied) the &lt;a href="http://www.codeplex.com/dasblog"&gt;latest&#xD;
release of dasblog&lt;/a&gt; to my bin (and other directories) and ended up not being able&#xD;
to edit or post new blog entries because of some installation (probably some config)&#xD;
issue with FreeTextBox. So while I figure out the problem or wait for someone else&#xD;
to solve it, I decided to try Windows Live Writer.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Here's the FreeTextBox and the text it displays now when attempting to edit or add&#xD;
a post:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img height="382" src="http://www.tsjensen.com/blog/content/binary/freetextbox.jpg" width="610" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I've tried the web.config change, including the one &lt;a href="http://www.hanselman.com/blog/UpgradingFreeTextBoxOnDasBlogWithoutRecompiling.aspx"&gt;suggested&#xD;
by Scott Hanselman&lt;/a&gt; regarding the dependent assembly as follows:&#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;font face="Courier New"&gt;&amp;lt;dependentAssembly&amp;gt;&lt;br&gt;&#xD;
    &amp;lt;assemblyIdentity name="FreeTextBox" publicKeyToken="5962a4e684a48b87"&#xD;
culture="neutral"/&amp;gt;&lt;br&gt;&#xD;
    &amp;lt;bindingRedirect oldVersion="3.0.5000.0-3.0.5000.6" newVersion="3.1.6.34851"/&amp;gt;&lt;br&gt;&#xD;
&amp;lt;/dependentAssembly&amp;gt;&lt;/font&gt;&#xD;
          &lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
Well, time to publish this to see what it looks like.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
(And second post with some edits.)&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=d4fb8f17-34b4-496b-b6b2-104e8f1277ec"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/tsjensen?a=MHh4L"&gt;&lt;img src="http://feeds.feedburner.com/~f/tsjensen?i=MHh4L" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/390180685" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,d4fb8f17-34b4-496b-b6b2-104e8f1277ec.aspx</comments>
    <feedburner:origLink>http://www.tsjensen.com/blog/2008/09/08/Testing+Windows+Live+Writer+With+DasBlog.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=2980bf7d-88eb-4c3e-b15f-8c91321416ea</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,2980bf7d-88eb-4c3e-b15f-8c91321416ea.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,2980bf7d-88eb-4c3e-b15f-8c91321416ea.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=2980bf7d-88eb-4c3e-b15f-8c91321416ea</wfw:commentRss>
      
      <title>Atrax Keyword Extraction Algorithm</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,2980bf7d-88eb-4c3e-b15f-8c91321416ea.aspx</guid>
      <link>http://feeds.feedburner.com/~r/tsjensen/~3/386046337/Atrax+Keyword+Extraction+Algorithm.aspx</link>
      <pubDate>Sun, 07 Sep 2008 20:12:27 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
Two and a half years ago I wrote an implementation in C# of an algorithm published&#xD;
in 2003 in a &lt;a href="http://www.miv.t.u-tokyo.ac.jp/papers/matsuoIJAIT04.pdf"&gt;short&#xD;
academic paper&lt;/a&gt; by &lt;a href="http://ymatsuo.com/top_eng.htm"&gt;Yutaka Matsuo&lt;/a&gt; and &lt;a href="http://www.miv.t.u-tokyo.ac.jp/ishizuka/eng.html"&gt;Mitsuru&#xD;
Ishizuka&lt;/a&gt; in the International Journal of Artificial Intelligence Tools. Of course,&#xD;
the algorithm is not a perfect implementation of the algorithm published in the&#xD;
"Keyword Extraction from a Single Document using Word Co-occurrence Statistical Information"&#xD;
paper. I made a number of decisions to make the algorithm as effective as possible&#xD;
while keeping it as fast as I could.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The code was written for Provo Labs, my employer at the time. I've recently obtained&#xD;
written permission from Provo Labs to release this code as open source under the &lt;a href="http://www.apache.org/licenses/"&gt;Apache&#xD;
2.0 license&lt;/a&gt;. You can get the code in the Atrax.Html project, a part of the entire&#xD;
Atrax project which I've just released, at &lt;a href="http://www.codeplex.com/atrax"&gt;http://www.codeplex.com/atrax&lt;/a&gt;.&#xD;
Here's the core of the code.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&#xD;
            &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;[]&#xD;
terms &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;[termsG.Count];&lt;br&gt;&#xD;
termsG.Values.CopyTo(terms, 0); &lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//gives&#xD;
terms array where last term is the MAX g in G&lt;/span&gt;&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;foreach&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; w &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;in&lt;/span&gt; terms)&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
    &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;decimal&lt;/span&gt; sumZ &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; 0;&lt;br&gt;&#xD;
    &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;for&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; i &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; 0;&#xD;
i &amp;lt; terms.Length &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; 1;&#xD;
i++) &lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//do&#xD;
calcs for all but MAX&lt;/span&gt;&lt;br&gt;&#xD;
    {&lt;br&gt;&#xD;
        &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; g &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; terms[i];&lt;br&gt;&#xD;
        &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (w&#xD;
!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; g) &lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//skip&#xD;
where on the diagonal&lt;/span&gt;&lt;br&gt;&#xD;
        {&lt;br&gt;&#xD;
            &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; nw &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; termNw[w];&lt;br&gt;&#xD;
            &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;decimal&lt;/span&gt; Pg &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; termPg[g];&lt;br&gt;&#xD;
            &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;decimal&lt;/span&gt; D &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; nw &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; Pg;&lt;br&gt;&#xD;
            &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (D&#xD;
!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; 0.0m)&lt;br&gt;&#xD;
            {&lt;br&gt;&#xD;
                &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;decimal&lt;/span&gt; Fwg &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; termFwg[w][terms[i]];&lt;br&gt;&#xD;
                &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;decimal&lt;/span&gt; T &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; Fwg &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; D;&lt;br&gt;&#xD;
                &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;decimal&lt;/span&gt; Z &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; (T &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;*&lt;/span&gt; T) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/&lt;/span&gt; D;&lt;br&gt;&#xD;
                sumZ&#xD;
+= Z;&lt;br&gt;&#xD;
            }&lt;br&gt;&#xD;
        }&lt;br&gt;&#xD;
    }&lt;br&gt;&#xD;
    termsX2[w] &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; sumZ;&lt;br&gt;&#xD;
}&lt;br&gt;&lt;br&gt;&#xD;
SortedDictionary&amp;lt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;decimal&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;&amp;gt;&#xD;
sortedX2 &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; SortedDictionary&amp;lt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;decimal&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;&amp;gt;();&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;decimal&lt;/span&gt;&amp;gt;&#xD;
pair &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;in&lt;/span&gt; termsX2)&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
    &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;decimal&lt;/span&gt; x2 &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; pair.Value;&lt;br&gt;&#xD;
    &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;while&lt;/span&gt; (sortedX2.ContainsKey(x2))&lt;br&gt;&#xD;
    {&lt;br&gt;&#xD;
        x2 &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; x2 &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; 0.00001m;&lt;br&gt;&#xD;
    }&lt;br&gt;&#xD;
    sortedX2.Add(x2, pair.Key);&lt;br&gt;&#xD;
}&lt;br&gt;&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//now&#xD;
get simple array of values as lowest to highest X2 terms&lt;/span&gt;&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;[]&#xD;
x2Terms &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;[sortedX2.Count];&lt;br&gt;&#xD;
sortedX2.Values.CopyTo(x2Terms, 0);&lt;br&gt;&lt;/span&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I have not spent much time on this algorithm in the past two years and would like&#xD;
to find others with similar interests to help me improve and perfect it. If you have&#xD;
an interest in this kind of research, please join me at the &lt;a href="http://www.codeplex.com/atrax"&gt;Atrax&#xD;
project page on Codeplex&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=2980bf7d-88eb-4c3e-b15f-8c91321416ea"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/tsjensen?a=6qu7L"&gt;&lt;img src="http://feeds.feedburner.com/~f/tsjensen?i=6qu7L" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/386046337" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,2980bf7d-88eb-4c3e-b15f-8c91321416ea.aspx</comments>
      <category>Code</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2008/09/07/Atrax+Keyword+Extraction+Algorithm.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=687ef3f0-b7b3-4a6a-8d79-8135876e29fc</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,687ef3f0-b7b3-4a6a-8d79-8135876e29fc.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,687ef3f0-b7b3-4a6a-8d79-8135876e29fc.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=687ef3f0-b7b3-4a6a-8d79-8135876e29fc</wfw:commentRss>
      
      <title>Vista Defrag Woefully Inadequate - Enter O&amp;O Defrag</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,687ef3f0-b7b3-4a6a-8d79-8135876e29fc.aspx</guid>
      <link>http://feeds.feedburner.com/~r/tsjensen/~3/375284548/Vista+Defrag+Woefully+Inadequate+Enter+OO+Defrag.aspx</link>
      <pubDate>Sat, 23 Aug 2008 20:43:01 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
Being rather new to Vista this week, I was sorely disappointed to see the severely&#xD;
dumbed down defrag utility in Vista. A pathetic effort. Really! So after a few highly&#xD;
scientific Google searches, I settled on &lt;a href="http://www.oo-software.com/home/en/products/oodefrag/"&gt;O&amp;amp;O&#xD;
Defrag&lt;/a&gt; and could not be happier.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Here's the lame, incredibly useless UI in Vista's Disk Defragmenter. Note, if&#xD;
you are going to use some other defragmenter on a schedule, which I would recommend,&#xD;
be sure to disable the regularly scheduled Vista defragmenter by unchecking the box.&#xD;
One way of getting there is to go to the Control Panel and then Performance Information&#xD;
and Tools and then Advanced Tools.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img style="WIDTH: 573px; HEIGHT: 280px" height="250" src="http://www.tsjensen.com/blog/content/binary/vistadefrag.jpg" width="547" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
And here is only part of the incredibly useful O&amp;amp;O Defrag UI, a shot taken as&#xD;
it defrags my drives:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img style="WIDTH: 623px; HEIGHT: 647px" height="609" src="http://www.tsjensen.com/blog/content/binary/oodefrag.jpg" width="583" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Of course there are other suitable defrag tools such as DiskKeeper and others. Perhaps&#xD;
Microsoft wanted the Vista tool to cater only to the basic, uninformed user. If so,&#xD;
they certainly left the market wide open to the more sophisticated tools vendors such&#xD;
as O&amp;amp;O.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=687ef3f0-b7b3-4a6a-8d79-8135876e29fc"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/tsjensen?a=XZQtqL"&gt;&lt;img src="http://feeds.feedburner.com/~f/tsjensen?i=XZQtqL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/375284548" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,687ef3f0-b7b3-4a6a-8d79-8135876e29fc.aspx</comments>
      <category>Commentary</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2008/08/23/Vista+Defrag+Woefully+Inadequate+Enter+OO+Defrag.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.tsjensen.com/blog/Trackback.aspx?guid=d0728031-c78f-4133-91a0-8944390eac16</trackback:ping>
      <pingback:server>http://www.tsjensen.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.tsjensen.com/blog/PermaLink,guid,d0728031-c78f-4133-91a0-8944390eac16.aspx</pingback:target>
      <dc:creator>Tyler Jensen</dc:creator>
      <wfw:comment>http://www.tsjensen.com/blog/CommentView,guid,d0728031-c78f-4133-91a0-8944390eac16.aspx</wfw:comment>
      <wfw:commentRss>http://www.tsjensen.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d0728031-c78f-4133-91a0-8944390eac16</wfw:commentRss>
      
      <title>From XP Pro to Vista Ultimate x64</title>
      <guid isPermaLink="false">http://www.tsjensen.com/blog/PermaLink,guid,d0728031-c78f-4133-91a0-8944390eac16.aspx</guid>
      <link>http://feeds.feedburner.com/~r/tsjensen/~3/375284549/From+XP+Pro+To+Vista+Ultimate+X64.aspx</link>
      <pubDate>Thu, 21 Aug 2008 01:54:01 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
I finally took the plunge. Now I get to use 4GB out of 4GB except that the bare minimum&#xD;
I seem to be able to get Vista x64 down to is a 1.2GB footprint. And that's after&#xD;
hours and hours of experimentation and disabling some visual enhancements, though&#xD;
I feel no loss there and am experiencing a significantly reduced sense of loss.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Now I'm happy to be able to test on x64 virtual images using VMWare's Workstation,&#xD;
I'm afraid I may need to buy four 2GB sticks of RAM now. Despite the fact that&#xD;
the additional memory is available now, the larger footprint nearly wipes out the&#xD;
gain.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.netbrick.net/blog/content/binary/taskm.jpg" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
And that's without running any significant applications, except IE, which is quite&#xD;
a memory hog. I guess the old 640K upper limit days are over.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Yes, RAM is cheap. A quick check on Newegg.com and I found 8GB (4 x 2GB DDR2 800)&#xD;
for $174. I can't even buy three tanks of gas for my SUV for that.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.tsjensen.com/blog/aggbug.ashx?id=d0728031-c78f-4133-91a0-8944390eac16"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/tsjensen?a=avHg3L"&gt;&lt;img src="http://feeds.feedburner.com/~f/tsjensen?i=avHg3L" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tsjensen/~4/375284549" height="1" width="1"/&gt;</description>
      <comments>http://www.tsjensen.com/blog/CommentView,guid,d0728031-c78f-4133-91a0-8944390eac16.aspx</comments>
      <category>Commentary</category>
    <feedburner:origLink>http://www.tsjensen.com/blog/2008/08/21/From+XP+Pro+To+Vista+Ultimate+X64.aspx</feedburner:origLink></item>
  </channel>
</rss>
