How you know you were a geek in the eighties

  1. You remember when AD&D went to Second Edition, and were ticked off about it.
  2. You know the Commodore 64 bootup sequence.
  3. Wargames was your favorite movie.
  4. After watching Wargames, you dialed into Delta's system and ordered tickets to Paris.
  5. You subscribed to Dragon Magazine and Boy's Life.
  6. You listened to Dr. Demento.
  7. There are three bins of Space Legos in your basement.
  8. There are CDs in your collection that are twenty years old.
  9. You ran a BBS from your TRS 80.
  10. You remember Donkey Kong's four screens, and know who Jumpman is now.
  11. Johnny Five - scaring the SHIT outta me since 1986.
  12. There is a a Mac Classic in your basement you have been meaning to turn into a Macquarium.
  13. You know at least one method for bypassing physical copy protection on floppy disks.
  14. After the Challanger disaster, you were the one that explained to everyone exactly what happened.
  15. You still have your big fuzzy marching band hat.
  16. You have a working IBM Luggable in the basement.
  17. If you STILL jump after the phones ring because of Lawnmower Man.

Describing one-to-many relationships in M

In M you can describe values and use MGraph to infer a data model.  for instance, I can tell it a little data, like this:

module TheStates
  States  => { "Ohio", "Indiana", "Kentucky" };

… and get back the SQL code for my inferred table:

set xact_abort on;

begin transaction;

set ansi_nulls on;

if not exists 
    select *
    from [sys].[schemas]
    where [name] = N'TheStates'
    execute [sp_executesql] N'create schema [TheStates]';

create table [TheStates].[States]
    [Item] nvarchar(max) not null

insert into [TheStates].[States] ([Item])
    values (N'Ohio'),

commit transaction;

The problem is with a real world model, say a collection of states that represents a route.  if you try to model that with an extent, like this:

module Proto
  Representative =>
    Id => "4";
    Name => "Bill";
    States  => { "Ohio", "Indiana", "Kentucky" };
  } where identity Id;

Well, at least it is a Not Yet Implemented error.

untitled3  4,3-8,22    Error   M3999   Not yet implemented: Initializing a collection with an expression that yields a collection (Microsoft.M.SemanticGraph.FromExpressionSymbol)

Still, without something that straightforward implemented, it is tough to call this a modeling language for data.  Hopefully it is in the works soon.

CodeMash v2.0.1.0. Burndown

Codemash 2010 is in the books, and once again it has proved that sub-1000 attendee regional conferences can provide at least as good – if not a better – experience than the PDCs and the TechEds of the world.  Every single attendee that I spoke with was blown away by the speakers, the open spaces, the staff, the location, the food and everything else.  With the exception of the local area network and AT&Ts poor showing signal-wise, I don’t think I heard a single complaint.

It was the best one yet, and I believe they will outdo themselves next year as well.  It’s a great con, and I think all of the people who put it together: Jim Holmes, Brian H. Prince and Jason Gilmore, along with the speaker board, the vendors and the countless volunteers.  It was a great team effort.

Honestly, I didn’t go to too many sessions this year.  I did manage to go do the Ruby Koans with EdgeCase, and that was eye opening.  Not only did I get started learning a new language, I also learned a fantastic way to teach a new language.  My other precompiler session was with Mary Poppendieck, on the topic of leadership and building sustainable competency in an IT organization.  She knows her stuff, and I think I found the mentor I needed going forward with the Technical Evangelist project at ICC.

Mary Poppendieck at CodeMash

The breakout sessions were not as mind blowing as I thought they would be.  There was a distinct shift in the presenters this year, with many fewer local speakers, and a lot of names I didn’t know, but with impressive titles.  I don’t think any one company had more than one presenter, except EdgeCase, who presented a remarkable SEVEN TIMES through the con.  Those guys are smart, but SEVEN TIMES?  I just don’t know.

Honesty, the quality of breakouts that I went to was about the same.  Rob Gillen had a very well delivered presentation on using Azure for parsing weather data, and that was really eye opening.  Other than that, though, it seemed to be a lot of the same old stuff.  Nothing was bad, mind you, just a little less inspiring than I thought given the 500 presentations that they had to pick from.

<sigh> No matter how I say that it just sounds bad.  I was really happy with the breakouts.  There, I said it.  I just thought there would be more ANAZING stuff.

Anyway, I was really honored to be asked to speak this year.  I did my Economics of Cloud Computing presentation, and it was really well received.  Many people stopped me afterward and mentioned how they liked the information (and then there was Pete Gordon, who told me my math was wrong.)


Anyway, I had the classic stupid technical problem at the beginning, but a reboot fixed it, and everyone waited patiently.  I could have used the time though – I had to rush through the cloud breakdown a little.  It was a bummer.  Oh:

