mike hodnick -> mhodnick <-> kindohm

Mike Hodnick is a geeky consultant guy living in Chaska, MN. He enjoys writing code, writing music, and doing fun stuff with his wife and daughter. This is his personal website, where you can get to his blog, music library, and other nonsense.

Latest From Twitter...

The Blog

Code

Neil mentioned to me that Google just released a charting API. I decided to check it out today and was very impressed - I didn't expect it to be completely URL-based! The tinyurl below converts into a very, very long Url, and it's just too long to paste in here. But if you click on it you'll see all of the text-encoded data that supports the chart data, which generates the chart below. http://tinyurl.com/6z26s7 The data above represents the gas mileage for my Honda Accord over the past few months. But the Google charting API... it can do quite an array...

This is arguably one of the easiest tasks you can perform in code as a SharePoint developer, but not very well known or documented.  Start off by referencing the Microsoft.SharePoint.Publishing assembly.  The rest is cake: // assume we're using the // Microsoft.SharePoint.Publishing.Administration namespace ContentDeploymentJobCollection jobs = ContentDeploymentJob.GetAllJobs(); foreach (Job job in jobs) { Console.WriteLine(job.Name); job.Run(); } The ContentDeploymentJob class also has a GetAllQuickDeployJobs() method to return only Quick Deploy jobs. The ContentDeploymentJob class hosts the expected methods and properties you'd find on a job, such as Name, Description, LastStatus, Run(), and Test() (among others). Technorati Tags: sharepoint code

In my last post about connectable nodes in Silverlight, my code had an annoying problem where if you moved the mouse too quickly the selected shape would fall behind and stop moving.  I corrected this problem by moving the move logic to the containing Page rather than keep it inside the shape user control.  The containing Page is aware of mouse movement outside of each shape, and therefore can control shape movement when the mouse speeds ahead outside of a shape while dragging it around.  New code and example app are available: Source: nodeconnect2.zip Example App: http://www.kindohm.com/sl/nodeconnect/testpage.html Technorati Tags: code silverlight programming

This is strictly just a UI concept at this point, but it's a very simple Silverlight implementation of drawing some shapes on the screen, connecting them with lines, then clicking and dragging the shapes around while maintaining the line connections.  Source Code: nodeconnect2.zip [552 kb] Example App: http://kindohm.com/sl/NodeConnect/TestPage.html It's hard to explain the highlights with only small code snippets (I don't want to paste the entire source code into this post), but here is a shot at some of the key features... The nodes/shapes were implemented as Silverlight user controls. Clicking and dragging was simply handled on the user control's MouseMove...

Download Source Code: SilverlightRadialGraph.zip [582 KB] Recently I've been looking into some challenges with data visualization - particularly with viewing relationships between a large number of entities.  Social Networking is a classic example.  A great example of how to visualize a large network of "friends" on Facebook is to use the Nexus application (developed by Ivan Kozik): Click to enlarge This is very close to what I know as a "radial graph".  I couldn't find a good definition of a radial graph anywhere, but here is an academic publication that at...

Thanks to everyone who attended my talk on extending the MOSS Search API today.  Slides and code are available here: Slides (PowerPoint 2007) Slides (PowerPoint 2003) Code Technorati Tags: code sharepoint presentation

If you are writing code using the SharePoint migration API (e.g. using the SPExport/SPImport classes, which Stefan Goßner has blogged in detail about), you'll want to be careful about the scope of your exports when exporting custom layout pages in MOSS.  In short, custom layout pages get copied to the wrong folder when performing an export scoped at the site collection level.  Make sure you use an export scoped at the top-level web rather than the site collection in order to get layout pages in their proper place. Let's start with a scenario - let's build a custom content...

For "Publishing" sites In Microsoft Office SharePoint Server, you have the ability to specify a master page that all pages in the web should use: Optionally, you have the ability to inherit the master page of the parent web (if a parent exists): Setting these two values programmatically is easy, but not necessarily intuitive. First, to set the master page, it is as easy as setting the value of an SPWeb object's CustomMasterUrl property to the server-relative path of the master page: SPSite site = new SPSite("http://myserver"); SPWeb web = site.OpenWeb("/some/web/path"); web.CustomMasterUrl =...

Robot tanks trying to kill each other.  Well, at least that's what I'm aspiring toward :) git clone git://github.com/kindohm/kindohm-artillery.git http://github.com/kindohm/kindohm-artillery/tree/master Right now it's super stripped down and simple.  No real UI or interactivity yet.  Just some stationary guns that don't move and some output messages to the console.  The guns fire projectiles at each other in a parabolic arc.  Since the projectile path and firing solution are both predictable, I introduced some randomness so that the first gun to shoot doesn't automatically "win".  Basically my work so far was just to get the trajectories down.  This article was most helpful: http://en.wikipedia.org/wiki/Trajectory. Next...

