<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" 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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>System.Reflection.Emit</title>
    <description>Technical Banterings of Jon Davis (A Web &amp; Software Developer)</description>
    <link>http://www.jondavis.net/techblog/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.5.0</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://www.jondavis.net/techblog/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd?format=rss</blogChannel:blink>
    <dc:creator>Jon Davis &lt;jon@jondavis.net&gt;</dc:creator>
    <dc:title>System.Reflection.Emit</dc:title>
    <geo:lat>33.583950</geo:lat>
    <geo:long>-111.876100</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/stimpy77" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Dell: Wow. Just Wow. I Really Liked You. This Is Saddening.</title>
      <description>&lt;p&gt;I'm trying to figure out if I should be extremely mad. But I'm really very sad, and amazed. And annoyed.&lt;/p&gt;  &lt;p&gt;I always admired Dell, especially for some of their higher-end laptops and some of the innovations they’ve made. And I always figured that made-to-order meant made-upon-order, moderately efficiently, considering how long they’ve been in business and how successful they’ve been as the #1 PC vendor in the world. McDonald’s wouldn’t survive, after all, if their food took an hour to prepare.&lt;/p&gt;  &lt;p&gt;I placed an initial order way back in early September, taking advantage of my Dell Financing available credit, but splitting my payment between Dell Financial and a credit card. The order was submitted online and received, and all was well, but that night/morning I received an e-mail saying that the order had been &amp;quot;rejected&amp;quot;. Excuse me? I wasn't sure what to think. I called them up to find out what was going on. Half an hour later, after getting forwarded over and over again, I was finally told that I placed my order with one cent ($0.01) more than my available credit with Dell Financial. Huh?!! The order form figured that bit out. If that's what happened, it wasn't my doing, it was the order form. Anyway, I cancelled that order, after repeating my order number and security information at least five more times.&lt;/p&gt;  &lt;p&gt;A week or two later, in the latter half of September, I placed another order, for the same computer (the Studio XPS 16 with the Intel i7), and this time while splitting payments I made very sure I was very careful to round down the Dell Financing part by $10 (for example $1259 would become $1250), so that there would be no &amp;quot;one penny&amp;quot; too much being overcharged like last time, with the rest on my credit card. I submitted that order, it was received and accepted. That night I got another rejection e-mail, and a day or two after that I received a phone call from a Dell customer service rep saying that my order had been declined because too much was charged on my Dell Financing account again. I asked how much had been charged on it. He quoted a number that was waaay over what I had manually entered on the order form, and I knew it couldn't have been a mistake on my part because it wasn't rounded down, and I triple checked while producing that order that it was rounded down.&lt;/p&gt;  &lt;p&gt;I stayed on the phone with that customer service rep to be sure that this order was fixed. But they had to produce another order (cancelling the original order) and make another charge to another credit card because they couldn't make an instant release on the card they already charged. I registered a complaint with him and by the time the call was finished I'd been talking with him for a good 45 minutes or so. Then I went online and saw that the new order was not accessible to my profile's order history. I sent an e-mail to that same CS rep and he assisted me on how to merge that order with my online profile. Kudos to that fella, Rajesh_R-AT-Dell.com.&lt;/p&gt;  &lt;p&gt;So now that my order was associated with my online profile--it was now the end of September--I could not get a delivery date, as it was listed as N/A. I e-mailed Rajesh R again about that, and received no reply, but then the next time I checked the delivery estimate was showing up as end of October, a FULL FRIGGIN MONTH out, which I thought was absolutely ridiculous, but survivable. I am, fortunately, getting by with my existing non-Dell gear, I was just looking forward to using the newer hardware which I had already &amp;quot;paid&amp;quot; for.&lt;/p&gt;  &lt;p&gt;Well, that estimated delivery date came and went. When I looked online shortly before that date, I was shocked to see that it had been bumped out to around November 7--another week and a half out!! What gives?! &lt;/p&gt;  &lt;p&gt;So I waited on that. If you look at the calendar, it's November 9. And what does my order status say?&lt;/p&gt;  &lt;p&gt;Oh, apparently I'm only just getting started!! &lt;strong&gt;My order was CANCELLED AND REMADE (&amp;quot;Changed&amp;quot;)&lt;/strong&gt;, without my permission or involvement, with a new order date (not mine!) of 10/29/2009 and a new estimated delivery date of December 2, 2009. The order status is also no longer &amp;quot;In Production&amp;quot;, it has been rolled back to &amp;quot;Order Processing&amp;quot; which means it's waiting for payment, and it's been there for a week. (Guess who's not placing any bets I'll get my September order by Christmas?!) No explanation. I think I could maintain some sanity if Dell would just say that critical parts were backordered. But they don't show me anything like that. No e-mails, either. Just *shrug* &amp;quot;Changed&amp;quot;. As if they'll ship it when they feel like it.&lt;/p&gt;  &lt;p&gt;Had this been an oddball personal experience, I would have a bit of hope that this will &amp;quot;just work itself out&amp;quot;, but after scouring these forums both here and elsewhere for similar testimonies, I'm realizing that this seems to be standard practice with Dell.&lt;/p&gt;  &lt;p&gt;The problem is, not only is this bad customer service, it's very close to illegal. It is certainly unlawful to collect money and not deliver on goods purchased, but it might be unlawful, if perhaps in civil court, to collect money without producing any clear expectations as to a deliverable timeline and a reasonable effort to meet that timeline or provide a reasonable explanation. When I purchase from Amazon I receive delivery within a week. When I purchase from strangers on eBay, I normally receive delivery within a couple weeks. In all cases, a rough estimate with reasonable accuracy is provided. However, in Dell's case, it seems clear that they are intentionally stalling, I suspect perhaps their Dell Financing is under-funded, I don't know, and I don't care, but for Dell to make copping out on an order this frequently is clearly unacceptable and should not be tolerated by its customer base, nor for that matter by Dell management.&lt;/p&gt;  &lt;p&gt;It's for this reason that I feel that it may be responsible for fellow customers to see about instigating change--starting with online pressuring with the likes of &lt;a href="http://ihatedell.org"&gt;http://ihatedell.org&lt;/a&gt; and perhaps going so far as a class action suit. I really don't know what to think. I just think that all of this is startlingly evil and wrong.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GpNwem86G0EfBAZpf87-pqTc6MM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GpNwem86G0EfBAZpf87-pqTc6MM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GpNwem86G0EfBAZpf87-pqTc6MM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GpNwem86G0EfBAZpf87-pqTc6MM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/j0KygeOHlEU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/j0KygeOHlEU/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/11/09/Dell-Wow-Just-Wow-I-Really-Liked-You-This-Is-Saddening.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=4e6b606a-e97d-47be-b133-c57e703860f9</guid>
      <pubDate>Mon, 09 Nov 2009 03:42:45 -0700</pubDate>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=4e6b606a-e97d-47be-b133-c57e703860f9</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=4e6b606a-e97d-47be-b133-c57e703860f9</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/11/09/Dell-Wow-Just-Wow-I-Really-Liked-You-This-Is-Saddening.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=4e6b606a-e97d-47be-b133-c57e703860f9</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=4e6b606a-e97d-47be-b133-c57e703860f9</feedburner:origLink></item>
    <item>
      <title>Media Center Uses Flash For Some Internet TV Video Playback</title>
      <description>&lt;p&gt;With Windows 7 installed, the Media Center desktop showed “Star Trek” (the original series) as something I could watch. I clicked on it (as something to laugh at), Media Center came up, it asked me to agree to the terms of Internet TV, and then it showed me three seasons of Star Trek to choose from. I selected an episode, and it showed me another dialog, asking me to agree to the terms of installing the Internet TV Update for Adobe Flash! So apparently the show runs on Flash video.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.jondavis.net/techblog/images/MediaCenterUsesFlashForSomeInternetTVVid_10E91/image.png" width="715" height="432" /&gt; &lt;/p&gt;  &lt;p&gt;Why is this a big deal? Because Microsoft already has a lot already invested in video streaming and their own technologies compete with Flash. Why would they use Flash on their own Media Center? Was it because CBS refused to reencode their videos to WMV? Or does this mean that Microsoft has already caved?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Xk8Hpoz3s8VkeWw7fVh7TAe23Sw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xk8Hpoz3s8VkeWw7fVh7TAe23Sw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Xk8Hpoz3s8VkeWw7fVh7TAe23Sw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xk8Hpoz3s8VkeWw7fVh7TAe23Sw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/eWlW9lwFhug" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/eWlW9lwFhug/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/10/24/Media-Center-Uses-Flash-For-Some-Internet-TV-Video-Playback.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=83fd38e8-d4f4-4a6f-89a2-bc22fe4898e0</guid>
      <pubDate>Sat, 24 Oct 2009 19:14:56 -0700</pubDate>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=83fd38e8-d4f4-4a6f-89a2-bc22fe4898e0</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=83fd38e8-d4f4-4a6f-89a2-bc22fe4898e0</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/10/24/Media-Center-Uses-Flash-For-Some-Internet-TV-Video-Playback.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=83fd38e8-d4f4-4a6f-89a2-bc22fe4898e0</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=83fd38e8-d4f4-4a6f-89a2-bc22fe4898e0</feedburner:origLink></item>
    <item>
      <title>Visual Studio’s and .NET’s Most Overlooked Want Items</title>
      <description>&lt;p&gt;There are some features gone missing in Visual Studio and .NET whose absence frankly tick me off at times and make me go looking around for alternative IDEs and toolsets or plan on building my own tooling. I’ve done an initial evaluation of VS 2010 Beta 2 for each of these and confirmed that the issues remain. I am going to be appending this with occasional tweaks as time goes on, so feel free to post comments and I’ll add them to my “prayer list”. :)&lt;/p&gt;  &lt;p&gt;Keep in mind, this is not a “most wanted” list, but a “most overlooked” list. That is, I think the demand is a lot greater than people seem to appreciate, perhaps because they’ve gone on all these years living with the way things are and being numb.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=340268" target="_blank"&gt;Javascript brace matching (FB 340268)&lt;/a&gt;&lt;/strong&gt; – Anyone who spends more than a few occasional hours writing Javascript within Visual Studio has no doubt been frustrated by the fact that, despite IntelliSense’s best (yet usually broken) effort to auto-indent on line breaks—a feature, by the way, I’m constantly fighting with when writing JSON and the bodies of closures—it completely fails when it comes to transitioning from C# and we’ve been spoiled with simple brace matching. The fact is, there is absolutely no brace matching in the Javascript editor.       &lt;br /&gt;&amp;#160; &lt;br /&gt;By “brace matching” I’m referring to the feature in C#’s editor where typing a “}” will highlight both the “{” and the “}” momentarily to help you keep track of your context so as to help you ensure all of your braces have been properly closed. Unlike typical C# code, Javascript code with all its deep-nested closures can get pretty hairy when it comes to nested brace blocks. Put the two problems together—a broken auto-indent feature and no brace matching, and the best you can do sometimes is fire up the WHOLE FREAKING APPLICATION being developed, navigate to the page or context you’re working on, and see if the browser’s Javascript parser pukes on entry.       &lt;br /&gt;&amp;#160; &lt;br /&gt;Seriously, Microsoft, where’s the Javascript love? Your half-hearted IntelliSense support for jQuery was nice (too bad there’s STILL no auto-completion in VS 2010 for summary documentation, nor IntelliSense while writing the XML documentation or references nor even color coding / syntax highlighting of XML documentation) but it’s not even meeting us at halfway to our needs for an IDE that identifies Javascript as one of the most critical programming languages for &lt;em&gt;all&lt;/em&gt; web development.       &lt;br /&gt;&amp;#160; &lt;br /&gt;We want you, Microsoft, to treat Javascript as a first-class language, not as an afterthought, because Javascript is the web’s programming language as much as HTML is. If you have to abandon Active Scripting as your IntelliSense provider and rewrite from scratch using JScript.NET or or &lt;a href="http://jint.codeplex.com/" target="_blank"&gt;Jint&lt;/a&gt; or somesuch in order to give Javascript IntelliSense greater functionality, so be it, do what it takes, but this is clearly quite broken as it is.       &lt;br /&gt;&amp;#160; &lt;br /&gt;However, brace matching is hardly treating Javascript as a first class language. It’s a simple feature, and we need it.       &lt;br /&gt;&amp;#160; &lt;br /&gt;I haven’t yet checked to see if Aptana Studio—for which I do personally have a professional license I don’t use—does any better in this department, but I’m getting close to desperate and should follow up on that. Unfortunately, then the problem becomes integration with a .NET-oriented codebase. Time to switch away from .NET just for that? No, but the question does come up in my mind. Seriously.       &lt;br /&gt;&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Configureless Entities&lt;/strong&gt; – I’ll let &lt;a href="http://gemli.codeplex.com/" target="_blank"&gt;my Gemli.Data subproject&lt;/a&gt; do the talking on this one. I’ve already done all my whining and complaining by way of starting to take some action so I’d rather not repeat myself yet again. I’ve seen the blog articles highlighting the new POCO support for LINQ-to-Entities 4.0 and it looks as verbose and awkward as Fluent NHibernate.       &lt;br /&gt;&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Configureless Routing&lt;/strong&gt; – I haven’t said much about this, but another sub-project I’ve added to Gemli’s road map is fixing the ASP.NET MVC routing engine by replacing it altogether with one that actually works. I understand where ASP.NET MVC’s URL Routing engine came from. It came from copying Ruby on Rails. And everyone loves Ruby on Rails, so it must be good, right? Ruby on Rails is one of the big sources for pushing the whole “Convention Over Configuration”, so if we just copy everything that makes RoR tick we’ll have our CoC right? Am I the only one who is puzzled by the nonsense of the realities of the routing engine NOT conforming to CoC? In order to have a URL get routed to a controller’s action and parameters, you HAVE TO open up global.asax.cs and drum up a mapping—yes, a MAPPING!—of that URL to your controller’s method. Visual Studio starts you off with a default one with a parameter mapping of “id” to get you started. I honestly don’t think I’ve ever used that mapping. There is regex-based wildcarding and pattern-matching support, which is I guess where Microsoft gets off saying, “see? it’s config-free!”, but you still have to declare your mappings.       &lt;br /&gt;&amp;#160; &lt;br /&gt;It gets worse; not only do you have to add your route mappings manually, for me, when I declare them, half the time they simply &lt;em&gt;don’t work.&lt;/em&gt; Just yesterday I came across a declared route where MyMethod(string myParam) was explicitly routed as such, yet when it executed it ended up going to MyOtherMethod() by way of the “wonderful” wildcarding feature. I don’t recall how I fixed this, but there’s another broken piece in this routing mess: the order in which you declare your mappings matters a great deal, so you *must* move the wildcarded declarations down to the bottom of your declarations.       &lt;br /&gt;&amp;#160; &lt;br /&gt;We shouldn’t even be talking about manual mappings. MVC routing should automatically map to controllers, their actions, and their parameters, using reflection, in the same way as old-school web paradigms classically mapped the file system and file names directly to slash-delimited URL naming structure.       &lt;br /&gt;&amp;#160; &lt;br /&gt;The Gemli sub-project will, on the application’s initialization, scan for all classes that inherit controllers, assume that all their public methods are action names, and regex-pattern match all primitive types to parsable strings. Any parameter on a method that has a complex type or struct will be disqualified as an MVC action at least as far as this auto-mapping is concerned. Route customizations via C# attributes as well as other means will also be added. Honestly, this sort of routing engine is not very hard to write. I’ll get around to working on it within the next week or two or three, and expect to have it out there in working order in a week or two after I get started. (Keep in mind I only do this stuff on weekends and occasional evenings.)       &lt;br /&gt;&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Deploy-as-Windows-App Web Deployment&lt;/strong&gt; – Long, long ago, in a galaxy far, far away, there was a web server created called Cassini that allowed you to execute ASP.NET without running IIS. A few people adopted and even extended Cassini, but it was always Cassini. Cassini was then bundled in with Visual Studio itself for Visual Studio localhost debugging, but deployment of web applications continued to target IIS, and thus ends the story of Cassini.       &lt;br /&gt;&amp;#160;&amp;#160; &lt;br /&gt;Remember ClickOnce? That technology that Firefox users hated until this week because Microsoft snuck its ClickOnce support add-in onto Firefox without users’ permission, until this week when Mozilla banned it from the browser? Yeah, .. that ClickOnce technology was actually a brilliant idea, but it didn’t work too well because users had too little control. But what about the inverse? ClickOnce allowed for installing desktop applications as Windows Forms and WPF applications straight from the web. But what about a technology that auto-packages a locally-running (for localhost-only access) web app that can be shrink-wrapped distributed, executed as an EXE, and accessible from the Start menu?       &lt;br /&gt;&amp;#160; &lt;br /&gt;It’s really quite silly that we can’t create web applications and deploy them as standalone EXEs that run in a web browser. I mean, we can. But we have to track down that old Cassini codebase or find one of the third party distributions of it such as &lt;a href="http://ultidev.com/products/Cassini/" target="_blank"&gt;UltiDev&lt;/a&gt;. Then you still have a bunch of moving parts that you have to manually figure out how to package and distribute your solution in a self-starting thing. IIS 7.5 supports standalone instances but that requires Windows 7 and feature activation .. and, well, IIS.       &lt;br /&gt;&amp;#160; &lt;br /&gt;Requiring IIS or even auto-rigging a standalone web server to run a simple web app seems like a configuration burden to me. The new &lt;a href="http://www.microsoft.com/web/" target="_blank"&gt;WebPI&lt;/a&gt; paradigm is nice but it’s really more for web dev experts/admins and developers and for Internet web app discovery, and not useful for software vendors writing software for people who just want to use a simple application at home with or without Internet access and without any knowledge of web dev. Using ASP.NET as a Windows desktop app view engine would be huge, I think, because it would give software vendors a transition path from a preexisting Internet web site already built to a Windows desktop application. Not to mention a transition path for individual web developers who would like to know more about desktop solutions.&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; &lt;br /&gt;I don’t know, maybe the feature isn’t hotly requested because there isn’t much demand, but I think there’s little demand because there’s been too little innovation in this area on Microsoft’s side; the practice has been used for over a decade but it’s almost always people outside of Redmond doing it. Do I have an immediate need for this? Admittedly, no, I don’t; however, the more I think about it the more my mind wanders into creative ideas of what ASP.NET MVC could introduce to the desktop publishing crowd (the original desktop weblog engine, &lt;a href="http://radio.userland.com/" target="_blank"&gt;Userland Radio&lt;/a&gt;, from which blogging was invented, used a self-running web hosting engine to run), the PowerShell crowd (yeah hey &lt;a href="http://www.powershelltoys.com/default.aspx" target="_blank"&gt;look at this&lt;/a&gt;), social networking (did anyone else notice that &lt;a href="http://www.opera.com/" target="_blank"&gt;Opera 10’s Unite&lt;/a&gt; is now proxying media and file sharing from the Opera Windows app itself using Internet-accessible, sharable URLs?), the reporting and finance crowds (remember Microsoft Money? it was built on DHTML), and more. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;This is a small list. There was at least one other thing I wanted to mention in a blog like this but I forgot what it was. As I said, I’m going to grow my list over time as I continue to recall the things I always wanted but never bothered to mention.&lt;/p&gt;  &lt;p&gt;&lt;iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&amp;url=http://www.jondavis.net/techblog/post/2009/10/24/Visual-Studioe28099s-and-NETe28099s-Most-Overlooked-Want-Items.aspx&amp;amp;title=Visual Studio’s and .NET’s Most Overlooked Want Items" height="25" width="155" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zNLbdrJ2frPNBVPXjESR0OoOVIE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zNLbdrJ2frPNBVPXjESR0OoOVIE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zNLbdrJ2frPNBVPXjESR0OoOVIE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zNLbdrJ2frPNBVPXjESR0OoOVIE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/O1p6Et739sY" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/O1p6Et739sY/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/10/24/Visual-Studioe28099s-and-NETe28099s-Most-Overlooked-Want-Items.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=7a3fa534-5844-4da8-b135-bb64ec700f86</guid>
      <pubDate>Sat, 24 Oct 2009 17:19:17 -0700</pubDate>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=7a3fa534-5844-4da8-b135-bb64ec700f86</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=7a3fa534-5844-4da8-b135-bb64ec700f86</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/10/24/Visual-Studioe28099s-and-NETe28099s-Most-Overlooked-Want-Items.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=7a3fa534-5844-4da8-b135-bb64ec700f86</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=7a3fa534-5844-4da8-b135-bb64ec700f86</feedburner:origLink></item>
    <item>
      <title>Why Am I Scared Of C# 4.0?</title>
      <description>&lt;p&gt;Q. What do Microsoft Visual Studio 2010 and beautiful young women have in common (as far as I’m concerned)?   &lt;br /&gt;A. They both make me so nervous I can’t relate with them hardly at all.&lt;/p&gt;  &lt;p&gt;Microsoft is doing a good thing, and I should be excited to be tinkering with the new Visual Studio 2010 Beta 2 that just came out this week. Fact is, I haven’t prioritized time enough to do much of anything of any beta of VS 2010 yet. Limited energy levels caused by sloppy living habits and everyday work stress might have a bit to do with it, but I also must admit that, while I greatly look forward to the future, I’m simply not prepared to make it the present. I, like so many people in this field, am limited significantly by the constraints of my employer’s best interests and the limited availability of my time (or in my case the juggling of free time prioritization between &lt;a href="http://gemli.codeplex.com/" target="_blank"&gt;Gemli&lt;/a&gt;, &lt;a href="http://stargate.mgm.com/" target="_blank"&gt;Stargate Universe&lt;/a&gt;, &lt;a href="http://www.stumbleupon.com/" target="_blank"&gt;StumbleUpon&lt;/a&gt; surfing, and other geeky activities).&lt;/p&gt;  &lt;p&gt;With respect to Gemli, much of what that project (including tons of wishlist scoped details) was about is based on the limitations of current RTM’d offerings from Microsoft. Visual Studio 2010 and .NET 4.0 address a lot of things I wanted, making parts of future-scoped bits of Gemli more or less moot. On the other hand, the parts that .NET 4.0 doesn’t address will likely become greatly enhanced by some of the new features of .NET 4.0, things like the dynamic object.&lt;/p&gt;  &lt;p&gt;And in any case, the objectives of Gemli or any other open source project for that matter is to have the tooling needed to produce and maintain software in an efficient and stable manner, and so there’s nothing wrong with continuous improvement and evolution of the tools we use. I should, then, be excited about what Visual Studio 2010 and .NET 4.0 bring to do the table in the contexts of everything I’m doing, and not be holding back.&lt;/p&gt;  &lt;p&gt;Yet, I do hold back. It could be fear, but it’s not that simple. &lt;/p&gt;  &lt;p&gt;Perhaps the biggest problem that keeps me from tinkering is that one cannot tinker with “legacy” (RTM-based) projects in the new tooling environments without permanently upgrading the projects/solutions. It would be really neat if I could check out Gemli from TFS into VS 2010 and dabble in C# 4.0 features using #ifdef-like directives to isolate “legacy” (C# 3.0) and “modern” (C# 4.0) features and code sets. In this way, producing a .NET 3.5 flavor and a separate .NET 4.0 flavor of the framework would be as easy as recompiling with the selected solution configuration. And indeed I could do that, if I want to switch to VS 2010. But I can’t do that given that it’s an open source solution that I want other people to open up in a current RTM version of Visual Studio (2008), nor do I want to cut off that version of Visual Studio the moment VS 2010 is released.&lt;/p&gt;  &lt;p&gt;But since VS 2010 cannot open a VS 2008 solution without upgrading it – or at least I assume it can’t, such was the behavior of VS 2005-&amp;gt;VS 2008 – the benefits of VS 2010 / .NET 4.0 tooling are limited for the most part to greenfield projects and self-education of future technology. Neither of these are particularly practical in the absence of an employer who is willing and indeed desirous to stay on the cutting edge of a future-scoped product/project release. And believe me, this is not a complaint of my current employer. Few employers want to take such risks; they exist, but unless you’re talking about an innovative startup company, they’re really quite rare.&lt;/p&gt;  &lt;p&gt;On the other hand, Visual Studio 2010 Beta 2 comes with a go-live license. If that’s not a sign that the core functionality of the toolsets is stable, I don’t know what a better sign would look like. Technically, anyone can start on Visual Studio 2010 Beta 2 projects with the intent to deploy at any time, if indeed they want to (it is technically still a beta), and if they’re looking at a long-term development process, RTM of .NET 4 / VS 2010 will come before they release. Otherwise, they can release anyway.&lt;/p&gt;  &lt;p&gt;So really, making the switch right now, once and for all, might even make sense. The only catch or down side is the abandonment of last year’s tech. Such would be the downfall for an open source project. But this doesn’t have to be the case for everything I’m working on; if there’s no intent for the project to be shared with unknown outsiders, making the switch might as well be considered safe, even. Would you be able to place that bet? If so, how do you categorize yourself and where you work?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sdNG_i-w49zVTHogBLrDs6aWHX4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sdNG_i-w49zVTHogBLrDs6aWHX4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sdNG_i-w49zVTHogBLrDs6aWHX4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sdNG_i-w49zVTHogBLrDs6aWHX4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/9zsi0R92cIw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/9zsi0R92cIw/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/10/21/Why-Am-I-Scared-Of-C-40.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=4e2a001c-fe26-4cf7-a2e7-b5eadf12a9eb</guid>
      <pubDate>Wed, 21 Oct 2009 23:21:12 -0700</pubDate>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=4e2a001c-fe26-4cf7-a2e7-b5eadf12a9eb</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=4e2a001c-fe26-4cf7-a2e7-b5eadf12a9eb</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/10/21/Why-Am-I-Scared-Of-C-40.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=4e2a001c-fe26-4cf7-a2e7-b5eadf12a9eb</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=4e2a001c-fe26-4cf7-a2e7-b5eadf12a9eb</feedburner:origLink></item>
    <item>
      <title>Is It An Entity, Or Is It A Data Model?</title>
      <description>&lt;p&gt;One of the big dilemmas I came across before making &lt;a href="http://www.gemli-project.org/" target="_blank"&gt;Gemli&lt;/a&gt; a publicly accessible resource (open source project) was what to call the objects being loaded and saved. I’d heard “entities” and I’d heard “data models”, and I didn’t know the difference.&lt;/p&gt;  &lt;p&gt;Truth be told, I’m still not entirely sure I know the difference. But after Wikipedia searches and other small research I came to the conclusion that:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;An “Entity” is a business object that is closer to being a domain object. &lt;/li&gt;    &lt;li&gt;A “Data Model” is more of a description of something as it relates to data; it is closer to a database record, including its schema. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This distinction was important to me because Gemli is built to support POCO with minimal code, but it also needs to work with the data at a database integration level, so I needed to know what to call the two kinds of objects (the POCO object and the object that actually represents what will be loaded to/from the database). Initially, I called the objects that represented the database record “DataEntity”, and then its property that spit back out the POCO object was called the “InstanceObject” or something like that. Really weird. Bleaah.&lt;/p&gt;  &lt;p&gt;Anyway, now any POCO object that is suitable for being wrapped and serialized to the database is called in Gemli an “Entity”. Once wrapped into database-translatable semantics, it is called a “Data Model”.&lt;/p&gt;  &lt;p&gt;This is why some generic interfaces in Gemli take a TEntity and some take a TModel. They are not named differently because they are inconsistent, they are named differently because a different kind of type is expected. If you pass in a TEntity, you’re probably dealing with a generic interface that will spit that TEntity back out in its original form. If you pass in a TModel, you’re probably dealing with a query object or a data provider that can only work with data models using Gemli’s data modeling semantics.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:450942be-a1b0-494e-bddb-b0f8a5513999" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;var Bob = new Person("Bob Smith"); // Bob is an Entity. Person is any ol' POCO class.
