Rockford Lhotka's Blog

Home | | CSLA .NET

 Thursday, 20 December 2012

A colleague of mine at Magenic recently posted on how to deploy and debug a WinRT app on a Surface RT.

Another alternative is to install the app onto the Surface device via PowerShell. This won’t attach the debugger, but is often an appropriate solution for people who are just testing the app (QA testers, colleagues willing to provide feedback, etc.).

This is a multi-step process. At a high level it goes like this:

  1. Developer packages the WinRT app to a folder on their hard drive, then puts the package on a network share or USB key, etc.
  2. Tester unlocks PowerShell on their device (this is a one-time thing)
  3. Tester gets the WinRT app package and runs a PowerShell script to install the app on their device

Creating the Package

The developer needs to create a distributable package for the app. This is done by right-clicking on the WinRT project in the Visual Studio solution explorer, and choosing Store –> Create App Packages.


This brings up the Create App Package wizard. The first question is whether you want to deploy the the store, and the answer in this case is No.

Next, you’ll be asked where to create the package, how to create the package version number (different from the app version number) and what platforms to target.


The Neutral architecture in Release (Any CPU) allows testing on Intel and ARM devices.

When the Create button is clicked, the project is built and packaged, with the results placed in the specified folder.


The top level folder contains an appxupload file that you can safely ignore (it is used for uploads to the store). It also contains a sub-folder with the actual app package.


These are the files you must make available to the tester. You can put these files on a network share, a USB key, a SkyDrive folder, or any other location where the tester can gain access. The Add-AppDevPackage.ps1 file is the PowerShell script the tester will run to install the app.

Unlocking PowerShell

The tester’s device must be able to execute PowerShell scripts before they can install the app. By default PowerShell has security settings that prevent scripts from executing. This TechNet article discusses running PowerShell scripts. In summary, you need to open PowerShell as Admin and run this command:

Set-ExecutionPolicy unrestricted

Be aware that this allows execution of any script, so you do assume some risk by enabling this policy.

Once this has been done your test device is now able to install WinRT apps by executing the PowerShell script generated by Visual Studio.

Installing the App

On the test device you must have access to the contents of the package folder created by the developer in Visual Studio. You might get those files from a network share, a USB key, or other location.

Simply execute the Add-AppDevPackage.ps1 file in PowerShell to install the app.

The script will ask permission to run.


If this device does not have a side-loading unlock key (MAK or developer key), you will be asked if you want to get a developer key. You should answer yes and walk through the wizard to get a developer key for this device. This step will require you to enter your Microsoft Account email address and password. The resulting key will expire after a short period of time (currently three months).

The PowerShell script will then ask for permission to install the certificate for the app. If you’ve already installed the certificate (perhaps you are installing a newer version of the same app) the script will skip this step.



Once the certificate is installed, the script will install the WinRT app itself.


At this point the WinRT app is installed and its tile should appear on the start screen along with all other apps installed on this device.

The user may now run the app like any other app.

Once the developer key for this device expires the app will stop working. Obviously the intent of this installation approach isn’t for the user to run the app forever, but rather so they can test it and provide feedback during the development process.

Thursday, 20 December 2012 12:06:59 (Central Standard Time, UTC-06:00)  #    Disclaimer
 Wednesday, 19 December 2012

This is something I use from time to time, and I thought I’d post it here so I can more easily find it next time I need the code.

This is an IDataReader implementation that reads in comma-separated value files. Probably incomplete, but it works well in the scenarios where I’ve needed it.

using System;
using System.Data;
using System.IO;

