Monday, December 10, 2012

Extending DMS: Symposium Learnings, Part 2

In my last post, I discussed Sitecore's conception of DMS as a nexus for measuring, managing, and optimizing engagement value.  Today I'd like to share some concrete takeaways on how this can be done.  I attended three developer-track talks on DMS, and each reinforced my understanding of how this module can be extended by the developer to tie the customer experience to business value.

Wednesday, October 31, 2012

Sitecore Symposium DMS Learnings, Part 1

With ten sessions and seven concurrent tracks, you have to have a strategy to tackle the Sitecore Symposium.  Mine was to take in as much DMS wisdom as I could, and although Profiles, Personas and Patterns are still gurgling through my head, I came away with a clearer idea of how DMS works, how it can be leveraged, and how it fits in within Sitecore's roadmap.

Monday, September 10, 2012

A Look at Sitecore Social Connected

Social Connected is a free module from Sitecore that allows websites to:
  • Enable visitors to log in with Facebook, Twitter, LinkedIn, or Google+
  • Personalize content based on a visitor's social network profile
  • Post messages to Facebook and Twitter timelines
  • Capture DMS campaign and goal data on social network actions
The module was introduced in October 2011, and has gone through two upgrades, each of which significantly extended its functionality and usability.  The initial release allowed  log in and content related messages, version 1.1 added the ability to send messages directly to users based on DMS goals, and version 1.2, released in July 2012, presents impressive feedback on what happens to those messages, showing share, comment, and retweet activity, and evaluating the engagement value of users who come to site based on Like This and Tweet This links. The rate of introduction of new features shows Sitecore's commitment to the Customer Engagement vision announced at Dreamcore 2011, since it brings this notion of personalization and triggered action into the social networking space.  This post takes a look at how to set up the module, what it can do, and how it can be customized.

Wednesday, September 5, 2012

Pseudo TDD with CodeFiles and Exceptions

I'm working on a hefty solution that takes north of a minute to load after a compile.  Which is a killer for working through UI issues.

Monday, September 3, 2012

A SQL template for attaching Sitecore DBs

I've been doing some comparison analysis of different builds of Sitecore, and found myself creating a large number of throw-away installs locally. Attaching databases and giving rights was a bit of a nuisance, so I wrote a SQL Server Management Studio template. You can add this to your local SQL Server Management Studio by clicking Ctrl-T to open Template Explorer, and clicking New Template.

Sunday, September 2, 2012

Using enums as constants

The other day I found myself having to add a value in to a dictionary with a number of constant keys. I started out with this:

//populating method:
dictionary["constant1"] = value1;
dicitonary["constant2"] = value2;
//consuming method:
value1 = dictionary["constant1"];
value2 = dictionary["constant2"];

Then I felt bad.

Thursday, August 30, 2012

Rocking the SRP with ReSharper

The Single Responsibility Principle is a pain in the ass. You're trying to get something done, and don't have a lot of time, and you'd like to keep all the moving parts in front of you. So put it all in one class, or better, yet, one method.

Thursday, August 9, 2012

An Evening with @Sitecorejohn

The Professional Sitecore Development book tour made a stop in Boston last night, and John West had quite a story to tell.

Tuesday, July 17, 2012

Hitting Scott Guthrie's Laptop

I had the opportunity to take in some of today's AspConf, including Scott Guthrie's keynote demo of Azure.  I can't help feeling that something significant is happening.

Monday, June 18, 2012

The Mikkelsen Component Model

I recently worked through Jens Mikkelsen's excellent series on building a Sitecore site.  In his article on architecture, he makes an argument that the classic N-Tier approach of separate presentation, business, and data layers is not well suited to Sitecore development:

Thursday, April 5, 2012

A Sitecore Magic Show

It's always worth catching the Joe Henriques show.  He can make a demo dazzle, and he makes a compelling case for Sitecore's engagement functionality.  Wednesday's tour de force at the New England Sitecore Users Group was no exception.  The head spins at the amount of information presented.

Wednesday, March 21, 2012

A Day in the TDD Zone

What makes a great day of test driven development?
  1. A good plan.  This is going in my business layer, that is going in my data layer, and I'm not going to think about it just yet.  Let's wrap it in an interface and set it aside for a bit.
  2. Good tools.  NUnit of course, and a good mock suite.  Moq was rocking for me--built around lambda expressions, it makes dynamically created objects obey intellisense.  Pretty nifty.  And ReSharper is wonderful, letting you define methods and classes in your tests, and then Alt-Enter them into existence.  Control-U+Control-U to rerun your last test, and a nice 100% code coverage report for the class under test when your done.