var BobRecord = new DataModel&amp;lt;Person&amp;gt;(Bob); // BobRecord is a data model.
BobRecord.Save(); // Bob is a new customer/employee/thingamajig.

var SueRecord = DataModel&amp;lt;Person&amp;gt;.NewQuery()
    .WhereProperty["FirstName"].IsEqualTo("Sue")
    .SelectFirst(); // Sue has a record in the database because she is an
                    // existing employee (and yes lambdas will come to 
                    // Gemli, sheesh!)
Person Sue = SueRecord.Entity; // Sue is a person, too!!&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Not sure if this discussion is valuable to anyone, but that’s Gemli’s story on the word choices.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PPFPahEW_2JJiRhS21y5RCa3dzw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PPFPahEW_2JJiRhS21y5RCa3dzw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PPFPahEW_2JJiRhS21y5RCa3dzw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PPFPahEW_2JJiRhS21y5RCa3dzw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/zslIzYyvdvI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/zslIzYyvdvI/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/10/13/Is-It-An-Entity-Or-Is-It-A-Data-Model.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=cc893fda-4713-4836-adbf-ab9f51d33deb</guid>
      <pubDate>Tue, 13 Oct 2009 00:16:13 -0700</pubDate>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=cc893fda-4713-4836-adbf-ab9f51d33deb</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=cc893fda-4713-4836-adbf-ab9f51d33deb</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/10/13/Is-It-An-Entity-Or-Is-It-A-Data-Model.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=cc893fda-4713-4836-adbf-ab9f51d33deb</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=cc893fda-4713-4836-adbf-ab9f51d33deb</feedburner:origLink></item>
    <item>
      <title>Gemli.Data v0.3.0 Released</title>
      <description>&lt;p&gt;