posted @ Monday, May 12, 2008 4:04 PM | Feedback (0) |

The latest changes/enhancements to my home-grown simulation have been committed.  I've also made the latest source available as its own downloadable zip archive (view the downloads page to download the archive): http://code.google.com/p/kindohm-life/ It's a C# project - you'll need to build the code to run the exe. UPDATE: compiled binaries have now been uploaded (2008.05.07) The changes include: Improved "free will" AI for carnivores and herbivores.  They aren't so rigid in their ways any more.  The old "hunt-at-all-costs-or-die" mentality has been replaced with an algorithm that looks for the nearest food/mate/prey at...

posted @ Tuesday, May 06, 2008 11:44 PM | Feedback (0) |

I've been working on a home-grown AI simulation for the past week or so.  The code is posted here: http://code.google.com/p/kindohm-life/ If I get some free time tonight I'll post some more interesting details about it.  Basically it's an environment with herbivores, carnivores, and plants that carry out their short lives walking, eating, mating, and then dying (usually of starvation - at least up to this point).  The motivation for this?  Just because. What have I learned so far?  A little bit about threading (in the user interface), and that adding one variable to your AI...

posted @ Saturday, April 26, 2008 4:08 PM | Feedback (0) |

Thanks to everyone who attended the MODIG tonight on the MOSS Search API.  Slides and code are posted here: http://tinyurl.com/6y5hc7 Technorati Tags: sharepoint MODIG code MOSS

The schedule for the Spring 2008 Twin Cities Code Camp has been posted: http://www.twincitiescodecamp.com/TCCC/Spring2008/Schedule.aspx I'll be speaking at the end of the day on Extending SharePoint Search with the Search API.  Technorati Tags: sharepoint code

posted @ Wednesday, March 05, 2008 9:16 AM | Feedback (5) |

Version 1.1.0.0 of SharePoint Search Bench has been released: http://www.codeplex.com/SPSearchBench There are a few new features in this release: Full Text query generation tools.  If you're not familiar with the syntax of Full Text search queries, there is a FullTextBuilder class (and some other supporting classes) that can build the queries for you.  Something like this:FullTextBuilder text = FullTextBuilder.Select("Title, Author").Where(Condition.FreeText("dog, cat"));Any number of conditions may be "and'ed" and "or'ed" together. Support for verbose logging with log4net. A CHM help file with API documentation.  The documentation goes a little beyond listing the types and members in the assembly by...

There are lots of questions out on forums and blogs about how to programmatically create an InfoPath form from an InfoPath XSN template, but they all suggest the same thing: use the InfoPath application (or the Forms Server hosting page) to fill out a new, blank form by hand and then save the empty form xml somewhere.  Use the empty xml as a blank placeholder form that you can copy programmatically whenever you want. This approach is valid, but it's a pain in the arse for deploying an InfoPath forms solution on a project.  Imagine you have ten InfoPath forms...

I attended a pre-conference session on Silverlight almost immediately after getting off the plane.  Unfortunately it wasn't a very good session for me.  I'm finding that most Silverlight sessions are about XAML - not the fine details about Silverlight.  This session covered the basics of setting up a Silverlight project in Visual Studio from scratch, which was good.  So far I've only seen Silverlight projects created from project templates.  I like being able to see stuff get set up without any smoke and mirrors and to see the raw code.  But after about 10 minutes of that, it was nothing but creating...

Download SharePoint Search Bench from www.codeplex.com/SPSearchBench SharePoint Search Bench is a WPF application used to run full-text SQL and keyword queries against Microsoft Office SharePoint Server (MOSS) search.   This project is something I've had in the works for a little while.  Extending MOSS search is a common task among SharePoint developers, yet there aren't really any tools available to test, try, or develop queries against MOSS search.  Unlike SQL Server, MOSS doesn't ship with a "Query Analyzer".  On projects where I was extending MOSS search, I found myself writing my own app to write and test queries.  Here...

In the object-oriented world, when I hear the word "sealed" I think of preventing inheritance.  If I create a sealed class named Car, it means that I don't want anyone else to inherit or derive from Car.  In WSS 3.0, you can create new Content Types that derive from a parent Content Type (e.g. a Car Content Type that derives from a parent Vehicle Content Type).  You can also create sealed Content Types.  You can refer to the Content Type Definition Schema and the SPContentType class for details.  So what does it mean to create a sealed Content Type?  Not as much...

Here's the script I use to generate tags for my Subtext posts. It writes the tag HTML to the screen and also copies it to the clipboard for immediate pasting: if ($args.Length -ne 2) { write-host 'Two arguments (site and tag list) expected' write-host 'Example: tags del.icio.us "scripts tags llama"' return } $site = $args[0] $input = $args[1] $delim = ' ' $splits = $input.Split($delim.ToCharArray()) $header = '<p class="tags">tags: ' $footer = '</p>' $format = '<a href="http://' + $site + '/tag/{0}"' $format += ' target="_blank" rel="tag">{0}</a> ' $html = new-object System.Text.StringBuilder [void]$html.Append($header) for ($i = 0; $i -le $splits.Length; $i++) { if ($splits[$i].Length -ge 1) { ...