namespace Csla.Data
  public class CsvDataReader : IDataReader, IDisposable
    private StreamReader _file;
    private string[] _headers;
    private string[] _line;

    public CsvDataReader(string filePath)
      _file = File.OpenText(filePath);
      _headers = _line;

    public void Close()
      _file = null;

    public int Depth
      get { throw new NotImplementedException(); }

    public DataTable GetSchemaTable()
      throw new NotImplementedException();

    public bool IsClosed
      get { return _file == null; }

    public bool NextResult()
      return false;

    public bool Read()
      var result = !_file.EndOfStream;
      if (result)
        _line = _file.ReadLine().Split(',');
      return result;

    public int RecordsAffected
      get { throw new NotImplementedException(); }

    public void Dispose()
      if (_file != null)
        _file = null;

    public int FieldCount
      get { return _headers.Length; }

    public bool GetBoolean(int i)
      return Boolean.Parse(_line[i]);

    public byte GetByte(int i)
      return Byte.Parse(_line[i]);

    public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
      throw new NotImplementedException();

    public char GetChar(int i)
      return Char.Parse(_line[i]);

    public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
      throw new NotImplementedException();

    public IDataReader GetData(int i)
      throw new NotImplementedException();

    public string GetDataTypeName(int i)
      throw new NotImplementedException();

    public DateTime GetDateTime(int i)
      return DateTime.Parse(_line[i]);

    public decimal GetDecimal(int i)
      return Decimal.Parse(_line[i]);

    public double GetDouble(int i)
      return Double.Parse(_line[i]);

    public Type GetFieldType(int i)
      throw new NotImplementedException();

    public float GetFloat(int i)
      return float.Parse(_line[i]);

    public Guid GetGuid(int i)
      return Guid.Parse(_line[i]);

    public short GetInt16(int i)
      return Int16.Parse(_line[i]);

    public int GetInt32(int i)
      return Int32.Parse(_line[i]);

    public long GetInt64(int i)
      return Int64.Parse(_line[i]);

    public string GetName(int i)
      return _headers[i];

    public int GetOrdinal(string name)
      int result = -1;
      for (int i = 0; i < _headers.Length; i++)
        if (_headers[i] == name)
          result = i;
      return result;

    public string GetString(int i)
      return _line[i];

    public object GetValue(int i)
      return _line[i];

    public int GetValues(object[] values)
      throw new NotImplementedException();

    public bool IsDBNull(int i)
      return string.IsNullOrWhiteSpace(_line[i]);

    public object this[string name]
      get { return _line[GetOrdinal(name)]; }

    public object this[int i]
      get { return GetValue(i); }
Wednesday, 19 December 2012 22:00:22 (Central Standard Time, UTC-06:00)  #    Disclaimer
 Friday, 07 December 2012

The web site is apparently now gone, merged into the broader ecosystem (where it belonged in the first place imo):

As we’ve known now for a long time, Silverlight is “dead”. It is in support mode and will be for a decade.

Just like Windows Forms has been since 2005, and WPF is now as well (do you really think Microsoft is going to divert money from WinRT to do anything with WPF at this point??? If so I’ve got this beachfront property for sale…).

As an aside, ASP.NET Web Forms also “died” in 2005, but recently got a major infusion of money in .NET 4.5 – showing that even a “dead” technology can receive a big cash investment sometimes – though it still isn’t clear that this will be enough to breath any new life into Web Forms for most organizations. I suspect it is more likely that this recent investment will just allow organizations with massive Web Forms sites to keep them limping along for another 5-10 years.

If a technology is defined as “dead” when its vendor stops enhancing it and starts maintaining it while they put most of their money into the future, then I must say that I’ve spent pretty much my entire ~25 year career working on dead technologies. And it has been fun! Smile

Although some of us tech geeks like to jump to the next potential upcoming thing, the people who actually fund software projects rarely want to accept that kind of risk. They generally prefer to build applications on stable technology. Most stable technology is “dead” or “dying” based on this idea of “live” technology being rapidly changing and evolving.

Obviously there’s a fine line here.

Target stable technology that is too old and you really are in trouble. Windows Forms is an example of this, because its underlying technology has no migration path to a WinRT future. Although a lot of organizations have massive investments in Windows Forms, I would hope that they’d shy away from starting new development on this extremely stable, but now too old, technology.

Target stable technology that is new, but old enough to be stable and life is generally pretty good. WPF and Silverlight (for smart clients, not for cross-platform RIA) are examples of this. The reason is that these technologies (especially Silverlight) have a good migration story to a WinRT future. A lot of organizations are investing in WPF, and that’s good. But I’d be shocked if Microsoft invests anything in WPF going forward – its future is the one Windows Forms has enjoyed since 2005 – stable maintenance of the technology. Perfect for building critical business apps. Organizations also have large investments in Silverlight, and as long as the intent was smart client development (not cross-platform RIA) it seems to me that they are in the exact same place as everyone using WPF. Arguably better, because Silverlight is much closer to WinRT than WPF.