Monday, March 19, 2012

Looking at LINQ

I've been digging through the discussion of LINQ in the Albahari brothers' C# 4.0 in a Nutshell: The Definitive Reference, and it has cleared up a number of points for me:
  1. At a compiler level, LINQ is a series of transformations done to expressions that begin with FROM and end with SELECT or GROUP BY.  These transformations turn free text queries into extension methods.  For example, var query = from A in aList select A.ToUpper() is transformed by the compiler into var query = aList.Select(a => a.ToUpper()). But, and this is a key point, the implementation of the methods is not determined.  You determine the implementation by the namespaces you include; you could write your own implementation of Select, Where, etc.  

Wednesday, February 15, 2012

Sitecore Data Reuse Talk

Here's my talk today on Sitecore data reuse options:

The slides can be viewed or downloaded here.

Tuesday, February 14, 2012

Sitecore Data Reuse Links

I will be presenting a talk on Data Reuse for the Sitecore Users Virtual Group tomorrow, Wednesday February 15 at Noon Eastern time. I'll be reviewing the options that Sitecore offers for data reuse: aliases, proxies, clones, wildcards, and pipeline handlers. I'll post a link to a video when it is available; in the meantime, I thought it would be useful to post the "Further Reading" links here:

Saturday, February 11, 2012

Some validation weirdness with Office Core

This one had me stumped for a bit.  I'm putting together some walkthroughs with Office Core on Sitecore 6.4.1 build 5, and whenever I tried to publish, I would get stopped in my tracks by the following validation error:

Sunday, February 5, 2012

Clones, Versions, and Shared Fields

In Sitecore's release notes for 6.4.1 build 3 (110720), there's an interesting, if somewhat cryptic, announcement:
Clones are now treated as a whole instead of version-by-version, meaning that all versions on the cloned item must refer to the same source item. It is no longer supported that different versions on the cloned item point to different source items or that some versions on a clone do not refer to any source item. This restriction removes potential confusion about which items clones are referencing, and ensures that the value of shared fields is well-defined. If any existing clones in a solution reference different source items, the behavior of shared fields is undefined for these clones.
So, what does this mean? It's clear why shared fields could be a thorny issue for clones.  Unlike a proxy, which is a  copy of the original item in all regards except ID and path, the clone is an independent item with special  rules for the interpretation of null fields.

The Problem
The connection between a clone and its source is defined through the "__Source" field.  Basically, when the source field points to another item, Sitecore uses this item, rather than Standard Values, to pull default values for fields. The problem is that "__Source" is a versioned field, so there is nothing to prevent different versions of a clone from pointing to different objects, or having one version be uncloned.

Tuesday, January 31, 2012

Dipping a Toe into Open Source Development

I spent some time this weekend shaping my Gutter Icon code into a proper Github repo:

  1. I took the class file and put it into a separate project.
  2. I replaced the old namespace "SitecorePlayground" with the more official  sounding "SharedSource".
  3. I serialized the Core content item that wires this up.
  4. I created a package with the DLL and and the content item, and tested them in a blank solution.
  5. I browsed among the various open source licences here and selected this one.
  6. I put the whole thing on Github and added a Wiki.
Next step, getting it on!  A fair bit of work for 20 lines of code, but quite satisfying.  Please comment if you end up using this in your Sitecore installation.  

Monday, January 16, 2012

My Sitecore Personal Trainer: Stack Overflow

There's nothing like getting your ego invested in your Stack Overflow rating (mine is a puny 173 at present), to get you working on your technical chops. I spent a few (too many) hours working on this question:

Wednesday, January 11, 2012

Defining Multiple Sites in Sitecore's Host File

Just discovered an odd little fact about how the sites/site node works in Web.config when defining multiple sites. There is an implicit wildcard functionality, so that if you have two host names, such as "Sitecore65" and "Sitecore65b", a site with hostname="sitecore65" will match both.   So if you want "Sitecore65B" to go to a different home item form Sitecore65, you have to put this entry first in Web.config:

       <site name="website2" hostname="sitecore65b" virtualFolder="/" physicalFolder="/" ...
       <site name="website" hostname="sitecore65" virtualFolder="/" physicalFolder="/" ...
Sitecore's multisite documentation mentions wildcard functionality, but from the way it is stated, I assumed this was explicitly specified with an asterisk:
Sitecore compares the hostName attribute (which may include wildcards) with the incoming URL
Oh well, you known what they say about assuming things...