posted @ Friday, May 25, 2007 10:13 AM | Feedback (0) |

Tonight, at random, I decided to upgrade my site and create a new design for it. It's 12:30 AM and it's done. No it's not. I'm kidding. The latest release of Subtext now supports tagging and identicons. Subtext uses a microformat for tagging, and I actually haven't quite figured out how to best integrate Subtext tagging in my site yet. It just doesn't work as cleanly as I'd like. tags: subtext web kindohm.com tags tagging blog

posted @ Wednesday, May 16, 2007 12:34 AM | Feedback (3) |

Download the source code for this post: Normals3D.zip (100 KB) One of the questions brought up during my WPF 3D talk at the Code Camp this weekend was what happens when you don't use normals in your meshes. The answer is that it depends. When you use a complete, discrete set of points for each flat surface in your mesh, the the effects of not using normals isn't that significant. However, if you are "lazy" and use the fewest amount of points possible for all triangles in your mesh, then the effects of not using normals is more...

Thanks to everyone who attended my talk at the Twin Cities Code Camp. Here is a list of stuff related to the talk that you can download: The PowerPoint slide deck: TCCC-WPF3D-slides.zip (contains both Office 2007 and Office 2003 versions) The demo code: CodeCamp.Wpf3D.zip (1 MB) The "Moving Camera" application: MoveCamera.zip (8MB - includes media files) The Cartography application (USA states map): Cartography3D-v2.zip (500 kb) The Cartography database in SQL backup form: CartographyDB.zip (37 MB) I uploaded the entire Cartography database so that you can actually execute the code against the real data. You...

Creating your own custom field types in Windows SharePoint Service v3 is an awesome thing. Instead of relying on the out-of-the-box types (text, number, Url, etc), you can create your own fields that incorporate whatever logic and data you want. You can derive from the SPField class or a specific type of field (such as SPFieldText, SPFieldNumber, etc). A custom field can have some custom properties. For example, if you have a custom field named Car, you could have a custom property named Color on the Car field. The user could select a color from a...

This app started out as an experiment with animating a PerspectiveCamera in a WPF 3D scene. Basically, I wanted to achieve the effect of "flying" through a model. WPF's 3D animations are just too tempting to me though, and after achieving the camera animation I couldn't help but busy-up the app with rotating videos, a background Edgey track and some extra keyboard commands to have fun with. I haven't done anything useful in a WPF app yet :) Anyway, here's the source code: MoveCamera.zip (8MB). The zip file is big because the media files are included. And here's...

The session list for the upcoming Twin Cities Code Camp has been posted. Your truly is first on the list :) Make sure you go and sign up - it's on April 28th. tags: codecamp code presentation

posted @ Tuesday, April 03, 2007 11:49 AM | Feedback (0) |

I stumbled across a great .Net class library and article posted on codeproject.com: .NET random number generators and distributions. It's a library that allows you to generate random numbers based on well-known statistical distributions: //EXAMPLE //Generate a random number based on a //normal distribution centered //around 50 with a standard deviation of 7... NormalDistribution normal = new NormalDistribution(); normal.Mu = 50; normal.Sigma = 7; double nextValue = normal.NextDouble(); Piece of cake to use, and from what I've seen it performs well. The code author supplies a test/demo app which gives an indication of how well it performs - not to mention demonstrating all of the distributions it can...

posted @ Wednesday, March 21, 2007 8:52 PM | Feedback (1) |

I've updated the WPF 3D Tutorial to work with the latest WPF code in .Net 3.0. The update is long overdue, as the .Net 3.0 bits have been out for some time now. Both the tutorial text and source code are now up to date. This was partially motivated by the fact that I'll be giving a talk on 3D construction in WPF in a few months. My old WPF code needs to be dusted off a bit. tags: wpf 3d code tutorial programming

I recently installed Windows Vista on my new work laptop, and have been having trouble getting Visual Studio 2005 Team Edition with the Team Foundation client to work correctly. Without installing some required service packs and updates, I encountered Package Load Failure errors - or VS 2005 decided to not work at all. Here's a list of steps you need to take to get VS 2005 with the Team Foundation client working on Vista: Install VS 2005 Install VS 2005 SP1: download Install VS 2005 SP1 Update for Vista: download Install the Team Foundation...

The Subtext upgrade to v1.9.2 pretty much went without a hitch. And as for the new skin - now that I've had some time to live with it I'm not sure how happy I am with it. Nikki mentioned that "kindohm.com" isn't very noticeable right away on the home page, and now that's bugging me. I may make a few small changes to account for that. tags: subtext site web blog upgrade