If you are using Silverlight for cross-platform rich web development, then I do agree that the news is not good. The current alternative appears to be HTML 5, though it is also clear that this is an expensive alternative with an unsure future. Just like every other silver bullet to write once and run anywhere, I think you have to go into such a venture expecting a lot of cost and pain. There’s no widely successful example in the history of computing that indicates otherwise…

The final option is to target “live” technologies. You know, the ones where vendors are dumping huge amounts of money, and where the technology and platform are changing rapidly. Things like HTML 5 and WinRT are examples of this. As a tech geek I love it when organizations want to do this sort of thing, because the challenge is high and we all get to learn a lot of new stuff. Of course the development costs are also quite high because we’re getting paid to learn this new stuff. And the overall costs for the software are high because the technology/platform isn’t stable and the app probably needs to be rewritten (in whole or part) every few months to deal with platform changes.

Some organizations are willing to accept the costs and inconvenience associated with using “live” technologies. But most organizations don’t have the time or money or risk tolerance, and are far better off targeting “dead” technologies like WPF and Silverlight. They just need to be careful to have strategic migration plans so they can get off those technologies before they reach the point of where Windows Forms is today.

Friday, 07 December 2012 11:23:33 (Central Standard Time, UTC-06:00)  #    Disclaimer
 Sunday, 25 November 2012

There’ve been a variety of articles and blog posts about the Microsoft Surface, with people expressing pleasure or disappointment as they’ve played with the device.

I thought I’d share my experience with the Surface RT, having now used it for a few weeks.

First though, it is important to understand that I’ve been running Windows 8 full time for months on my laptop and on my Intel-based tablet. When I started running Win8 I consciously chose not to run any of those apps to make Win8 act more like Win7. I never tried to make WinXP look like Win98, or Win7 look like WinXP, so why would I try to make Win8 look like an obsolete OS? Embrace the new, that’s my view!

Also, it is important to understand that I had an iPad at the beginning. That was comparable to the Surface, in that there were basically no iPad apps – just the ability to run iPhone apps on the iPad, which was a really lame experience. So my iPad experience was that the device was reasonable for web browsing and limited entertainment, but had no practical value at all – because it had no Office, or Lync, or other useful apps. I fully appreciate that now, years later, the iPad does have useful apps and can be useful for something other than entertainment and games. But it is important (I think) to appreciate that my iPad experience is directly analogous to my Surface experience – I used both at the start of their existence. (as an aside, I gave my iPad to my wife, because I saw no reason to lug around another entertainment device as I travel)

Given that background, I’ll start by saying that I use my Surface RT every day. A lot. And I like it. I do also find it frustrating at times.

I find it useful for web browsing, entertainment, and productivity.

From an entertainment perspective, it has a bunch of games, it has Netflix and Hulu and Xbox music/video. And it browses the web, which is also entertainment. The only thing I’m missing is Amazon streaming video, which is Amazon’s loss in terms of competing with Netflix/Hulu, so they better get a WinRT app out ASAP or they’ll probably lose me as a Prime customer. Not a customer totally though, because I’m a Kindle addict and occasionally use the Kindle app on the Surface. I still prefer my Kindle Touch though, because eInk is way superior to the shiny-screened Surface or iPad.

From a productive web browsing perspective I find IE10 to be just fine. I am able to use all the sites I need for work, including, SharePoint, yammer, skydrive, Google drive, etc. The browsing experience is generally fast enough to be pleasant, with the exception of yammer’s text editing where they run really intensive js scripts for every keystroke. I haven’t tried their site on the iPad, but I suspect it is laggy there too due to this intense use of scripting.

In terms of pure productivity, the Surface is pretty good. I use Word and Excel pretty much daily, reading and editing documents from SkyDrive and collaborating with colleagues on projects. Lync and Skype both work well for telecom (which is important because Magenic’s entire “phone system” is Lync). I’ve used PowerPoint a little, but generally find editing presentations to be easier when using a full-size keyboard/mouse and my big monitors on my main computer. Using Word and Excel on the Surface (with its keyboard) is perfectly fine though, and I use those apps a lot.

I also use OneNote a lot. Much of my life exists in Outlook and OneNote. As a result the Surface provides me with access to much of my life through OneNote. I use the WinRT app, and I’m not sure I’ve even run the OneNote app from Office on my Surface.