I reached a milestone this late night with &lt;a href="http://www.gemli-project.org/" target="_blank"&gt;The Gemli Project&lt;/a&gt; and decided to go ahead and &lt;a href="http://gemli.codeplex.com/" target="_blank"&gt;release&lt;/a&gt; it. This release follows an earlier blog post describing some syntactical sugar that was added along with pagination and count support, here:
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;a href="http://www.jondavis.net/techblog/post/2009/10/05/GemliData-Pagination-and-Counts.aspx" title="http://www.jondavis.net/techblog/post/2009/10/05/GemliData-Pagination-and-Counts.aspx"&gt;http://www.jondavis.net/techblog/post/2009/10/05/GemliData-Pagination-and-Counts.aspx&lt;/a&gt;
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Remember those tests I kept noting that I still need to add to test the deep loading and deep saving functionality? No? Well I remember them. I kept procrastinating them. And as it turned out, I&amp;rsquo;ve discovered that a lesson has been taught to me several times in the past, and again now while trying to implement a few basic tests, a lesson I never realized was being taught to me until finally just this late night. The lesson goes something like this:
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;strong&gt;If in your cocky self-confidence you procrastinate the tests of a complex system because it is complex and because you are confident, you are guaranteed to watch them fail when you finally add them.&lt;/strong&gt;
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Mind you, the &amp;ldquo;system&amp;rdquo; in context is not terribly complex, but I&amp;rsquo;ll confess there was tonight a rather ugly snippet of code to wade through, particularly while Jay Leno or some other show was playing in the background to keep me distracted. On that latter note, it wasn&amp;rsquo;t until I switched to ambient music that I was finally able to fix a bug that I&amp;rsquo;d spent hours staring at.
&lt;/p&gt;
&lt;p&gt;
This milestone release represents 130 total unit tests since the lifetime of the project (about 10-20 or so new tests, not sure exactly how many), not nearly enough but enough to feel a lot better about what Gemli is shaping in itself. I still yet need to add a lot more tests, but what these tests exposed was a slew of buggy relationship inferences that needed to be taken care of. I felt the urgency to release now rather than continue to add tests first because the previous release was just not suitably functional on the relationships side.
&lt;/p&gt;
&lt;p&gt;
&lt;iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&amp;url=http://www.jondavis.net/techblog/post/2009/10/12/GemliData-v030-Released.aspx&amp;amp;title=Gemli.Data v0.3.0 Released" height="25" width="155" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt; &lt;div class="kick"&gt;&lt;a target="_blank" href="http://www.dotnetkicks.com/kick/?url=http://www.jondavis.net/techblog/post/2009/10/12/GemliData-v030-Released.aspx&amp;amp;title=Gemli.Data v0.3.0 Released"&gt;
                    &lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.jondavis.net/techblog/post/2009/10/12/GemliData-v030-Released.aspx&amp;fgcolor=ccc&amp;bgcolor=143D55&amp;cfgcolor=ccc&amp;cbgcolor=D25E26" border="0" alt="kick it on DotNetKicks.com" /&gt;
                  &lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/73RkiUgttYlH-zx2C_6-KTOWaQ8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/73RkiUgttYlH-zx2C_6-KTOWaQ8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/73RkiUgttYlH-zx2C_6-KTOWaQ8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/73RkiUgttYlH-zx2C_6-KTOWaQ8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/y2H9jsrXbPM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/y2H9jsrXbPM/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/10/12/GemliData-v030-Released.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=e30f573c-c3da-4611-98af-0d9470d6af87</guid>
      <pubDate>Mon, 12 Oct 2009 03:57:00 -0700</pubDate>
      <category>C#</category>
      <category>Cool Tools</category>
      <category>Open Source</category>
      <category>Pet Projects</category>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=e30f573c-c3da-4611-98af-0d9470d6af87</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=e30f573c-c3da-4611-98af-0d9470d6af87</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/10/12/GemliData-v030-Released.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=e30f573c-c3da-4611-98af-0d9470d6af87</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=e30f573c-c3da-4611-98af-0d9470d6af87</feedburner:origLink></item>
    <item>
      <title>The Perfect Photos To Illustrate The Sadly Typical Software Development Process</title>
      <description>&lt;p&gt;&lt;a href="http://thereifixedit.com/" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/techblog/images/ThePerfectPhotosToIllustrateTheSadlyTypi_13FA7/image.png" width="503" height="123" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a title="http://thereifixedit.com/" href="http://thereifixedit.com/"&gt;http://thereifixedit.com/&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I just wanted to post a quickie post here to link to a site that, while it's a great and funny site in itself, I was actually very surprised by how perfectly every single photo &lt;a href="http://thereifixedit.com/" target="_blank"&gt;over there&lt;/a&gt; illustrates some kind of software system I've touched, whether recently or long ago. &lt;/p&gt;  &lt;p&gt;For example, &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/techblog/images/ThePerfectPhotosToIllustrateTheSadlyTypi_13FA7/image_3.png" width="504" height="379" /&gt; &lt;/p&gt;  &lt;p&gt;This one reminds me of the countless number of memory leaks we have to put up with when garbage collectors fail or are absent. &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/techblog/images/ThePerfectPhotosToIllustrateTheSadlyTypi_13FA7/image_4.png" width="504" height="379" /&gt; &lt;/p&gt;  &lt;p&gt;And this one reminds me of ol’ Windows ME, racing stripe and all. &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://thereifixedit.com/2009/08/26/epic-kludge-photo-more-bathroom-shenanigans/" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/techblog/images/ThePerfectPhotosToIllustrateTheSadlyTypi_13FA7/image_5.png" width="504" height="379" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;The ugly do-it-all “make this site your home page” portal web sites that cluttered the web just three years ago, Yahoo! being among them. &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://thereifixedit.com/2009/10/08/hair-tie-zip-tie-same-thing/"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/techblog/images/ThePerfectPhotosToIllustrateTheSadlyTypi_13FA7/image_6.png" width="504" height="379" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;“We’ll refactor later.” &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://thereifixedit.com/2009/08/26/epic-kludge-photo-unsanitary-sanitation/" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/techblog/images/ThePerfectPhotosToIllustrateTheSadlyTypi_13FA7/image_7.png" width="504" height="379" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The company’s legacy software with broken APIs and/or endpoints we simply don’t have the resources to support anymore. &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://thereifixedit.com/2009/08/22/epic-kludge-photo-not-sure-but-that-blob-might-be-sentient/" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/techblog/images/ThePerfectPhotosToIllustrateTheSadlyTypi_13FA7/image_8.png" width="504" height="378" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I swear this is a virtual photo representing every developer’s workstation at the office. It takes half an hour to boot our machines. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://thereifixedit.com/2009/08/18/epic-kludge-photo-mattress-moving/" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/techblog/images/ThePerfectPhotosToIllustrateTheSadlyTypi_13FA7/image_9.png" width="504" height="370" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Manual deployment. It takes several of us to push a web site out to the servers, plus QA to approve the closure of the deployment ticket. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://thereifixedit.com/2009/10/07/ye-olden-tyme-spigot/" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/techblog/images/ThePerfectPhotosToIllustrateTheSadlyTypi_13FA7/image_10.png" width="504" height="379" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A very nice admin interface that no one but the devs will ever see. I wish we had an admin interface that spiffy and complete. &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://thereifixedit.com/2009/08/13/epic-kludge-photo-pop-a-wheelie/" target="_blank"&gt;&lt;img style="border-right-width: 0px; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/techblog/images/ThePerfectPhotosToIllustrateTheSadlyTypi_13FA7/image_11.png" width="307" height="454" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;This is our dev server, a virtual machine on an overloaded VM host with limited RAM. We have CruiseControl.NET on it and it takes about 30 minutes for it to build and deploy to test/QA on a single run. &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://thereifixedit.com/2009/07/23/epic-kludge-photo-amateur-conversion/"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/techblog/images/ThePerfectPhotosToIllustrateTheSadlyTypi_13FA7/image_12.png" width="504" height="379" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This is what happens when your business partner uses Java and you’re using WCF. Add SSL, and viola! &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://thereifixedit.com/2009/05/15/epic-kludge-photo-technology-i-has-it/"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="/techblog/images/ThePerfectPhotosToIllustrateTheSadlyTypi_13FA7/image_13.png" width="342" height="454" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The Microsoft Office COM APIs. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://thereifixedit.com/2009/10/09/round-knob-in-a-rectangle-hole/" target="_blank"&gt;&lt;img title="Epic-Kludge-Photo-RoundKnobInARectangleHole" alt="Epic-Kludge-Photo-RoundKnobInARectangleHole" src="http://thereifixedit.files.wordpress.com/2009/10/jonathanl-doorknob.jpg?w=422&amp;amp;h=450" width="422" height="450" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(From udhay in comments:) Perfect example of the so called work-around.&lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;.. Ohh this could go on forever. You get the idea. &lt;a href="http://thereifixedit.com/" target="_blank"&gt;Have fun.&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&amp;url=http://www.jondavis.net/techblog/post/2009/10/08/The-Perfect-Photos-To-Illustrate-The-Sadly-Typical-Software-Development-Process.aspx&amp;amp;title=The Perfect Photos To Illustrate The Sadly Typical Software Development Process" height="25" width="155" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Cghf2fytFTY1mV-k80vEdvxhS9I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Cghf2fytFTY1mV-k80vEdvxhS9I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Cghf2fytFTY1mV-k80vEdvxhS9I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Cghf2fytFTY1mV-k80vEdvxhS9I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/CqpZFD5-1R4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/CqpZFD5-1R4/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/10/08/The-Perfect-Photos-To-Illustrate-The-Sadly-Typical-Software-Development-Process.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=f7773fae-cfa2-415e-a35f-5e1c9c41dc54</guid>
      <pubDate>Thu, 08 Oct 2009 22:43:00 -0700</pubDate>
      <category>Computers and Internet</category>
      <category>Humor</category>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=f7773fae-cfa2-415e-a35f-5e1c9c41dc54</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=f7773fae-cfa2-415e-a35f-5e1c9c41dc54</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/10/08/The-Perfect-Photos-To-Illustrate-The-Sadly-Typical-Software-Development-Process.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=f7773fae-cfa2-415e-a35f-5e1c9c41dc54</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=f7773fae-cfa2-415e-a35f-5e1c9c41dc54</feedburner:origLink></item>
    <item>
      <title>Why Hello There, Expression Tree</title>
      <description>&lt;p&gt;I sought some enlightenment on FreeNode IRC in the C# channel regarding how to have strong property references without invoking them, including without delegate implementation.&lt;/p&gt;  &lt;p&gt;The problem I’ve been faced with is that nasty string-based property specifier in &lt;a href="http://gemli.codeplex.com/"&gt;Gemli.Data&lt;/a&gt;’s DataModelQuery&amp;lt;TModel&amp;gt;:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c887f4ef-7aed-431d-b384-6a0831990141" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;var women = DataModel&amp;lt;Person&amp;gt;.NewQuery()   
    .WhereProperty["Gender"] == Gender.Female;   
    .SelectMany().Unwrap&amp;lt;Person&amp;gt;();   