I may be brave and attempt to upgrade my site to the latest version of Subtext. It'll involve an upgrade to ASP .Net 2.0, a database schema change, and some web.config merging. With luck, there'll be little downtime. At worst, I won't get a good chance to fix any major problems until Tuesday if I run into anything I can't solve tonight. The change will also coincide with a new site skin, which is not the same as this new skin that I previewed before. I ended up hating that design :) tags: subtext site web blog upgrade

The next Twin Cities Code Camp is on April 28th, 2007. Visit www.twincitiescodecamp.com for all the details. I'm actually going to present a topic this time: 3D Construction Basics in Windows Presentation Foundation. That's assuming my topic gets approved :) They're still looking for presenters, so if you want to give a talk go ahead and visit the site for information about how to submit a topic. I didn't go to the last one but the event was a success last time and it looked like a lot of fun. tags: codecamp code presentation wpf 3d

When I use a custom configuration section in a .Net app, I usually use an implementation of the Singleton pattern to create a class that accesses my custom configuration data. In other words, there is only one class and one instance of that class in my app that accesses my settings. That way once the settings are loaded into memory they don't need to be loaded again by my app. I usually implement my Singleton settings reader so that it only loads settings once. e.g. if it already loaded the settings then don't load them again: private MyConfigData...

posted @ Friday, January 12, 2007 8:37 AM | Feedback (0) |

I can't sit still every time I think about Pete's post about leaving Microsoft. I don't see anything wrong with the main purpose of going to work to be to bring home a paycheck. If I were to only go to work to do the things I'm most passionate about, then I'd be broke and not be able to afford to do the things I'm most passionate about. I don't know any employers who are looking for a person to experiment with recording equipment, write experimental songs that nobody else wants to listen to, go to hockey games, host LAN...

If you're a developer, you've probably heard of or visited The Daily WTF. It's a site where developers can post really poor code that they've come across for the development community to laugh about. I swear, someone needs to come up with TheDailyClientWTF.com. Here's the scenario: Customer: "Hey Mike, can we have the News list removed from the News and Events page of the website? We only use the Events items and the News list is always empty." Mike: "Sure no problem. I'll remove the list for the next deployment." [Mike deletes the control from the News and Events page and deploys...

posted @ Tuesday, July 25, 2006 2:22 PM | Feedback (0) |

I haven't used Linux since college (1994 - 1998). I attempted getting it running on a spare box at home a few years back but had some issues with the installation. Now I'm at it again and got the Ubuntu distro installed on a Virtual PC on my laptop. I'm not sure why I decided to try out Linux again... sheer morbid curiosity I guess. Part of me is interested in learning the Apache web environment and the related development technologies. But what really hit me aftear installing it was the benefit of open-source applications. From Ubuntu's package manager I was suprised to...

posted @ Friday, July 21, 2006 8:13 AM | Feedback (2) |

Rory recently posted about two software developer types: 1) the kind that takes everything seriously and lacks a sense of humor or fun and 2) the kind that has fun while programming. I think he's right on, but I would say that this applies generally to almost any type of profession. I've seen and worked with musicians, manufacturing engineers, truck drivers, software developers, and retail clerks who all either take their job and lives way too seriously or try to have fun while doing good work. I don't think it only applies to developers. There's also a sub-type of the...

posted @ Friday, July 14, 2006 10:40 AM | Feedback (0) |

This has been a long time in the works, but I now have a significantly improved music library: http://www.kindohm.com/MusicLibrary. My old "library" was basically a bunch of static content. The new library offers: Tags. Yeah, I got trendy and implemented tags. Tracks might be tagged "heavy" or "weird" so you can listen to all my "heavy" and "weird" stuff. Simple track searching. Search by tag or by title. Track and album browsing. Get your mouse on and click click click away. Dynamic playlist generation. After performing a search or while viewing an album, you can download or start playing an m3u...

There's a new release for Subtext out there. This is hardly new news, but wanted to post it because Subtext is cool. I'm glad that they've implemented a provider model for the text editor for writing blog entries. I absolutely hate the FreeRichTextBox control that .Text and Subtext started with. The new version of Subtext ships with a plain text editor, and I'll be all over that once I upgrade.

posted @ Tuesday, June 20, 2006 8:19 AM | Feedback (0) |

Nikki and I launched EnduringBlooms.com last night. It's a site for Nikki's mom, who is a watercolor artist. Right now it's a simple site to showcase some work and provide information about how to buy paintings. She ultimately would like to allow people to buy prints directly from the site, but she wanted to keep it simple to start with. Her work is amazing, and the website doesn't do it justice. In person her paintings are very vivid, and much much larger. We have a few in our house and they are beautiful. The site itself was...