The apps I have running on every one of my Win8 devices include:

  • Office
  • OneNote for WinRT
  • Tweetro
  • Skype
  • Lync
  • Feed Reader
  • Remote desktop
  • News/Weather/Stocks
  • Xbox Music/Video
  • Netflix
  • Hulu
  • Youtube player
  • Khan Academy
  • Calc
  • File Manager
  • TED Talks HD
  • All My Storage (at least until there’s a real DropBox app)
  • Bing

What is missing, and this is a big hole for me, is Outlook. The email client in Win8 is pretty lame. Perhaps adequate for casual email use, but not remotely adequate for productivity users. It has poor calendar integration, no Lync integration, no flagging of emails. It just isn’t even close to Outlook. Similarly the Calendar app on Win8 is lame. Well, it is worse than lame – it is really hard to read or use. Again, it also has no Lync integration and is largely useless for ‘real work’. Although I do use both the email and calendar apps, the experience is frustrating at best.

Similarly, the WinRT Lync app doesn’t compare to the real Lync client on an Intel machine. It is a limited subset of functionality. Fine for making and receiving calls, but extremely poor for collaboration scenarios where you need to share your screen.

I do wish that the SkyDrive app supported interaction with shared folders. When I’m collaborating with people on projects we often use shared folders in SkyDrive, but the SkyDrive app for WinRT doesn’t understand that concept, forcing me to drop into the browser to access those documents.

Finally, there is a general lack of apps in the Microsoft Store. This is directly comparable to my iPad experience (remember, at the start of the iPad’s existence) – with the notable exception that Surface comes with Office, so the single biggest set of apps I need are available right now on the Surface, unlike with the iPad (even today there’s no actual Office there, nor the amazingly smooth integration with SkyDrive).

For me, the big missing apps in WinRT include:

  • Outlook
  • Full featured Lync
  • DropBox
  • Yammer
  • TripIt
  • Amazon streaming video
  • Quicken

In short, at this comparable point in time with the iPad I gave the device away because it was just more weight to carry for little value. But I find my Surface RT continually valuable and have no plan to stop using it. The fact that it has Office and that it smoothly integrates into the SkyDrive ecosystem along with my desktop, laptop, and phone (WP8) makes it incredibly useful. I move seamlessly between my various devices, able to view and edit my documents regardless of where I am or what size screen I’m using.

So yes, I really like my Surface RT. There’s some frustration, but not nearly as much as when I was a month into using the iPad.

I have high hopes for Windows 8, WinRT, and Surface (and similar devices).

Sunday, 25 November 2012 11:48:20 (Central Standard Time, UTC-06:00)  #    Disclaimer
 Thursday, 15 November 2012

At a .NET Rocks event a few weeks ago an attendee asked if there would be some add-on to Windows 7 that allowed running WinRT apps.

My answer: Yes! It is called Windows 8  :)

Thursday, 15 November 2012 10:57:19 (Central Standard Time, UTC-06:00)  #    Disclaimer
 Monday, 12 November 2012

Stephen Sinofsky’s departure from Microsoft was rather unexpected, but not unpleasant news, at least from my perspective as a business developer.

Before I explain that, let me say that I really love Windows 7, and feel that it is the best version of Windows ever released. I also really like Windows 8, and have high hopes for its future. These successes are to Sinofsky’s credit to be sure.

As a business developer however, I have been extremely disappointed in Microsoft over the past couple years as Sinofsky ‘flexed his muscles’ within the organization.

Enterprises require predictability and some reasonable level of transparency. Microsoft provided neither of these over the past couple of years. The complete ‘blanket of silence’ surrounding anything to do with Windows 8 was stifling. As a result people at Microsoft were unable to talk about anything useful at all for an extremely long time. The future of .NET, Visual Studio, Blend, and many other key developer technologies became completely opaque.

As a result, many organizations developed strategies to move their business development away from dependencies on Microsoft, at least in terms of any client software development.

If there was any ray of hope over the past couple years, it was in the server and cloud space. This is where all the best known developer advocates inside Microsoft moved to, if they stayed at Microsoft at all. As a result, many organizations felt comfortable using ASP.NET and other server-side technologies, but generally started assuming Windows would no longer be a viable target for client-side software.

Obviously this is horrible for Microsoft, and yet it is a direct result of Sinofsky’s influence on the company.