women.ForEach( woman =&amp;gt; Hug(woman) );  &lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I first asked the same IRC channel what initial thoughts were on the direction Gemli was going and that stupid string-based indexer was the first thing to come up. “It looks brittle.” Agreed. This is the part that bugs me the most about Gemli.Data at the moment—well, tied, along with the lack of individual field selection and aggregate function support.&lt;/p&gt;

&lt;p&gt;But LINQ-to-SQL doesn’t have this problem, which is interesting because LINQ-to-SQL doesn’t have any proprietary, Microsoft-alone-can-see-it under-the-covers magic about it. Yet with LINQ you get strong property references, &lt;em&gt;without&lt;/em&gt; invoking the properties as CLR property behavior.

  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7c8e90a0-307a-43ef-bf50-373ddac666af" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;var women = (from woman in People   
             where woman.Gender == Gender.Female   
             select woman).ToList();   
women.ForEach( woman =&amp;gt; Feed(woman) );  &lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;How? LINQ-to-SQL doesn’t even execute that binary comparison in the CLR, it converts it to T-SQL.&lt;/p&gt;

&lt;p&gt;First I had recently assumed up until today that this was a lambda expression and your CLR object that reaches LINQ’s “where” expression must surely be a class inheritor that mocks its base with no literal implementation. I mentioned this to the IRC channel, though, and was immediately told it’s done with &lt;strong&gt;expression trees&lt;/strong&gt;. I was given a sample of Expression&amp;lt;Func&amp;lt;T, U&amp;gt;&amp;gt;. What? I then came across this: &lt;a title="http://www.interact-sw.co.uk/iangblog/2005/09/30/expressiontrees" href="http://www.interact-sw.co.uk/iangblog/2005/09/30/expressiontrees"&gt;http://www.interact-sw.co.uk/iangblog/2005/09/30/expressiontrees&lt;/a&gt;&amp;#160; .. among a bunch of other articles and blog posts.&lt;/p&gt;