posted @ Thursday, June 15, 2006 10:49 AM | Feedback (0) |

I have too many websites. Some were whipped up to have a little fun with development and to see how much traffic I could generate, others are large apps with lots of data, and others I'm "hosting" for other folks. I can't do much about the stuff I'm hosting for other people, and those sites don't cost me anything anyway. All of the other sites begin to add up over time though. e.g. $30/year for the domain, plus $15/year to host an additional domain with my web host. I'm thinking of dumping three of my domains and their associated sites: Halo2NameGen.com...

posted @ Monday, May 22, 2006 8:25 AM | Feedback (2) |

I whipped up this latest design tonight. I just wasn't enjoying the last dark theme so much. This one brightens things up a bit and also uses the original header image that I used when I started this so-called "blog". Enjoy.

posted @ Friday, May 05, 2006 10:15 PM | Feedback (0) |

Over VPN Get latest operation Taking way too long I'd do anything do be on the office's network right now.

This is a joke. While adding a project to a VS .Net 2005 solution, I encountered this message: "The length of the full path for the solution, project or item you are creating exceeds the maximum path length allowed by the system. You must reduce the length of the name or the location." I think this piggybacks on an earlier post I made last November about solution path lengths in VS .Net 2003. At least VS .Net is telling developers when the path is too long now. But why does the length of the path have to matter??...

posted @ Friday, March 31, 2006 8:30 AM | Feedback (1) |

I've started blogging on Inetium's blog server (http://blogs.inetium.com/blogs/mhodnick, RSS). I see value in blogging for Inetium, but I don't want to give up posting technical content on my personal site either. I also want to avoid cross-posting because I want both "blogs" to be as valuable as they can on their own. Thus, my plan is to use my Inetium blog for a narrower scope of topics such as WinFX and WPF and any other work-related content. I'll keep using my personal site for any personal development projects outside of work (not that I have any right now)...

After doing my .Text upgrade, I've noticed that Subtext hasn't been able to remember my login credentials whenever I log in to my site. In Firefox I viewed the cookies for kindohm.com and found a bunch of "Dottext" cookies from the old site. I figured that maybe there was a conflict between cookies somehow and deleted all of the cookies for kindohm.com. That did the trick - now my credentials are remembered across sessions. So you if you converted to Subtext and are having the same problem, delete your cookies from IE or just remove your site's cookies within Firefox....

posted @ Tuesday, March 21, 2006 7:37 AM | Feedback (1) |

This week I've been integrating a Trackball component (found in the WinFX examples on Robert Hogue's site) and playing with 3D animations in WPF apps. So, you're probably wondering what it looks like when you have a multi-colored matrix of bouncing, spinning cubes. Well you're in luck: Download the code here. In the words of Raymond: "Necessary? No. Cool? Absolutely." But seriously... I'm glad I was able to find some time to get to this little exercise. While my final product doesn't really provide much value, the knowledge gained in the process can be...

I took off the Search feature of the site this morning after discovering a bug. Basically the Url of each search result item is invalid. It comes back in the format http://www.kindohm.com//archive/etc..... I checked out the Subtext search control in Reflector, and I can see where that extra forward-slash is being added. It's added if the blog is hosted in a subfolder under the root of the domain, which mine is not. There's a conditional IF statement that checks this, and my site looks correctly configured in the Subtext database, so I'm not sure what's...

posted @ Saturday, March 18, 2006 6:53 AM | Feedback (1) |

Nikki sometimes makes toys for Eva out of inexpensive everyday household things. Example: the metal tops from frozen juice canisters. Eva absolutely loves playing with them because they're easy to pick up, kinda shiny, and make noise when she hits them together. So Nikki decided to "make" some more of the juice tops for Eva to play with and put numbers on them so that she can start to work with numbers. Nikki called and asked "should I use either a number 'ten' or a number 'zero'? Without hesitation, I said "zero". We're going to start her off right with zero-based...

posted @ Friday, March 17, 2006 12:26 PM | Feedback (2) |

The site's conversion to Subtext is done, and it was completely hassle and bug free. The folks at SubText did an excellent job with the .Text import utility and the Subtext installation screens.  What's even better is that all of the permalinks on the site still work. So... I had to update my current skin to work with Subtext, and in the process of making small changes to get it to work, I took advantage of some of the new Subtext controls. In this skin, you'll see a new Search feature and also a calendar to...

posted @ Thursday, March 16, 2006 8:01 AM | Feedback (7) |

Press Release Maybe, just maybe, gone are the days of using .Text for kindohm.com. .Text is old, quirky, and unsupported (even though I love the skinning abilities). It'd be nice to use a similar engine but with a few improvements. I've yet to install it somewhere and dig in, but I'm eager to see what it has.

posted @ Friday, March 03, 2006 1:13 PM | Feedback (1) |