Here is the link to the Economics of Cloud Computing Presentation.

Here is the link to the orginal Economics of Cloud Computing paper.

Here is my new page.  Go rate me – since I am not sure if evals were actually taken.

There is a lot to be said about holding a developer conference at the largest indoor waterpark in the country, too.  Aside from that there was a game room set up by Jeff Blankenburg, KidsMash, and this huge ball cannon tree root air swoosh thingie:

2010-01-13 19.15.03

A good time was had by all.

econofcloud.pptx (7.08 mb)

Christmas came (a day) early.

Went and got the mail and I was SO VERY happy to see my new picks from LockNewbie.  I got a short hook and a bogata to go with my long feeler, and replaced my existing short hook and half diamond  in my carry set.  I am still going to keep my set of bogata from Rai, because how could I not??


This should about do it for me, on a day to day carry-and-practice set.  I can get into a Master 140 in about 20 seconds using the long feeler and my custom tensioner.  Rai’s bogatas will get me into a lock with no security pins in under ten seconds usually. 

The bogata/short hook combo seems to be a great combination for spool and mushroom pins.  They have the same feel, so I can start with the handled bogata to get a false set, and then move to the VERY delicate short hook to pop the lock.

I got Gabrielle a bogata and a ball feeler too – it should work well with her picking style.  And they are RED.  All in all, very happy.

Get started modeling in ‘M’

Well, if you went to PDC and did the thing I always do, which is go to every talk that lists Don Box as a speaker, then you probably heard about SQ!L Modeling.  I don’t care about the SQL part – SQL is a database as far as I am concerned – it is an implementation detail.  As a software architect, though, I am very interested in Modeling.

So I get the bits and install them.  Great.  I have Quadrant as a Start Menu item, but Quadrant is Access.  Not interested (for this anyway).  I want to tell Visual Studio how I need my software built.  I need M.

The New Project Dialog has a Oslo Library that might be interesting.  I thought they had nixed Oslo though?  What’s up with that?  Anyway, the description says “A project for creating Oslo Flavored CSharp Library” whatever that means.  I just want to design software, people.  I don’t make ice cream.


I’ll go ahead and model SHARP, my event system, because I know that system well and have been modeling it for years.  To start, I name the Oslo Library SharpLibrary.  The resultant code is unusual, but it is a new language after all.

module SharpLibrary
    type Model
        Id : Integer32 => AutoNumber();
        Field : Integer32;
    Modelsamples : {Model*} where identity Id;

Don’t let the ‘module’ statement fool you – this isn’t a RAD application development language that will remain nameless.  M is a language that will model your middle tier.  Let’s model.  The goal is to build the simple SHARP model, which I used in VB for Dummies and the C# All In One.


I will start with the Conference entity, because it is sorta the middle of the system.  ID is as the example, but I want to add a Title and Description.  First thing is that M needs intellisense.  What’s a string again? String?  Varchar?  Oh, no of course it is Text.  Of course.

More later!

Using the Entity Framework POCO Adapter

Not all of us get to use EF 4.0 like the cool kids.  Sometimes, you are on a project with a state government – for example – who won’t use a Microsoft product before its first service pack, much less Beta 2.  You are stuck with a product that everyone including Microsoft has agreed is a substandard effort – EF 3.5.

One of the big complaints about EF 3.5 is that the domain mode it provides is persistence aware.  This means that rather than just asking the framework for a class, say People, and getting a Person object back, you get a framework object with a bunch of extra database code in it that breaks the tenants of encapsulation.  At first blush, this seems like something that only people at MIT care about, but the fact is that when you change something about your database, you have to change all of these objects, which is a bad thing.

Anyway. I was tasked with finding a data layer technology for this big project.  I looked at NHibernate, and SubSonic, and a few others.  I looked at code generators like LLBLGen.  I ended up with EF 3.5 because I know I am going to want to go to EF 4 and there will be less recoding if I start with EF 3.5.  That’s basically it.

I still need persistence ignorant objects, though.  Enter the POCO Adapter.  This project is on, and it written by people knowledgeable about how EF works.  It has a code generator that takes the EDMS file and generates Plain Old CLR Classes, and a customizable transport  layer.  Looks like it will work.

Getting the POCO Adapter and getting started

The EF POCP Adapter is available from   It comes in both C# and VB, and has sample code and texts using Northwind.  The code generator compiles into a console application, and the adapter itself is just a strongly typed class file.

I started things out by generating an EDMX of SHARP, my sample conference management system.


Then I compiled the EFPocoAdapter project and was rolling.

Generating the domain model

I started by running the commandline utility on my EDMX file for SHARP.

EFPocoClassGen /inedmx:"C:\Users\Bill\Documents\Visual Studio 2008\Projects\SharpEdm\SharpEdm\SHARP
.edmx"  /outputfile:c:\sharp.cs