Even today the story around deployment of business applications to the WinRT platform is at best incomplete, and I think is more accurately described as non-existent. Sinofsky’s apparently dismissive attitude toward anything outside the consumer space has left Microsoft increasingly irrelevant to anyone considering building smart client applications.

In short, the one true stronghold where Windows is currently dominant has been largely abandoned by Microsoft, effectively pushing us all toward building HTML 5 cross-platform apps that don’t rely on Windows at all.

Clearly this is one of the primary areas that Sinofsky’s successor must address and correct – unless Microsoft really does intend to abdicate the business client to commodity browser-based devices (can you say Chromebook?).

Personally, and based on no knowledge of the new people in charge, I am hopeful that they will restore some level of predictability and transparency to the Windows platform and the related development platform. This will help restore some confidence around the idea of building applications for Windows in the small, medium, and enterprise spaces. And I am hopeful that they’ll develop a real strategy and mechanism for deploying business applications to the WinRT platform so Windows 8 can become relevant to more than just the consumer space.

All that said, and for all my criticisms of Sinofsky’s brutal blanket of silence and alienation of the developer community inside and outside Microsoft, he really did something that had to be done – reimagine Windows to bring it into the future. Windows 8 and WinRT really might be the future of smart client development for most organizations.

The foundation is there, and it is now up to his successors to make it viable.

Monday, 12 November 2012 22:32:14 (Central Standard Time, UTC-06:00)  #    Disclaimer
 Sunday, 28 October 2012

I am of the opinion that is a criminal organization.

In 2008 my wife decided to give them a try with their paid service. Every year since then she has tried to cancel the paid service. Every year they renew it anyway, and continue to increase the price each time.

This year we tried disputing the credit card charge. They sent the credit card company (Discover) a bunch of screen shots of the ancient transaction from 2008, but none of the subsequent requests for cancelation. I strongly suspect they’ve “lost” all our requests to cancel their service (which we never found remotely useful in the first place).

Discover sided with and insists that the transaction is legal.

As a merchant, I find that the credit card companies never side with me. <scarcasm>Apparently I need to create better screen shots to send in the case of disputes, because that seems to be the trick to screwing over your customers.</sarcasm>

At this point I think we’ll end up canceling the credit card completely. Not only because Discover is assisting what seems like criminal theft of our money, but also because 12 months from now when tries to steal some more money, they won’t be able to complete the transaction against a long-canceled credit card.

What recourse do I have as an individual in this case? In terms of raw cost, it’ll take thousands of dollars to sue to get my $40/year from them, so it makes more financial sense to allow their continued theft of my money. Certainly there’s no way to get back the latest $40 theft…

Sunday, 28 October 2012 15:08:31 (Central Standard Time, UTC-06:00)  #    Disclaimer
 Friday, 26 October 2012

At the .NET Rocks Road Trip event in Charlotte, NC this week an attendee asked if there’d be a way to run the new Windows Store apps on Windows 7.

These are apps running on the new Windows Runtime (WinRT) platform.

Basically the question was whether Microsoft would issue an update so WinRT apps can run on Windows 7.

My answer, which got a great laugh, but is actually serious, is that Windows 8 is the update to Windows 7 that allows it to run WinRT apps.

I acknowledge that this answer is loaded with humor. But I am also serious in my answer.

I’ve been running Windows 8 full time for a few months now, and haven’t run into any issues with Windows 7 apps not working on Windows 8 (except for a couple odd-ball Steam games that I suspect break some Win32 programming rules). All my work software, all my business software, and my important games (Battlefield 3, XCOM, Supreme Commander, L4D2) all work fine on Windows 8.

Windows 8 turns out to be a slightly faster version of Windows 7, that can also run WinRT apps. Hence, Windows 8 is the upgrade to Windows 7 that allows you to run Windows Store apps.

Friday, 26 October 2012 16:09:22 (Central Standard Time, UTC-06:00)  #    Disclaimer
 Wednesday, 24 October 2012

I am pleased to announce the final release of CSLA 4 version 4.5 with support for the following platforms:

  • .NET 4.5
  • Windows Runtime (WinRT)
  • .NET 4
  • Silverlight 5

The new release is available via nuget and the CSLA download page.