Paraphrased summary from real dialog with a client: Client: "We want users to have a 2nd password for our new intranet." Consultant: "But you'll be using Windows integrated security already" Client: "Right, but our users need to share their Windows usernames and passwords for other purposes, and we don't want someone else to log in to the intranet as someone else and see sensitive information." Consultant: "You wha-- *choke* *snort* *cough* *spills coffee* *grasps holy amulet of network security* Does anyone else see the fault in that reasoning? Holy crap. Welcome to the year 2006. This isn't a...

This is just a repost from a comment left on my site, but the resources in the link are pretty good so I wanted to bump it into the main feed. Lots of tutorials and sample code: http://blogs.msdn.com/tims/archive/2006/02/08/527850.aspx

I was able to significantly improve the performance of the USA 3D model by reducing the number of discrete 3D models being rendered in the vieport. Originally, I was using the approach in my 3D Tutorial, which involves creating a 3D triangle model for each triangle in the mesh. While this approach makes it very easy to build composite 3D models (by...

Early this morning I played around a bit with the 3D USA model and I wasn't happy at all with the performance. The performance appears to depend on how many discrete 3D geometries are loaded into the entire viewport. For example, when I increase the granularity step when I'm looping through latitude/longitude points then fewer points are used. Increasing the granularity makes the model perform faster when panning, zooming, and angling the camera. If I decrease the granularity step, more points are used, and the camera moves more slowly because the screen takes longer to re-draw. In...

Since all of the hard work with creating 3D geometries has already been done in my 3D Tutorial, it didn't take much work to obtain the cartographic data of the 50 states and plug it into the trackball model. Here are some screenshots (click on them for a larger image): View from above: See how thick, see how cool: View from below Perhaps a little bit of code will follow soon...

Yep, it's another skin for Kindohm.com. Feedback is welcomed. I just had to get another design out of my system :)

The next thing I want to accomplish in my demographics project is to build a nice clean 3D viewing UI. What I mean by that is that the user (me) should be able to easily pan, zoom, and change the viewing angle of the camera inside the 3D space. In my initial experimentation a few months ago I was using slider controls to accomplish this. It was a quick approach, but was annoying to use because I needed a slider for each direction or "degree of freedom" that I wanted to move. At minimum I needed six sliders - a...

My cartographic file parser is working the way I want it to now. There are four total files that describe states and counties for all 50 states, and two files for each state that describe cities and two files for each state that describe zip codes. I've parsed all of the state and county data, and have parsed 13 states worth of cities and zip codes. Those 14 states include Minnesota, Wisconsin, Michigan, North Dakota, South Dakota, Iowa, Montana, Idaho, Washington, Illinois, Missouri, Indiana, Ohio, and Nebraska. Some interesting stats so far: 21,018 unique boundaries have been...

The demographics project has been revived. In between attending to Eva and working on the basement, I've been digging in to code. I haven't actually gotten in to any WPF stuff yet - I've been focusing on parsing the cartographic files from the US census bureau. In my earlier experimentation with 3D in Avalon, I gave the cartographic data just barely enough attention to make things work. This time around, I want the data to be complete, which means parsing many, many files and having a faster parsing process. The files break down like this: Two files...

I downloaded some hands-on labs for WinFX yesterday and stumbled across some code to put video on rotating 3D surfaces: Click for a larger image Oh, what fun we'll have...

Late last night I fixed up my 3D tutorial for the new CTP release of WinFX. There really wasn't a lot to change, luckily. I also removed the tutorial from the confines of my blog engine (.Text) so that it can breathe more easily. The new tutorial is strictly content without navigation, eye candy, or constraints on content width. As a result I don't have to worry about the code snippets scrolling. Plus now it looks more "technical" :) Anyway, here it is: http://www.kindohm.com/technical/WPF3DTutorial.htm. This was the first time I've been back in WPF/Avalon in a while....

Maybe if there were 48 hours in an earth day I'd have more time: Write my own blog engine. I've been using .Text for about a year and a half to power this site. It's fast and reliable, and I love the skinning capabilities. But it's not perfect, and it's not valid XHTML 1.0 Transitional. There are some quirks about the posting options that I dislike, it doesn't support tagging, and there are some limitations to skinning. Explore the world of WPF. I'd just like to become more knowledgable about this technology in general. Revive my...

I picked up Bulletproof Web Design by Dan Cederholm this weekend. The book covers ways to deal with multiple browser types and evolving web sites by using CSS and XHTML. While skimming through it in the store I already learned a few new things, and was instantly hooked. Web design, page layouts, and CSS have always been an area of interest to me. I'm no graphic designer, but I've always enjoyed tackling an interesting web design regardless of the complexity or number of its images. Personally I'm not as interested in designing for multiple browsers...

posted @ Monday, January 23, 2006 8:25 AM | Feedback (4) |