I added the resultant sharp.cs file to my project, referenced the EFPocoAdapter project in the solution,. and set up a project reference to clear up references to EFPopoAdapter and EFPopoAdapter.Classes.  Wow, it really does take a loong time for that dialog to come up.  Anyway, then I compiled.

Ran into a weird naming problem.  All of the generic PocoAdapterBase instances referenced the ConferenceDbModel, which is the namespace for the EDMX classes, and not SharpEdm, which was the actual class.  After discovering this, I discovered for the 10,000th time that it is a good idea to read the documentation first.  Doing that, I learned that there are some options I really should set.

  • /ref sets the compiled DLL that has the classes that I want to map to.  All I did was compile the EDMX file and use that DLL.
  • /map helped with my naming issue.

So the final command looked like this:

/inedmx:"C:\Users\Bill\Documents\Visual Studio 2008\Projects\SharpEdm\SharpEdm\SHARP.edmx" 
  /ref:"C:\Users\Bill\Documents\Visual Studio 2008\Projects\SharpEdm\SharpEdm\bin\Debug\SharpEdm.dll"

The tools it left me are pretty straightforward.  here is a look at them:


In the next post I’ll take a look at using them in this context.

Random thoughts about M

I am working on the table of contents for my new book on designing software with SQL Server Modeling, or TheModelingSystemFormerlyKnownAsOslo.  There is a lot to be shared, but TOCs are kinda boring.  I thought I would use a post to fill out any random thoughts.

I think I am going to break the book into three parts.  First, some Microsoft-centric bits about modeling in general.  Second, a detailed look at M.  Finally, we are gonna build an app.  I want to make this thing functional.  If I can't build real, usable software with it and make my life easier, then I don't want it, and I don't want you to use it.  Proves how much I think of the SQL Modeling team if I am writing a book on it, huh?

Anyway.  The tl;dr on M is that is eats examples and poops your database AND your POCOs.  If they eventually get to the point where complex examples are handles gracefully, then we might have something here.

I am still not sold on Quadrant.  They need to stop showing SQL Server table level examples.  That's.  Not.  The.  Point.  If I can't gain visibility into my AD and my file structure and my partner's accounting system, I'll just use Crystal Reports or Query Analyzer.

Most people don't understand that we have been given unprecedented access into a technology that probably won't be ready for prime time for a couple of years.  M is rough.  Quadrant is rough.  There is a lot of SCOPE work to do, not to mention a little coding.  This concept is just starting to find itself.  There are technologies that SSM depends on that haven't been built yet.  Have a little patience, people.

Now, this  Linq to M idea is a very interesting look into the thinking of the SSM team. We describe something in M.  We upload to the repository.  We can 'query' the example in C# with Linq.  Great.  Are we ever going to use M to move REAL data, rather than example data?  No?  Then how is this different from Linq to SQL?  It isn't?  Oh, OK.

Generally, though, this is something I have been saying since my "Web Design With The End in Mind" article back in 1999.  The data is the application.  If you understand the behavior of the data - which you somehow must store and business rules (or metadata) then your application is done. Skin it and go get a beer.

Wow, Shawn Wildermuth's article on Textual DSLs is really good.  Why haven't I seen this?  I thought he was just a UI geek.  Color me impressed.

Sorry this is so stream-of-consciousness.  It is late and this cough is keeping me from sleeping.

I think that SQL Server Modeling has the potential to dramatically change how Microsoft architects design software for clients.  I think it has the potential to improve design too, by making good, principled design part of the fabric rather than a documented rule.  I really, really wish they hadn't pinned it to SQL Server, but I guess I get it.  The data is the application.  Tha'ts why I have called it the Data Driven Web for fifteen years.


VB6, VB.NET and dynamic typing

A recent reader emailed to wax poignant about VB6, and ask about dynamic typing – among other things – in VB.NET.  although I feel that static typing has a more firmly established place than ever in software development, I commiserated with him in this response:

A lot of people agree with you.  There is even a well-established petition at that states these and a lot of other problems with VB.NET, and the .NET Framework in general.

However, you have to remember that VB.NET is a language, and VB6 is a program, language and framework all in one.  As I pointed out in Chapter 1, they are designed to do different things.  A lot of the things that you could do in VB6 are considered bad practice now, due to scalability and other issues, although many are coming back into vogue. 

For instance, you point out the Variant issue.  What you are saying here is that VB6 is dynamically typed and VB.NET is strongly typed.  Coding for a strongly typed system is a lot slower than for a dynamically typed system.  You will, however, have a lot fewer errors with a statically typed system because any typing issues will usually be caught at compile time.