This release includes a number of important features and changes, including:

  • Support for Windows Runtime (WinRT), so you can simply recompile your existing CSLA .NET business classes for WinRT with little or no changes required to migrate to the new platform
  • Support for the new async and await keywords in .NET 4.5 (and in .NET 4 and SL5 via the async targeting pack)
  • Enhancements to the business rules engine
  • Enhancements to Windows Forms support via the Csla.Windows namespace

The entire CSLA .NET dev team has put a lot of work into this release, and we hope you enjoy it and find it useful!

Wednesday, 24 October 2012 16:00:51 (Central Standard Time, UTC-06:00)  #    Disclaimer
On this page....
Feed your aggregator (RSS 2.0)
January, 2017 (2)
December, 2016 (5)
November, 2016 (2)
August, 2016 (4)
July, 2016 (2)
June, 2016 (4)
May, 2016 (3)
April, 2016 (4)
March, 2016 (1)
February, 2016 (7)
January, 2016 (4)
December, 2015 (4)
November, 2015 (2)
October, 2015 (2)
September, 2015 (3)
August, 2015 (3)
July, 2015 (2)
June, 2015 (2)
May, 2015 (1)
February, 2015 (1)
January, 2015 (1)
October, 2014 (1)
August, 2014 (2)
July, 2014 (3)
June, 2014 (4)
May, 2014 (2)
April, 2014 (6)
March, 2014 (4)
February, 2014 (4)
January, 2014 (2)
December, 2013 (3)
October, 2013 (3)
August, 2013 (5)
July, 2013 (2)
May, 2013 (3)
April, 2013 (2)
March, 2013 (3)
February, 2013 (7)
January, 2013 (4)
December, 2012 (3)
November, 2012 (3)
October, 2012 (7)
September, 2012 (1)
August, 2012 (4)
July, 2012 (3)
June, 2012 (5)
May, 2012 (4)
April, 2012 (6)
March, 2012 (10)
February, 2012 (2)
January, 2012 (2)
December, 2011 (4)
November, 2011 (6)
October, 2011 (14)
September, 2011 (5)
August, 2011 (3)
June, 2011 (2)
May, 2011 (1)
April, 2011 (3)
March, 2011 (6)
February, 2011 (3)
January, 2011 (6)
December, 2010 (3)
November, 2010 (8)
October, 2010 (6)
September, 2010 (6)
August, 2010 (7)
July, 2010 (8)
June, 2010 (6)
May, 2010 (8)
April, 2010 (13)
March, 2010 (7)
February, 2010 (5)
January, 2010 (9)
December, 2009 (6)
November, 2009 (8)
October, 2009 (11)
September, 2009 (5)
August, 2009 (5)
July, 2009 (10)
June, 2009 (5)
May, 2009 (7)
April, 2009 (7)
March, 2009 (11)
February, 2009 (6)
January, 2009 (9)
December, 2008 (5)
November, 2008 (4)
October, 2008 (7)
September, 2008 (8)
August, 2008 (11)
July, 2008 (11)
June, 2008 (10)
May, 2008 (6)
April, 2008 (8)
March, 2008 (9)
February, 2008 (6)
January, 2008 (6)
December, 2007 (6)
November, 2007 (9)
October, 2007 (7)
September, 2007 (5)
August, 2007 (8)
July, 2007 (6)
June, 2007 (8)
May, 2007 (7)
April, 2007 (9)
March, 2007 (8)
February, 2007 (5)
January, 2007 (9)
December, 2006 (4)
November, 2006 (3)
October, 2006 (4)
September, 2006 (9)
August, 2006 (4)
July, 2006 (9)
June, 2006 (4)
May, 2006 (10)
April, 2006 (4)
March, 2006 (11)
February, 2006 (3)
January, 2006 (13)
December, 2005 (6)
November, 2005 (7)
October, 2005 (4)
September, 2005 (9)
August, 2005 (6)
July, 2005 (7)
June, 2005 (5)
May, 2005 (4)
April, 2005 (7)
March, 2005 (16)
February, 2005 (17)
January, 2005 (17)
December, 2004 (13)
November, 2004 (7)
October, 2004 (14)
September, 2004 (11)
August, 2004 (7)
July, 2004 (3)
June, 2004 (6)
May, 2004 (3)
April, 2004 (2)
March, 2004 (1)
February, 2004 (5)

Powered by: newtelligence dasBlog 2.0.7226.0

The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2017, Marimer LLC

Send mail to the author(s) E-mail

Sign In