My Halo2Basics.com site gets about 2000 hits a month, so I figured with all of these damn web sites that I've been launching I might as well take advantage of the traffic and make some coin. So, I subscribed to Google AdSense a few weeks ago and put some advertising on the H2 Basics site. So far I'm not to impressed. I've had one click for $0.06. But what's interesting is that the advertisements are kinda-sorta-relevant in a certain way. While I write this, these are the current ads on the site: Sniper Rifles - Wide...

Spread the word. Halo2NameGen.com, a Halo2 Gamertag generator, has been launched. Fear this: Mike's Halo 2 Gamertag is: DrunkenFreak You blaze through the game in a zen-like stupor and your battlefield skills are so crazy that your teammates don't recognize you. Permalink: http://www.halo2namegen.com/Default.aspx?name=Mike I'm still looking for more gamertag data, so if you have ideas or suggestions please let me know.

I'm close to officially launching a new website.  It's up and running, but I'm not going to officially publicize yet.  I need more data.  Specifically, I'm in need of ideas for XBox Live gamertags.  If you want you can help join the effort and list some of the best, coolest, funniest, or weirdest gamertags you've ever seen here.  Or just make some up.  Just leave a comment. 

posted @ Monday, January 09, 2006 8:15 AM | Feedback (3) |

My joy at finding a .Net Pervasive data provider is being crushed.  Their SDK is terrible - it's a PDF document.  It's not like they've written documentation that is presented better in PDF format either (instead of a HTML/chm format).  They're providing summaries of classes, code examples, and so on.  So why not just use a nice little tool called NDoc?  Maybe they had a good business reason to use PDF, but they're just pissing me off in the process. But what's really bothering me is that an entire namespace in the SDK is not documented (Pervasive.Data.SqlClient.Lna).  An exception of the...

My current development endeavors have brought me to the world of Pervasive, a Btrieve-based relational database back end. Pervasive ships with some generic ODBC drivers, but I just stumbled across a Pervasive ADO.Net Provider this morning: http://www.pervasive.com/developerzone/platforms/net.asp I'm sure that most of the developers out there who read my blog (all 1.5 of them) are drooling over this right now. Most developers have never heard of Pervasive, but maybe this will come in handy for someone years down the road.

Jason's post piqued my interest in how often an undesirable phrase reared its ugly head in an encoded string. So, I grabbed a Base36 encoder and went to work. My goal was to generate a Guid, encode it as Base36, then see if the encoded value contained a "bad word" [1]. I did this by running 10 repititions, and each repitition ran a loop 100,000 times. In each loop I generated the Guid, performed the encryption, then inspected the...

posted @ Monday, November 28, 2005 4:39 PM | Feedback (1) |

I recently heard another developer say that “management doesn't like agile development because it gives too much control and freedom to the developers”.  I really don't know if that statement was actually spoken by someone, but I couldn't get that line out of my head because it bugged me so much.  To me, it sounded like something that would come from someone that has pushed aside agile development without trying to understand it.  There is more than one agile development methodology out there, but most of my experience comes from XP.  Personally I don't buy in to all aspects of XP, but I...

posted @ Monday, November 28, 2005 8:43 AM | Feedback (0) |

Today I came across this error while working on an ASP.Net web project:The given assembly name or codebase, '[ASSEMBLY NAME]', was invalid Source File: c:\windows\microsoft.net\framework\v1.1.4322\Config\machine.config The error also contained the log of probing steps that .Net was using to find the dependency. For time's sake I won't paste all of it in I messed around forever re-referencing external dependencies and re-building the .Net solution trying to get this to work, but had no luck. Then a colleague asked when the problem started happening and what changed between when the project WAS working and when it stopped working. So then the gears started turning... Yesterday...

Look to the right.  Yeah.  It's cool and you know it.  At least you wish you had something like this on your website. I use the last.fm/Audioscrobbler plugin for WMP, and they make all kinds of XML/REST feeds available for user stats (example). I decided to throw my top 100 artists feed on the site just for fun. Now you know what I listen to all day. So when you see Winger get into the top 5, you know there's a bug somewhere.

I've posted a tutorial on creating 3D objects in Avalon: http://www.kindohm.com/technical/WPF3DTutorial.htm. It's complete with Mike's crash course in 3D graphics theory, code samples, and screenshots. One of the goals of the tutorial is to help 3D graphics novices (like me) past some of the fundamentals of 3D graphics theory. I had a hard time finding out any of the basics of the topic when I was looking into 3D in Avalon, and I thought it'd be good to help people gain that understanding more quickly than I did.

The tutorial is now permanently located at http://www.kindohm.com/technical/WPF3DTutorial.htm. Please update your bookmarks and referring links.

The new league begins...http://www.virtualpuck.com RSS:http://www.virtualpuck.com/rss.aspx