I have always found it interesting that many community members belittle VB6 for being a 'hack' out of one side of their mouth, and then extol the speed and ease of Ruby out of the other side of their mouth, never realizing that the dynamic typing system is a common defining characteristic of both 'languages'. 

I should add that dynamic typing is coming back in VB10 (as it is in C# 4.0) with the dynamic language runtime.  Hopefully that will return some of the flexibility to the language that you are looking for.

Blocking social networking at the firewall

My current client has blocked Twitter and Live Mesh at the firewall.  At what point are organizations going to realize that social networking is beneficial to project progress?  Now, I can no longer access my network of peers (well, I "can" but they are trying to prevent me), which has already provided me with many leads, links and ideas related to making this project better.  Now I can no longer access my repository of project files, where I am getting all of my templates and reference documentation.

What is the point?  Are they trying to prevent people from wasting time?  How about blocking YouTube?  How about uninstalling Solitare?  How about not providing access to the external internet at all?  There are a lot of clericals here, and many of them are temps, so why don't you just lock everything down?  If that is too draconion, how about two firewall profiles, one for developers and another for clericals?

This fear of the Internet is remarkable in this day and age.  Watching organizations (especially government organizations) try to bridge the gap of providing free access to information and keeping the temps from surfing porn is very frustrating for me.

Syncing podcasts to a cheap MP3 player

Yesterday I went to Best Buy to get a Zune, and saved myself $200 and bought a Sony Walkman.  Why?  It does the same thing (plays music) and it has a Mini USB port rather than some useless fancy custom job that requires me to carry yet ANOTHER cable. 

You see, I never wanted an MP3 player.  I just want to use my HTC Touch Diamond.  But using it as a media player is heavily balanced with battery life.  In general, if I want to be able to make a call at 3PM, I’d better not listed to music at 10AM.  Convergence will work when we have leeetle nuclear reactors for our cell phones.  But that is a post for another day.

The one thing I wanted to be able to do with the Zune was subscribe to podcasts.  My pain is that subscribing to podcasts minus a crappy cable interface is not worth $200 to me.  “The Sony will do fine, and I will just figure out the podcast thing,” I thought.

Well, with a lot of help from Michael Young’s blog, which lead me to Jake Ludington’s blog, I have a working model that isn’t perfect but it seems to be working.  This updates those two entries for Win 7, IE8 and the latest Windows Media Player – is it 12?  I’m not sure.  Anyway, here goes:

1) First step is to subscribe to the podcast with IE 8.  Navigate to the website of a page with a feed you would like to subscribe to (like and click the View Feeds for this Page button in IE8.


2) Click on the “Subscribe to this feed” link on the RSS viewer page.


3) When you have subscribed to everything you are looking for, click on the Favorites button, and then the Feeds tab.  I made a Podcasts folder there to keep them organized.


4) Right click on the feed and select properties.  Check the Automatically Download Attached Files checkbox.


5) As it turns out, IE8 puts all the attachments from feeds in subfolders inside one temporary internet files folder.  If you wait until IE gets some of the files and click the View Files button then go up one in the directory, you can see what I mean:


6) On my machine, that folder is C:\Users\Bill\AppData\Local\Microsoft\Windows\Temporary Internet Files\Enclosure.  YMMV.  Might want to put the path on your clipboard, you’ll use it a lot.

7) Go to Windows Media Player (henceforth WMP).

8) Click on Organize / Manage Libraries / Music.


9) Click the Add button, and paste the path from Step 5.


10) Click Include Folder, then click OK.

11) Click the little arrow next to Create Playlist and select Create Auto Playlist.


12) Name the new playlist Podcasts.


13) Right click on the new auto play list and select Edit.


14) Click the green plus sign under Music in my Library, scroll to the bottom of the list, and select More.


15) In the Choose a filter dialog, select File Name.


16) Click the Click to Set link, and paste in the path you found back in step 5.


17) Click Ok, then go have a cup of coffee while everything updates.

18) When you get back, plug in your MP3 player.  I have the Sony Walkman E Series.

19) Windows Media Player will open the Sync tab.  Drag the Podcasts playlist to the Sync pane.


20) Click Sync.


It was a pain, but now it is set up, and I saved $200, plus probably the Zune Pass and 35 accessories I woulda bought. And I think this works better.  I’ll have  standard process where I bring the player downstairs, plug it in to charge and sync, then come down in the morning to get it.  Next post, I might ever write a PowerShell script that automatically syncs when I plug it in.  Hope this helps someone!

Bill Sempf

Husband. Father. Pentester. Secure software composer. Brewer. Lockpicker. Ninja. Insurrectionist. Lumberjack. All words that have been used to describe me recently. I help people write more secure software.


profile for Bill Sempf on Stack Exchange, a network of free, community-driven Q&A sites