&lt;p&gt;Looks like I still have a lot of homework this week because I’ve never looked at expression trees in C# before. Makes me feel like I’m behind, but there’s joy in knowing that I’m catching up in this and once I get caught up it’ll open up all kinds of new doors for Gemli.&lt;/p&gt;

&lt;p&gt;(I might follow up on this blog entry inline, I just wanted to get something mentioned now since I’m heading to bed now and don’t want to lose the thought.)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SYDhuuQ3Eh_s2ZHICjg2FRzmCic/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SYDhuuQ3Eh_s2ZHICjg2FRzmCic/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SYDhuuQ3Eh_s2ZHICjg2FRzmCic/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SYDhuuQ3Eh_s2ZHICjg2FRzmCic/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/GiQAglCGRUk" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/GiQAglCGRUk/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/10/06/Why-Hello-There-Expression-Tree.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=88d020ee-eaa7-4ccd-b2a4-e3675f737032</guid>
      <pubDate>Tue, 06 Oct 2009 20:53:23 -0700</pubDate>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=88d020ee-eaa7-4ccd-b2a4-e3675f737032</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=88d020ee-eaa7-4ccd-b2a4-e3675f737032</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/10/06/Why-Hello-There-Expression-Tree.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=88d020ee-eaa7-4ccd-b2a4-e3675f737032</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=88d020ee-eaa7-4ccd-b2a4-e3675f737032</feedburner:origLink></item>
    <item>
      <title>Gemli.Data: Pagination and Counts</title>
      <description>&lt;p&gt;It occurred to me that I’m not blogging enough about how Gemli is shaping, other than mentioning the project on the whole in completely different blog posts.&lt;/p&gt;  &lt;p&gt;In the dev branch I’ve dropped the abstract base DataModelQuery class (only DataModelQuery&amp;lt;TModel&amp;gt; remains) and replaced it with an IDataModelQuery interface. This was a long-needed change, as I was really only using it for its interfaces anyway. It was being used because I didn’t necessarily know the TModel type until runtime, namely in the DataProviderBase class which handles all the deep loads with client-side-joins-by-default behavior. But an interface will work for that just as well, and meanwhile the query chaining syntax behavior was totally inconsistent and in some cases useless.&lt;/p&gt;  &lt;p&gt;Some recent changes that have been made in the dev branch include some more syntactical sugar, namely the support for loading and saving directly from a DataModel/DataModel&amp;lt;T&amp;gt; class or from a DataModelQuery&amp;lt;TModel&amp;gt; plus support for pagination and getting record counts.&lt;/p&gt;  &lt;h2&gt;Quick Loads&lt;/h2&gt;  &lt;p&gt;From DataModel: &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3d671ed0-d0c7-4204-bac1-c4197d81b820" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;List&amp;lt;MyPoco&amp;gt; collectionOfMyPoco = DataModel&amp;lt;MyPoco&amp;gt;.LoadAll().Unwrap&amp;lt;MyPoco&amp;gt;();&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;There are also Load() and LoadMany() on DataModel, but since they require a DataModelQuery object as a parameter, and DataModelQuery has new SelectFirst() and SelectMany() that do the same thing (forward the task on to the DataProvider), I’m not sure they’re needed and I might just delete them.&lt;/p&gt;

&lt;p&gt;From DataModelQuery:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3d738369-4894-42fc-bec3-6b2a5d330258" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;List&amp;lt;MyPoco&amp;gt; collectionOfMyPoco = DataModel&amp;lt;MyPoco&amp;gt;.NewQuery()
    .WhereProperty["Amount"].IsGreaterThan(5000m)
    .SelectMany().Unwrap&amp;lt;MyPoco&amp;gt;();&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;Pagination&lt;/h2&gt;

&lt;p&gt;Since Gemli is being built for web development, pagination support with pagination semantics (“page 3”, rather than “the rows between rows X and Y”) is a must. There are many things besides data grids that require pagination—actually, pretty much any list needs pagination if you intend not to show as many items on a page as there are in a database table.&lt;/p&gt;

&lt;p&gt;Client-side pagination is implemented by default, but only if DB server-side pagination is not handled by the data provider. I still intend to add DB-side pagination for SQL Server.&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:aa0db56e-35d4-4df5-be83-9a9f5d505831" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;// get rows 61-80, or page 4 @ 20 items per page, of my filtered query
var myListOfStuff = DataModel&amp;lt;Stuff&amp;gt;.NewQuery()
    .WhereProperty["IsActive"].IsEqualTo(true)
    .Page[4].OfItemsPerPage(20)
    .SelectMany().Unwrap&amp;lt;Stuff&amp;gt;();&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To add server-side pagination support for a proprietary database, you can inherit DbDataProvider and override the two variations of CreateCommandBuilder() (one takes a DataModel for saving, the other takes a DataModelQuery for loading). The command builder object has a HandlePagination property that can be assigned a delegate. The delegate would then add or modify properties in the command builder that inject appropriate SQL text into the command.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;Count&lt;/h2&gt;

&lt;p&gt;Support for a basic SELECT COUNT(*) FROM MyTable WHERE [..conditions..] is a pretty obvious part of any minimal database interaction library (O/RM or what have you). For this reason, GetCount&amp;lt;TModel&amp;gt;(DataModelQuery query) has been added to DataProviderBase, and in DbDataProvider it replaces the normal LoadModel command builder generated text with SELECT COUNT(*)…&amp;#160; The DataModelQuery&amp;lt;TModel&amp;gt; class also has a new SelectCount() method which forwards the invocation to the DataProvider.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:fbd0fa5d-fbd7-44c7-899a-c3ededc7cfe7" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;long numberOfPeepsInMyNetwork = DataModel&amp;lt;Person&amp;gt;.NewQuery()
    .WhereProperty["Networkid"].IsEqualTo(myNetwork.ID)
    .SelectCount();&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;All of these changes are still pending another alpha release later. But if anyone wants to tinker it’s all in the dev branch in source code at &lt;a href="http://gemli.codeplex.com/"&gt;http://gemli.codeplex.com/&lt;/a&gt; .&lt;/p&gt;

&lt;h2&gt;LINQ May Be Coming&lt;/h2&gt;

&lt;p&gt;I still have a lot of gruntwork to do to get this next alpha built, particularly in adding a lot more tests. I still haven’t done enough testing of deep loads and deep saves and I’m not even confident that deep saves are working correctly at the basic level as I haven’t yet used them. Once all of that is out of my way, I might start looking at adding LINQ support. I’m not sure how awfully difficult LINQ support will prove to be yet, but I’m certain that it’s doable.&lt;/p&gt;

&lt;p&gt;One of the biggest advantages of LINQ support is strongly typed member checking. For example, in Gemli, you currently have to declare your WHERE clauses with a string reference to the member name or the column name, whereas with LINQ the member name can be referenced as strongly-typed code. As far as I know, it does this by way of syntactic sugar that ultimately boils down to delegates that literally work with the object directly, depending on how the LINQ support was added.&lt;/p&gt;

&lt;p&gt;Among the other advantages of adding LINQ support might be in adding support for anonymous types. For example, right now without LINQ you’re limited to DataModels and the class structures they represent. But LINQ lets you select specific members into your return object, for example, rather than the whole enchilada.&lt;/p&gt;