I extended the Demographics app to build out part of the twin cities metro area: Click to enlarge I didn't have to do much to the code other than create a new collection class that obtains the city boundaries of my choice. Included are these cities: Chaska, Chanhassen, Eden Prairie, Bloomington, Richfield, Edina, Eagan, Burnsville, Minnetonka, Hopkins, Maple Grove, Plymouth, Golden Valley, St. Louis Park, Minneapolis, St. Paul, Crystal, New Hope, Robbinsdale, Falcon Heights, St. Anthony, Roseville, Columbia Heights, New Brighton, Maplewood, Woodbury, Little Canada, Oakdale, Mendota Heights, South St. Paul, and North St. Paul. You can see in the image that...

posted @ Monday, July 11, 2005 9:14 PM | Feedback (4) |

Using Avalon, I was finally successful at rendering a 3D model of the state of Minnesota from geographic latitude and longitude points: I strugged with this for about a week. The real crux of the biscuit turned out to be how I was ordering the triangle vertices in the 3D mesh. Ordering Triangle Vertices I don't pretend to be an expert in rendering 3D geometries, but here's an explanation of what I learned. 3D meshes are made up of individual points (or vertices), and then many triangles from those points. For example, using the mesh viewer in the DirectX 9 SDK, you can...

posted @ Friday, July 08, 2005 9:14 AM | Feedback (6) |

I just wanted to post some screenies of some progress I've made on rendering and viewing geometries in 3D in Avalon. Eventually I will provide some code and write about what I learned about 3D meshes and triangle vertices, but for now it's just some screen shots. I basically experimented with drawing a polygon on a plane. I started with a simple octagon, but then decided to stretch out some of its vertices to see if I could render something more "unique" (e.g. like a state or city boundary). This first shot is an overhead view looking down on the polygon....

posted @ Friday, July 01, 2005 7:44 AM | Feedback (0) |

Last night I made more progress on drawing Minnesota geography.  I spiffed up the UI a bit to allow the user to pick the cities they want to include and also added some zoom/panning controls.  Right now everything is just with text boxes - ultimately I'd like to use sliders.  Below is a screenshot with some of the metro cities along with some outstate cities: Next I really want to start getting the zoom and panning functions to work. IW Kid gave me a few suggestions about how to tackle it. His suggestion was to draw the graphics on a "canvas"...

posted @ Thursday, June 30, 2005 7:57 AM | Feedback (0) |

Forget using CGI+.  If I go ahead with my Demographics idea I'm going to use Avalon.  I managed to spit this out last night in an Avalon app: The XAML for the page is very straightforward. There's a button, a text block to show some info, and a Canvas that holds the geometry: <Page x:Class="Demographics.Sandbox2.Page1" xmlns="http://schemas.microsoft.com/winfx/avalon/2005" xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005" Loaded="PageLoaded" > <StackPanel> <StackPanel> <Button Name="goButton" Click="GoButtonClicked"> <TextBlock TextContent="Go" /> </Button> </StackPanel> <DockPanel VerticalAlignment="Bottom"> <TextBlock Name="infoTextBlock" /> <Canvas Name="drawCanvas" /> ...

posted @ Wednesday, June 29, 2005 8:49 AM | Feedback (1) |

Before spending an hour or more wondering why databinding isn't working on a listbox, check to make sure that there is at least one record in the database.

posted @ Tuesday, June 28, 2005 2:19 PM | Feedback (3) |

This weekend I worked a little bit on my "Demographics" project (codenamed Demographics). At a high level, I want to see what I can do with 1) United States geographic data and 2) year 2000 US census data. Census data is available by state, zip code, city, etc, and the geographic data is available in the same. Add some GDI+ in there and you can connect the dots and see where I'm going with this... Anyway, in the first iteration I wanted to capture all of the geographic data for the state of Minnesota and get it into a SQL Server...

posted @ Monday, June 27, 2005 11:16 AM | Feedback (1) |

posted @ Friday, June 24, 2005 11:49 AM | Feedback (0) |

Suddenly I've immersed myself in a number of programming and website related tasks.  It's been a long time since I've wanted to stay hunched over my keyboard while I'm at home, but now it's like my inner-geek wants out and I'm letting it have its way because its been locked up for so long.  So as you've probably guessed by now, I've redesigned my website.  It's like clockwork.  About once every two months I get my mind set on updating the site and creating a new skin.  I've done it so many times now that it probably only takes me...

posted @ Friday, June 24, 2005 9:28 AM | Feedback (2) |

The Windows SharePoint Services (WSS) object model contains a SPWeb class that is used to obtain data about and perform actions on WSS websites. SPWeb has a couple of methods that allow you to get at files stored in sites: GetFile(string url) and GetFileAsString(string url). What the WSS SDK does NOT tell you is that you don't need an instance of SPWeb for the specific WSS website that contains the file you are looking