&lt;p&gt;LINQ: &lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:a289652d-9a71-4de9-b9fa-e175f38a059e" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;// only return ID and Name, not the whole Product
var mySelection = (from p in Product
                   select p.ID, p.Name).ToList();&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;It’s this underlying behavior that creates patterns for me to work with that I might drag into play the support for aggregate functions in SQL using terse Gemli+LINQ semantics. Right now, it’s literally impossible for Gemli to select the result of an aggregate function (other than Count(*)) unless that was wrapped in a stored procedure on the DB side and then wrapped in a DataModel on Gemli’s side. There’s also no GROUP BY support, etc. I like to believe that LINQ will help me consolidate the interface patterns I need to make all that work correctly. However, so far I’m still just one coder as no one has jumped on board with Gemli yet so we’ll see if LINQ support makes its way in at all.&lt;/p&gt;&lt;iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&amp;url=http://www.jondavis.net/techblog/post/2009/10/05/GemliData-Pagination-and-Counts.aspx&amp;amp;title=Gemli.Data: Pagination and Counts" height="25" width="155" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jdV40l7GPwgu4VEVjU15N6ko2VM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jdV40l7GPwgu4VEVjU15N6ko2VM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jdV40l7GPwgu4VEVjU15N6ko2VM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jdV40l7GPwgu4VEVjU15N6ko2VM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/jRHPXvfjGkA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/jRHPXvfjGkA/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/10/05/GemliData-Pagination-and-Counts.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=1fb2ac67-b3dc-4d2d-b9bb-5007fedd992c</guid>
      <pubDate>Mon, 05 Oct 2009 03:54:16 -0700</pubDate>
      <category>Pet Projects</category>
      <category>Software Development</category>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=1fb2ac67-b3dc-4d2d-b9bb-5007fedd992c</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=1fb2ac67-b3dc-4d2d-b9bb-5007fedd992c</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/10/05/GemliData-Pagination-and-Counts.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=1fb2ac67-b3dc-4d2d-b9bb-5007fedd992c</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=1fb2ac67-b3dc-4d2d-b9bb-5007fedd992c</feedburner:origLink></item>
    <item>
      <title>I Think Perhaps I Also Just Don’t Like N-</title>
      <description>&lt;p&gt;As I’ve been continuing to work on &lt;a href="http://gemli.codeplex.com/" target="_blank"&gt;Gemli.Data&lt;/a&gt;, which has been continually been getting smarter and cleaner (last night I added to the dev branch the syntactic sugar of one-line loads and one-line saves straight to/from POCO objects) it keeps haunting me as it has since long before I even started the project that some people just won’t understand why I bother when there’s NHibernate.&lt;/p&gt;  &lt;p&gt;I’ve briefly mentioned the main reason why I am not on the NHibernate bandwagon—that I find it has a steep learning curve and it’s cumbersome, even its Fluent flavor is cumbersome—but I think it goes a little bit beyond that. I think it has an ‘N’ prefix. And that bugs me.&lt;/p&gt;  &lt;p&gt;It’s not just semantics.&lt;/p&gt;  &lt;p&gt;Over the years in computer science’s past, the Java programming language picked up a few tools that were built for it, and were sometimes built for other environments but were re-tailored for Java, and these tools were prefixed with a ‘J’. This became a cutesy “I love my Java” naming convention for a few such tools. And then some of them learned C#.&lt;/p&gt;  &lt;p&gt;So meanwhile in C#-land, we started getting these heavy duty toolsets that C# didn’t previously have, and they had either an ‘N’ prefix or a “.NET” suffix. NAnt. NDoc. NUnit. Lucene.NET. Spring.NET.&lt;/p&gt;  &lt;p&gt;Every single one of these tools had one thing in common: &lt;strong&gt;&lt;em&gt;they were ports!&lt;/em&gt;&lt;/strong&gt; They came in from the Atlantic, hauling all their baggage and “cultural diversities” of Java into our world and showing little respect to the culture that was here. So to speak.&lt;/p&gt;  &lt;p&gt;Truthfully, the people responsible for this had nothing less than the absolute best of intentions, and their efforts were both admirable and helpful to the computing society of .NET culture. We .NET folks, “&lt;a href="http://haacked.com/archive/2005/08/03/DoesMortKnowWeAreTalkingSmackAboutHimBehindHisBack.aspx" target="_blank"&gt;Morts&lt;/a&gt;” that some of us were, didn’t really have much culture. Nor did we have discipline, as our culture and technical understanding of computer science were defined primarily by one single entity (which resides in Redmond, Washington) and its clients.&lt;/p&gt;  &lt;p&gt;But these N-prefixed / .NET-suffixed ports &lt;em&gt;seem&lt;/em&gt; just a little insulting to me; it feels like their creators are trying to tell us, “Here, Microsofties! Now you can say, ‘me, too!’” It’s not just hurt feelings, though. (LOL.) The ports themselves have language features that seem somewhat foreign to both traditional C# code as well as to what “could be and should have been”. This isn’t always the case, of course, but at times it makes me cringe.&lt;/p&gt;  &lt;p&gt;So, putting things into perspective, why Gemli? Because I was here first, I was a native, and I want to play my little part, whether others participate or not, in shaping .NET to be, at least to me in my own little world, what I think .NET should be. It should be .NET. Not Java.&lt;/p&gt;  &lt;p&gt;What does that mean to me? From the get-go, .NET had features Java didn’t have (although it perhaps now does), like System.Reflection which gives us the power to infer things, and System.Reflection.Emit which gives us the power to optimize on-the-fly (and which I’m not taking advantage of yet, by the way, but do intend to). Microsoft totally &lt;em&gt;FAILED&lt;/em&gt; the opportunities, in my opinion, to exploit such things for tooling, while at the same time feeling free to exploit it with JITting and other areas where the CLR works in a more proprietary manner. But that’s fine, that’s where open source comes in. But you know what? If we’re going to be open sourcing software based on .NET I’d like it to NOT come from the environments that &lt;em&gt;didn’t&lt;/em&gt; have these features already.&lt;/p&gt;  &lt;p&gt;Spring.NET comes from Spring which is a Java thing which in turn did not originally have the eventing and delegate power that C# always had. And NHibernate comes from Hibernate which is a Java thing which in turn did not originally have the reflection power that C# always had.&lt;/p&gt;  &lt;p&gt;So then we have Fluent NHibernate, which has automapping support, which is nice. Fluent NHibernete is, I perceive to be, original to C# and not yet another port from Java which recently acquired reflection support. I have to confess, Fluent NHibernate is beautiful, I’d recommend it to anyone who’s taking software development seriously, because it has its origins in .NET, aside from its NHibernate mother. But it comes with a few ALT.NET encumbrances of hyper-configurability with delegates (lambdas) in the name of “convention over configuration” which comes across to me as an oxymoron in this case. But don’t get me wrong, I actually do &lt;em&gt;like&lt;/em&gt; Fluent NHibernate, I just don’t, well, &lt;em&gt;like&lt;/em&gt; it. What?&lt;/p&gt;  &lt;p&gt;Which reminds me, this ALT.NET thing… It got real big and popular a year or two ago and from them came the influences that led up to ASP.NET MVC, good for them, good for us, hurray! But it seems to me that there are two “alt” crowds in the .NET community—those who have had enterprise-level experience in formal software shops that used open source tools and who have a lot of expectations in software tooling in general to be flexible (i.e. the Java crowd), and those who prefer to approach software tools from a “get ‘er done'” approach and who are constantly looking for ways to shortcut the process of writing software quickly and effectively, without being treated like little children, by identifying conventions and building around them (i.e. the Ruby on Rails crowd). ALT.NET seems to be driven by these two forces and they often contradict each other. &lt;/p&gt;  &lt;p&gt;The enterprise crowd seems to win, though. And it annoys me. NHibernate has Java-esque eccentricities written all over it. Gemli, meanwhile, is more for the “get ‘er done” but I do fully appreciate flexibility and raw power, too. My long-term goal with &lt;a href="http://www.gemli-project.org/" target="_blank"&gt;Gemli&lt;/a&gt; (not just Gemli.Data but the whole project) is to make the Ruby on Rails intro video &lt;a href="http://rubyonrails.org/screencasts" target="_blank"&gt;here&lt;/a&gt; look like a headache and a chore to produce the same output. The video has a lot of “look what we had up our sleeves that we won’t show you” stuff happening. My goal is to create tooling, working alongside other originating-from-the-.NET crowd (as in, not ported from Java or Ruby) open source solutions for .NET like the &lt;a href="http://dev.dejardin.org/" target="_blank"&gt;Spark View Engine&lt;/a&gt; and the &lt;a href="http://argotic.codeplex.com/" target="_blank"&gt;Argotic Syndication Framework&lt;/a&gt;, that makes the process of building the same web app both intuitive and well-designed and not feel like a bunch of tricks up our sleeves. I also plan to produce a video that is concise and understandable that produces the same solution with the same features (to detail), with a better user experience, in only 10 minutes and not 15. Gemli needs a few more things to make this happen, but it’s all coming and I’m still very much on track.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="kick"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://www.jondavis.net/techblog/post/2009/09/29/I-Think-Perhaps-I-Also-Just-Done28099t-Like-N-.aspx&amp;amp;title=I Think Perhaps I Also Just Don&amp;rsquo;t Like N-" target="_blank"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.jondavis.net/techblog/post/2009/09/29/I-Think-Perhaps-I-Also-Just-Done28099t-Like-N-.aspx&amp;amp;fgcolor=ccc&amp;amp;bgcolor=143D55&amp;amp;cfgcolor=ccc&amp;amp;cbgcolor=D25E26" /&gt; &lt;/a&gt;&lt;/div&gt; &lt;iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&amp;url=http://www.jondavis.net/techblog/post/2009/09/29/I-Think-Perhaps-I-Also-Just-Done28099t-Like-N-.aspx&amp;amp;title=I Think Perhaps I Also Just Don’t Like N-" height="25" width="155" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0dR1OU3SQRW06pnZjx658qXosr8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0dR1OU3SQRW06pnZjx658qXosr8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0dR1OU3SQRW06pnZjx658qXosr8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0dR1OU3SQRW06pnZjx658qXosr8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/yGsgSNahJyc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/yGsgSNahJyc/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/09/29/I-Think-Perhaps-I-Also-Just-Done28099t-Like-N-.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=98014d96-80ba-407a-ac94-6808145a35f0</guid>
      <pubDate>Tue, 29 Sep 2009 22:54:17 -0700</pubDate>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=98014d96-80ba-407a-ac94-6808145a35f0</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=98014d96-80ba-407a-ac94-6808145a35f0</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/09/29/I-Think-Perhaps-I-Also-Just-Done28099t-Like-N-.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=98014d96-80ba-407a-ac94-6808145a35f0</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=98014d96-80ba-407a-ac94-6808145a35f0</feedburner:origLink></item>
    <item>
      <title>Spark Makes Me Fall In Love With Web Development Again</title>
      <description>&lt;p&gt;Now and then I discover a technology that makes me think, “Wow, I love being a web developer.” ASP.NET did it, back in the day. jQuery did it. ASP.NET MVC sorta did it, although I feel it has a lot of room to grow and I have high expectations of v2.&lt;/p&gt;  &lt;p&gt;Microsoft’s “acquisition” of &lt;a href="http://whereslou.com/" target="_blank"&gt;Louis DeJardin&lt;/a&gt; as a new employee, something that happens to all Microsoft employees (imagine that) and the mention of the “incident” on someone’s blog or on Twitter (dunno where??) has caused me to “click on da link” and discover the &lt;a href="http://dev.dejardin.org/" target="_blank"&gt;Spark View Engine&lt;/a&gt; for ASP.NET MVC, which this fella created. I never heard of the guy until I came across this.&lt;/p&gt;  &lt;p&gt;The Spark View Engine is one of those things that made me realize, first of all, gosh, I didn’t realize just how flexible the ASP.NET MVC View Engine extensibility was. And the next thing it made me realize was that producing ASP.NET MVC views doesn’t have to be so ugly.&lt;/p&gt;  &lt;p&gt;In fact, ASP.NET MVC views, using Spark, can be pretty remarkably readable and maintainable. Spark fills in the gaps of what some of us might’ve wished ASP.NET already did for us, such as automatically always assume a master page without rigging each and every page with a master page reference. Plus it gives us a somewhat cleaner syntax, so we can use {$MyObject.Property$} instead of &amp;lt;%=MyObject.Property%&amp;gt;. Better than that, it reads HTML tags and lets you drop in templating logic as HTML attributes, so instead of &amp;lt;% foreach (var p in products)&amp;#160; { %&amp;gt;&amp;lt;div&amp;gt;&amp;lt;%=p.Name%&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;% } %&amp;gt; you can use the cleaner &amp;lt;div each=”var p in products”&amp;gt;${p.Name}&amp;lt;/div&amp;gt;. It supports if..else as markup among other things, too.&lt;/p&gt;  &lt;p&gt;I think the thing I like best about this is that it’s more or less renderable HTML templating without regard to server execution—I can get a preview of a lot of this in non-executed HTML and see my placeholders without seeing curly braces or getting designer or 500 errors. This is really important when you’re trying to produce clean markup and communicate with colleagues and partners.&lt;/p&gt;  &lt;p&gt;I’m only still in the process of discovering this thing (watching the videos) but so far I’m loving it. Well done and let’s support this project as I’d like to see it continue to evolve and get better support.&lt;/p&gt;  &lt;p&gt;There’s also a pretty thorough podcast here: &lt;a title="http://herdingcode.com/?p=216" href="http://herdingcode.com/?p=216"&gt;http://herdingcode.com/?p=216&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/G1Ibu4yPYG-rclbAPP53Z_7k8Xs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G1Ibu4yPYG-rclbAPP53Z_7k8Xs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/G1Ibu4yPYG-rclbAPP53Z_7k8Xs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G1Ibu4yPYG-rclbAPP53Z_7k8Xs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/oHM3KSYZ1L4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/oHM3KSYZ1L4/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/09/26/Spark-Makes-Me-Fall-In-Love-With-Web-Development-Again.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=6fcc330b-0d6a-4a50-9d52-f68cc3ef4f12</guid>
      <pubDate>Sat, 26 Sep 2009 20:50:03 -0700</pubDate>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=6fcc330b-0d6a-4a50-9d52-f68cc3ef4f12</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=6fcc330b-0d6a-4a50-9d52-f68cc3ef4f12</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/09/26/Spark-Makes-Me-Fall-In-Love-With-Web-Development-Again.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=6fcc330b-0d6a-4a50-9d52-f68cc3ef4f12</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=6fcc330b-0d6a-4a50-9d52-f68cc3ef4f12</feedburner:origLink></item>
    <item>
      <title>Microsoft WebsiteSpark Now Negates The Cost For Web Devs and Designers</title>
      <description>&lt;p&gt;
A couple weeks ago I posted a blog entry (&amp;quot;&lt;a href="http://www.jondavis.net/techblog/post/2009/09/05/Is-The-Microsoft-Stack-Really-More-Expensive.aspx"&gt;Is&amp;nbsp;The Microsoft Stack Really More Expensive?&lt;/a&gt;&amp;quot;)&amp;nbsp;describing the financial barrier to entry for building software--particularly web apps--on the Microsoft platform. The conclusion was that the cost is likely to be nil if you&amp;#39;re&amp;nbsp;a) willing to settle for the &lt;a href="http://www.microsoft.com/express"&gt;Express products&lt;/a&gt; and everything else bundled in the &lt;a href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;Microsoft Web Platform Installer&lt;/a&gt; (which includes a slew of open source ASP.NET and PHP web apps to start you off), b)&amp;nbsp;&lt;a href="http://www.microsoftstartupzone.com/BizSpark/Pages/At_a_Glance.aspx"&gt;starting a software company&lt;/a&gt;, c)&amp;nbsp;&lt;a href="http://www.dreamspark.com/"&gt;a student&lt;/a&gt;, or d) an employee of a company willing to foot the bill for an &lt;a href="http://msdn.microsoft.com/en-us/subscriptions/subscriptionschart.aspx"&gt;MSDN license&lt;/a&gt; (to you personally, not to your team). 
&lt;/p&gt;
&lt;p&gt;
Well, Microsoft just created yet another program, for those of you who are e) building or designing web sites. (Sweeeeet!!) For a $100 offing fee (a fee that you pay when your license ends, rather than when it begins) you get Windows Web Server 2008 R2, SQL Server 2008 Web Edition, Visual Studio 2008 Professional Edition, and Expression Studio 3. 
&lt;/p&gt;
&lt;p&gt;
Not bad! Although, your license ends in three (3) years (same as &lt;a href="http://www.microsoftstartupzone.com/BizSpark/Pages/At_a_Glance.aspx"&gt;BizSpark&lt;/a&gt;). 
&lt;/p&gt;
&lt;p&gt;
Link: &lt;a href="http://www.microsoft.com/web/websitespark/"&gt;&lt;strong&gt;Microsoft WebsiteSpark&lt;/strong&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&amp;url=http://www.jondavis.net/techblog/post/2009/09/26/Microsoft-WebsiteSpark-Now-Negates-The-Server-Cost-For-Web-Devs-and-Designers.aspx&amp;amp;title=Microsoft WebsiteSpark Now Negates The Cost For Web Devs and Designers" height="25" width="155" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tEeoIOFjjDXSV_IF6bSqM2nTrho/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tEeoIOFjjDXSV_IF6bSqM2nTrho/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tEeoIOFjjDXSV_IF6bSqM2nTrho/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tEeoIOFjjDXSV_IF6bSqM2nTrho/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/cS4LrJOgAhQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/cS4LrJOgAhQ/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/09/26/Microsoft-WebsiteSpark-Now-Negates-The-Server-Cost-For-Web-Devs-and-Designers.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=5169769e-5750-4e8c-bbb4-92e6879e5100</guid>
      <pubDate>Sat, 26 Sep 2009 18:52:00 -0700</pubDate>
      <category>Microsoft Windows</category>
      <category>Servers and Services</category>
      <category>Web Development</category>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=5169769e-5750-4e8c-bbb4-92e6879e5100</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=5169769e-5750-4e8c-bbb4-92e6879e5100</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/09/26/Microsoft-WebsiteSpark-Now-Negates-The-Server-Cost-For-Web-Devs-and-Designers.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=5169769e-5750-4e8c-bbb4-92e6879e5100</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=5169769e-5750-4e8c-bbb4-92e6879e5100</feedburner:origLink></item>
    <item>
      <title>CSS For Layouts: Meh, I'll Stick With Tables, Thanks</title>
      <description>&lt;p&gt;
I tend to agree with the sentiments posted here: 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.flownet.com/ron/css-rant.html"&gt;http://www.flownet.com/ron/css-rant.html&lt;/a&gt;&amp;nbsp;[followups &lt;a href="http://rondam.blogspot.com/2009/02/css-and-meaning-of-life.html"&gt;here&lt;/a&gt; and &lt;a href="http://rondam.blogspot.com/2009/02/on-semantics-of-html.html"&gt;here&lt;/a&gt;]. 
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;ve wasted WAY too many aggregate hours trying to nudge DIVs into place using half-baked CSS semantics that work on all browsers without workarounds, where the simple use of a &amp;lt;TABLE&amp;gt; tag would have sufficed just fine. Even this blog&amp;#39;s sidebar&amp;nbsp;does not behave the way I wanted it to behave despite spending some time trying and failing to get it to behave according to my preferences because I chose CSS instead of &amp;lt;TABLE&amp;gt; and, frankly, CSS sucks for some things such as this. With &amp;lt;TABLE&amp;gt; I can say simply &amp;lt;TABLE WIDTH=&amp;quot;100%&amp;quot;&amp;gt;&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;..&amp;lt;/TD&amp;gt;&amp;lt;TD WIDTH=&amp;quot;300&amp;quot;&amp;gt; and boom I have a perfect sidebar with fixed width and a fluid content body with ABSOLUTELY NO CSS TO HAVE TO MANGLE other than disabling the default HTML rendering behavior of borders and spacing. 
&lt;/p&gt;
&lt;p&gt;
Ron comments, 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	Another common thread is that &amp;quot;tables are for tabular data, not layout.&amp;quot; Why? Just because they are called tables? Here&amp;#39;s a news flash: HTML &lt;em&gt;has no semantics beyond how it is rendered!&lt;/em&gt; (That&amp;#39;s not quite true. Links have semantics beyond their renderings. And maybe label tags. But nothing else in HTML does.) 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
The only reservation I have in favor of DIVs instead of TABLEs is when it gets down to nesting. Deeply nested &amp;lt;TABLE&amp;gt;&amp;#39;s can get really, &lt;em&gt;really&lt;/em&gt; ugly. I think this is where all the hatred of &amp;lt;TABLE&amp;gt;s comes from, which I agree with. 
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;ve reached the conclusion that if I can use &amp;lt;DIV&amp;gt;&amp;#39;s effectively (and quickly) and the behavior is predictable, I&amp;#39;ll use DIVs. But same with TABLEs. I have yet to hear a CSS purist describe a logical reason to use DIVs+CSS over TABLEs for overall page structure. It all seems to be &lt;a href="http://www.google.com/search?q=cognitive+dissonance"&gt;cognative dissonance&lt;/a&gt; and personal bias. 
&lt;/p&gt;
&lt;p&gt;
&lt;iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&amp;url=http://www.jondavis.net/techblog/post/2009/09/24/CSS-For-Layouts-Meh-Ill-Stick-With-Tables-Thanks.aspx&amp;amp;title=CSS For Layouts: Meh, I'll Stick With Tables, Thanks" height="25" width="155" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt; 
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sTCy6Vw32zLnsI-ZL8pppgo9XmQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sTCy6Vw32zLnsI-ZL8pppgo9XmQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sTCy6Vw32zLnsI-ZL8pppgo9XmQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sTCy6Vw32zLnsI-ZL8pppgo9XmQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/ZUUzyQu8MEI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/ZUUzyQu8MEI/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/09/24/CSS-For-Layouts-Meh-Ill-Stick-With-Tables-Thanks.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=b0dfbbdf-df26-4b09-8046-5a38f6fa0afb</guid>
      <pubDate>Thu, 24 Sep 2009 11:09:00 -0700</pubDate>
      <category>Web Development</category>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=b0dfbbdf-df26-4b09-8046-5a38f6fa0afb</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=b0dfbbdf-df26-4b09-8046-5a38f6fa0afb</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/09/24/CSS-For-Layouts-Meh-Ill-Stick-With-Tables-Thanks.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=b0dfbbdf-df26-4b09-8046-5a38f6fa0afb</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=b0dfbbdf-df26-4b09-8046-5a38f6fa0afb</feedburner:origLink></item>
    <item>
      <title>Use A Prefab Comparer For Case-Insensitive Dictionaries</title>
      <description>&lt;p&gt;I'm kicking myself because I always just assumed that generic dictionaries in C#, i.e. Dictionary&amp;lt;string, object&amp;gt;, were case-sensitive. I always assumed that in order to have a case-insensitive dictionary, you had to do one of two things: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;public class CaseInsensitiveDictionary&amp;lt;TValue&amp;gt; : Dictionary&amp;lt;string, TValue&amp;gt; { ... } &lt;/li&gt;    &lt;li&gt;var item = myDictionary.Find(kvp=&amp;gt;kvp.Key.ToLower() == myKey.ToLower()); &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Actually, Dictionary&amp;lt;K,V&amp;gt; has a constructor that accepts a comparer object with which you can take advantage of prefab case-insensitive key-matching behavior. &lt;/p&gt;  &lt;pre class="c-sharp:nogutter" name="code"&gt;Dictionary&amp;lt;string,object&amp;gt; myDictionary = new Dictionary&amp;lt;string,object&amp;gt;(StringComparer.InvariantCultureIgnoreCase);&lt;/pre&gt;

&lt;p&gt;I realized this upon stumbling across the MSDN documentation, which, of course, &lt;em&gt;everyone&lt;/em&gt; reads for fun.&amp;#160; &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms132073.aspx"&gt;&lt;strong&gt;http://msdn.microsoft.com/en-us/library/ms132073.aspx&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&amp;url=http://www.jondavis.net/techblog/post/2009/09/22/Use-A-Prefab-Comparer-For-Case-Insensitive-Dictionaries.aspx&amp;amp;title=Use A Prefab Comparer For Case-Insensitive Dictionaries" height="25" width="155" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/l05SbkMOgWD9NkBOVBUxtzjeBx8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l05SbkMOgWD9NkBOVBUxtzjeBx8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/l05SbkMOgWD9NkBOVBUxtzjeBx8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l05SbkMOgWD9NkBOVBUxtzjeBx8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/2C0L8HkVMes" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/2C0L8HkVMes/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/09/22/Use-A-Prefab-Comparer-For-Case-Insensitive-Dictionaries.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=fe43515e-1a19-413f-9719-665e8da4e82f</guid>
      <pubDate>Tue, 22 Sep 2009 14:56:00 -0700</pubDate>
      <category>C#</category>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=fe43515e-1a19-413f-9719-665e8da4e82f</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=fe43515e-1a19-413f-9719-665e8da4e82f</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/09/22/Use-A-Prefab-Comparer-For-Case-Insensitive-Dictionaries.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=fe43515e-1a19-413f-9719-665e8da4e82f</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=fe43515e-1a19-413f-9719-665e8da4e82f</feedburner:origLink></item>
    <item>
      <title>Gemli Project v0.2 Released</title>
      <description>&lt;p&gt;
Earlier this late night I posted the first major overhaul update of Gemli since a month ago. This brings a huge number of design fixes and new features to Gemli.Data&amp;nbsp;and makes it even more usable. It&amp;#39;s still alpha, though, as there&amp;#39;s a lot more testing to be done, not to mention still&amp;nbsp;some new features to be added. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://gemli.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33281"&gt;http://gemli.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33281&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
From the release notes: 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Added to DataProviderBase: SupportsTransactions { get; } , BeginTransaction(), and BeginTransaction(IsolationLevel) &lt;/li&gt;
	&lt;li&gt;Facilitate an application default provider: Gemli.Data.Providers.ProviderDefaults.AppProvider = myDBProvider .. This allows DataModels and DataModelCollections to automatically use the application&amp;#39;s data provider when one hasn&amp;#39;t already been associated with the model (so you can, for example, invoke .Save() on a new model without setting its provider manually) &lt;/li&gt;
	&lt;li&gt;Replace (and drop) TypeConvertor with DbTypeConverter. &lt;/li&gt;
	&lt;li&gt;Operator overloads on DataModelQuery; you can now use == instead of IsEqualTo(), but this comes at the cost of chainability. (IsEqualTo() is still there, and still supports chaining.) &lt;/li&gt;
	&lt;li&gt;Added SqlDbType attribute property support. DataType attribute value is no longer a DbType and is instead a System.Type. The properties DbType and SqlDbType have been added, and setting any of these three properties will automatically translate and populate the other two. &lt;/li&gt;
	&lt;li&gt;DataType attribute value is no longer a DbType and is instead a System.Type. The properties DbType and SqlDbType have been added, and setting any of these three properties will automatically translate and populate the other two. &lt;/li&gt;
	&lt;li&gt;WhereMappedColumn is now WhereColumn &lt;/li&gt;
	&lt;li&gt;Facilitate optional behavior of inferring from &lt;strong&gt;all&lt;/strong&gt; properties not marked as ignore, rather than the behavior or inferring from &lt;strong&gt;none&lt;/strong&gt; of the unattributed properties unless no properties are attributed. The latter behavior--the old behavior--currently remains the default. The new behavior can be applied with DataModelTableMappingAttribute&amp;#39;s PropertyLoadBehavior property 
	&lt;ul&gt;
		&lt;li&gt;This may change to where the default is InferProperties.NotIgnored (the new behavior), still pondering on this. &lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;Add sorting to MemoryDataProvider &lt;/li&gt;
	&lt;li&gt;TempMappingTable is now DataModelMap.RuntimeMappingTable &lt;/li&gt;
	&lt;li&gt;ForeignDataModel.ForeignXXXX was backwards and is now RelatedXXXX (multiple members) &lt;/li&gt;
	&lt;li&gt;DataModelFieldMappingAttribute is now DataModelColumnAttribute. &lt;/li&gt;
	&lt;li&gt;DataModelMap.FieldMappings is now DataModelMap.ColumnMappings. &lt;/li&gt;
	&lt;li&gt;DataModelTableMappingAttribute is now DataModelTableAttribute. &lt;/li&gt;
	&lt;li&gt;DataModelForeignKeyAttribute is now ForeignKeyAttribute. &lt;/li&gt;
	&lt;li&gt;The XML serialization of all elements now follows these renamings and is also now camelCased instead of ProperCase. &lt;/li&gt;
	&lt;li&gt;XML loading of mapping configuration is getting close, if it isn&amp;#39;t already there. Need to test. &lt;/li&gt;
	&lt;li&gt;Added DataModelMap.LoadMappings(filePath)&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&amp;url=http://www.jondavis.net/techblog/post/2009/09/21/Gemli-Project-v02-Released.aspx&amp;amp;title=Gemli Project v0.2 Released" height="25" width="155" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/T1Euqc1V1jsRY_86aojFiMNGzX0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/T1Euqc1V1jsRY_86aojFiMNGzX0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/T1Euqc1V1jsRY_86aojFiMNGzX0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/T1Euqc1V1jsRY_86aojFiMNGzX0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/stimpy77/~4/ecjcbt2Psxs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/stimpy77/~3/ecjcbt2Psxs/post.aspx</link>
      <author>jon.nospam@nospam.jondavis.net (Jon)</author>
      <comments>http://www.jondavis.net/techblog/post/2009/09/21/Gemli-Project-v02-Released.aspx#comment</comments>
      <guid isPermaLink="false">http://www.jondavis.net/techblog/post.aspx?id=3d42dba6-0147-443c-bc87-1d3f910e9ef8</guid>
      <pubDate>Mon, 21 Sep 2009 03:57:00 -0700</pubDate>
      <category>C#</category>
      <category>Cool Tools</category>
      <category>Pet Projects</category>
      <category>Software Development</category>
      <dc:publisher>Jon</dc:publisher>
      <pingback:server>http://www.jondavis.net/techblog/pingback.axd</pingback:server>
      <pingback:target>http://www.jondavis.net/techblog/post.aspx?id=3d42dba6-0147-443c-bc87-1d3f910e9ef8</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.jondavis.net/techblog/trackback.axd?id=3d42dba6-0147-443c-bc87-1d3f910e9ef8</trackback:ping>
      <wfw:comment>http://www.jondavis.net/techblog/post/2009/09/21/Gemli-Project-v02-Released.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.jondavis.net/techblog/syndication.axd?post=3d42dba6-0147-443c-bc87-1d3f910e9ef8</wfw:commentRss>
    <feedburner:origLink>http://www.jondavis.net/techblog/post.aspx?id=3d42dba6-0147-443c-bc87-1d3f910e9ef8</feedburner:origLink></item>
  </channel>
</rss>
