#GRBSitecoreUG : Inaugural Meeting 3/29/2017

4. March 2017 09:55 by Mark Servais in Sitecore  //  Tags:   //   Comments (0)

#GRBSitecoreUG : Inaugural Meeting 3/29/2017

Come join us for the initial meeting of the Green Bay Sitecore User Group. We will network and discuss all things Sitecore!

Rick Bauer, from Perficient, will speak about Sitecore personalization.

Location:

111 North Broadway Street
Suite B
Green Bay, WI 54303

Agenda 3/29:

5:30 PM – 6:15 PM–        Food, Refreshments, networking

6:15 PM – 7:30 PM –       Organizer overview – why we are doing this, what we want to accomplish as a group +

                                        Presentation – Let’s Get Personal  (Personalization in Sitecore CXP)

7:30 PM – 8:30 PM –       Audience input and ideas, more networking

 

About the presentation:

Let's get personal

Following up on a Personalization podcast on @coresampler, let’s take a detailed look at creating personalization in Sitecore CXP. Rick will cover the best practice steps that it takes to realize full personalization and discuss some details that developers can do to drive comfort and success for marketers. He will walk through a live demo of setting up personalization in the Marketing Control Panel and applying it to content plus discuss steps on where to go from there utilizing personalization planning documents.

About Rick Bauer

As Senior Marketing Technologist on Perficient’s Microsoft team, Rick provides insight, training, and a passion for a fully-realized potential of the Sitecore Customer Experience Platform. He utilizes his years of hands-on Sitecore know-how and certification to help deliver clear solutions and actionable results for marketers - both new to the platform, or looking to take it to the next level of maturity. Rick was awarded the Sitecore Digital Strategist MVP award for 2017. Follow on Twitter @Sitecordial.

About your Organizers:

John Rappel

John is a Software Developer at GeekHive, continually striving to exceed client expectations and holding the standard of perfectionism in all ways except for haircuts.

John has worked on over a dozen long term projects in his 3+ years with GeekHive and loves the energy that comes from working on something that will potentially be seen and used by millions of people. We’d be concerned that he’s a megalomaniac if he wasn’t such a great team player. When he’s not working, John is a dad, athlete, and fan of Reese’s Peanut Butter Everything.

Steve VandenBush

Steve is a Software Developer at GeekHive, applying ninja-like troubleshooting, unconventional thinking, and detailed planning to building quality products.

Steve is very active in sharing his knowledge with the greater Sitecore community and brings a naturally mechanical mind to the projects he works on at GeekHive, always ensuring every individual detail works cohesively with the whole. A lover of building and taking things apart in both the physical and digital realms, Steve also works on home improvement projects in his spare time.

Mark Servais

Mark is currently a Principal Web Developer for Velir, a digital agency based outside of Boston. He is a native son of the Green Bay area who currently lives in the southeastern part of the state.

Mark has 20+ years of Microsoft experience coupled with knowledge of development best practices and patterns.  Mark is a certified Sitecore developer and was recognized 4 times by Sitecore as a Most Valuable Professional (MVP) for years 2014 through 2017. In addition to Mark’s work experience, Mark holds 3 academic degrees which most recently includes a Master’s degree in Software Engineering from Carroll University.

Mark’s current passions include Sitecore, semantic web and artificial intelligence tech, home automation and bots, and test centric quality methodologies leading to better software. Mark also listens to an absurd amount and variety of music and has become a vocal disability advocate when necessary.

 

Sitecore MVP 2017 - 4-peat Recipient

1. February 2017 20:56 by Mark Servais in Sitecore  //  Tags:   //   Comments (0)

I am honored and privileged to be awarded Sitecore's Most Valuable Professional classification for 2017. I've been honored now for the past 4 years to be award this distinguished recognition.

I was one of only 215 Technologists worldwide to be named a Sitecore MVP this year.

Now it its eleventh year, Sitecore’s MVP program recognizes individual technology, digital strategy, commerce, and cloud advocates who share their Sitecore passion and expertise to offer positive customer experiences that drive business results. The Sitecore MVP Award recognizes the most active Sitecore experts from around the world who participate in online and offline communities to share their knowledge with other Sitecore partners and customers.

“The Sitecore MVP awards recognize and honor those who make substantial contributions to our loyal community of partners and customers,” said Pieter Brinkman, Director of Developer and Platform Evangelism, Sitecore. “MVPs consistently set a standard of excellence by delivering technical chops, enthusiasm and a commitment to giving back to the Sitecore community. They truly understand and deliver on the power of the Sitecore Experience Platform to create contextualized brand experiences for their consumers, driving revenue and loyalty for life.”

Sitecore’s experience platform combines web content management, omnichannel digital delivery, customer insight and engagement, and strategic digital marketing tools into a single, unified platform. The platform is incredibly easy to use, capturing every minute interaction—and intention—that customers and prospects have with a brand, both on a website and across other online and offline channels. The end-to-end experience technology works behind the scenes to deliver context marketing to individual customers, so that they engage in relevant brand experiences that earn loyalty and achieve business results.

More information can be found about the MVP Program on the Sitecore MVP site: http://www.sitecore.net/mvp



Sitecore Family Conference - Interested?

21. October 2016 21:06 by Mark Servais in Sitecore  //  Tags:   //   Comments (1)

So back in September I posted an idea about the possibility of holding a family friendly conference. After some initial feedback I want to get a bit more input on overall interest in the event.

I put together a very short survey (https://www.surveymonkey.com/r/YVFCBXK) about the potential event. If you are interested in the event, even just a little interested, please take 5 minutes and fill out the survey so I can get some feedback. Based on the amount of feedback we collect, we'll know if there is interest in going forward to make this event a reality.

Some of the feedback will also be used to determine types of sessions, location, topic areas, and budgeting limits to think about.

Thanks in advance for your time! Looking forward in seeing your answers.


Data Exchange Framework and Json

17. October 2016 18:49 by Mark Servais in   //  Tags: , , ,   //   Comments (0)

I had the privilege of taking part in putting together a leg of a POC that included the task of parsing a Json data set representing a group of users and doing two things with them. The first, adding them as Sitecore items in what could represent a profile page. The second, creating Sitecore user accounts based on that same json formatted data set.

Fellow Velirian, Nick Dorrough is presenting a series of posts on this POC. Be sure to check out his current post and the soon to be upcoming posts.

Along with the current DXF documentation being a resource, Nick's posts will dive into the details of the POC and working with DXF. So I certainly won’t repeat that information here. What I will focus on is the ability to add functionality of parsing Json and working with Sitecore not only in content creation, but to work in other Sitecore aspects, such as adding Sitecore User accounts.

In initial investigations, it was really evident that my work was not going to be done for me. No Json provider was noticed nor within the Sitecore provider a way of creating users. Curses!

Actually – I kind of thought that might be the case – so into the sandbox to play…..

First I looked into the File System Reader pipeline step provided in the documentation example (http://integrationsdn.sitecore.net/DataExchangeFramework/v1.1/implementing-a-provider/implement-pipeline-step/implement-pipeline-step-processor.html). The process works on the concept of file location and parsing by delimiter. I knew getting the json parser to work was likely more important, so opted to use a local json file. I could always change the way the json was delivered after the proof of concept and likely would need to, based on using the patterns for future solution implementations. I also needed to generate some data representing user accounts. I pulled user data from our GitHub company account and noticed the results needed a little data scrubbing, so at that point there was no turning back from using a local file.

So here is the result of the code for the new converter and pipeline step.

The converter I did was in fact no different than the one in the File System reader example. Except for the template Guid.

namespace UserImport.Json.Converters.PipelineSteps
{
public class ReadJsonFileStepConverter : BasePipelineStepConverter<ItemModel>
{
private static readonly Guid TemplateId = Guid.Parse("{D5591FEF-8964-471B-B785-AC183C2F614B}");
public ReadJsonFileStepConverter(IItemModelRepository repository) : base(repository)
{
SupportedTemplateIds.Add(TemplateId);
}
protected override void AddPlugins(ItemModel source, PipelineStep pipelineStep)
{
AddEndpointSettings(source, pipelineStep);
}
private void AddEndpointSettings(ItemModel source, PipelineStep pipelineStep)
{
var settings = new EndpointSettings();
var endpointFrom = ConvertReferenceToModel<Endpoint>(source,
ReadJsonFileStepItemModel.EndpointFrom);
		  if (endpointFrom != null)
{
settings.EndpointFrom = endpointFrom;
}
pipelineStep.Plugins.Add(settings);
}
}
}


For the processor, I noticed the file system example loading “record” elements in a pipeline plugin that contained on object of IterableDataSettings. I knew that likely downstream I would create more work for myself if I changed this approach so, doings as the locals do, I deserialized the json into a List of POCO elements.

//
//read data from file
IEnumerable<GitMemberJsonModel> lines = LoadJson(settings);
			
//
//add the data that was read from the file to a plugin
var dataSettings = new IterableDataSettings(lines);
private IEnumerable<GitMemberJsonModel> LoadJson(JsonFileSettings settings)
{
	List<GitMemberJsonModel> returnObjects = new List<GitMemberJsonModel>();
	string json;
	using (var r = new StreamReader(settings.Path))
	{
		json = r.ReadToEnd();
	}

	returnObjects = JsonConvert.DeserializeObject<List<GitMemberJsonModel>>(json);
			
	return returnObjects;
}


And then getting to what the pipeline looks like…


So as you can see it is similar to the example. The major difference between the two is obviously the Read Json User File pipeline step. 

So when the pipeline batch is executed – the json file is read, json “parsed”, field values are mapped, and like magic we have our Sitecore items.



1st goal of POC completed. No sweat. Also no rest for the wicked, I have another goal to accomplish…

So now instead of writing to Sitecore items I need to create users through the membership provider. So simple…well it took a little bit to find the right fit. I had a few options, some kinda gross and one not gross.

I could have just extended the UpdateSitecoreItemStepProcessor to add Membership.CreateUser after the item update. This is gross because I’ve just couple item create and user creation, which goes against the pipeline concept. Not happening.

I could add a pipeline step within the User Info from File to User Item Pipeline, but then again my entire pipeline has both item creation and user account creation and when calling the pipeline I have to content with having both. 

I honestly did do this for a bit for debugging purposes to make it easier to figure out where my data iteration lived and what it looked like for the plugin. But it wasn’t staying that way because sometimes I don’t want a Reeses Peanut Butter cup, sometime I just want the peanut butter.


So a new pipeline was created. 

 



Adding to run two pipelines...

Also needed a new converter and processor.

namespace UserImport.Json.Converters.PipelineSteps
{
	public class UpdateSitecoreUserStepConverter : BasePipelineStepConverter<ItemModel>
	{
		private static readonly Guid TemplateId = Guid.Parse("{DC2EA70F-52E8-42FC-B348-336013E23295}");
		public UpdateSitecoreUserStepConverter(IItemModelRepository repository) : base(repository)
		{
			SupportedTemplateIds.Add(TemplateId);
		}

		protected override void AddPlugins(ItemModel source, PipelineStep pipelineStep)
		{
			AddUpdateSitecoreUserSettings(source, pipelineStep);
		}

		private void AddUpdateSitecoreUserSettings(ItemModel source, PipelineStep pipelineStep)
		{
			var settings = new UpdateSitecoreUserItemSettings();
			var emailfield = source[UpdateSitecoreUserItemModel.EmailField].ToString();
			var defaultpassword = source[UpdateSitecoreUserItemModel.DefaultPassword].ToString();
			var usernamefield = source[UpdateSitecoreUserItemModel.UsernameField].ToString();
			if (!string.IsNullOrEmpty(emailfield))
			{
				settings.EmailField = emailfield;
			}
			if (!string.IsNullOrEmpty(defaultpassword))
			{
				settings.DefaultPassword = defaultpassword;
			}
			if (!string.IsNullOrEmpty(usernamefield))
			{
				settings.UsernameField = usernamefield;
			}
			
			pipelineStep.Plugins.Add(settings);
		}
	}
}


The converter now stores the Sitecore pipeline step item’s field values as a plugin for retrieval in the processor. Knowing the json record were typical fields in the itemModel – I just grabbed them directly for storage.

Now the processor I based off of the decompilation of the UpdateSitecroeItemStepProcessor. I removed pieces around endpoint retrieval and modified the fixing of the Sitecore item to actually do this:

protected virtual void PrepareUserAccount(GitMemberJsonModel itemModel, PipelineContext pipelineContext)
{
  var logger = pipelineContext.PipelineBatchContext.Logger;
  var usernameValue = string.Empty;
  var emailValue = string.Empty;

  try
  {
    UpdateSitecoreUserItemSettings updateUserItemSettings = pipelineContext.CurrentPipelineStep.GetPlugin<UpdateSitecoreUserItemSettings>();
    if (updateUserItemSettings != null)
    {
	if ((string.IsNullOrEmpty(updateUserItemSettings.EmailField)) ||
	(string.IsNullOrEmpty(updateUserItemSettings.UsernameField)) ||
	(string.IsNullOrEmpty(updateUserItemSettings.DefaultPassword)))
	{
	  return;
	}

	emailValue = (string)itemModel.GetType().GetProperty(updateUserItemSettings.EmailField).GetValue(itemModel, null);
	if (string.IsNullOrEmpty(emailValue))
	{
	  return;
	}

	usernameValue = (string)itemModel.GetType().GetProperty(updateUserItemSettings.UsernameField).GetValue(itemModel, null);
	if (string.IsNullOrEmpty(usernameValue))
	{
	  return;
	}

	usernameValue = this.SitecoreScrub(usernameValue);

	var user = Membership.GetUser(usernameValue);
	if (user == null)
	{
	  Membership.CreateUser(usernameValue, updateUserItemSettings.DefaultPassword, emailValue);
	  logger.Info("CREATED: Username {0} in Sitecore.", usernameValue);
	}
	else
	{
	  logger.Info("NOT CREATED: Username {0} already exists in Sitecore.", usernameValue);
	}
    }
  }
  catch (Exception ex)
  {
    logger.Error(
	"Sitecore User Accont not created. " +
	"(username: {0}, error message: {1})",
	(!string.IsNullOrEmpty(usernameValue)) ? usernameValue : "Unknown", ex.Message);
  }

}


Now if this wasn’t a POC, I would do more validation, likely add profile field updates, and so on. But it’s a POC and the goal is to create a user with

Membership.CreateUser(usernameValue, updateUserItemSettings.DefaultPassword, emailValue);

Note: Because Stephen Pope pays well for referencing him in blog posts, this has been added to make my wallet a bit more full for the holidays. (http://stackoverflow.com/questions/11840886/how-to-create-user-profiles-in-sitecore-programatically)


And with that goal #2 complete.

Hopefully this post, along with Nick’s current and upcoming posts, will provide you a bit of insight on how to stretch a bit with utilization of the Data Exchange Framework.

From The Mouth of Sitecore Colleagues

20. September 2016 06:14 by Mark Servais in General Blog, Sitecore  //  Tags: , ,   //   Comments (0)

So last week I had a blast meeting some new folks, seeing some past friends, and deepening relationships with many of you. I had a ton of great stomach bursting laughs and learned a lot from all of you.

One of the many bits of information from last week's Sitecore MVP Summit and Symposium was we get to look forward to this each and every year. SUGCON NA has essentially been replaced with an annual Symposium.

Part of my learning about all of you came with hearing your personal stories, about your travel, about your families, all sorts of stuff.

I anticipated some conversations around user groups, and had some conversations of ideas around an online development conference. Going through those conversations many of your stories stuck with me about family, kids with their tablets and YouTube favorite series, and some of your kids programming. Along with our conversations about Sitecore development, these stories really stuck with me on the way home.

Well, I touched base with Akshay Sura after getting back home. One, to make sure he gave the camera phone a rest, but the other more important reason was to discuss a new Sitecore developer conference idea. Consider the results of the conversation to be what you will read below. Consider this a sort of exploratory effort to gauge interest and ideas.

  • Knowing that most companies will not send you folks to two Sitecore conferences, we wanted to mix the idea of mixing business and pleasure so we are looking at making this conference a family friendly event. Think of it as a vacation with the family, but getting your Sitecore knowledge gain as well.
  • We want to have the typical presentation tracks that we are accustomed to seeing at other conferences.
  • We would like this conference to have sessions geared at teaching aspects of technology (Sitecore related always a plus) to boys and girls of all ages. Gives us all an opportunity to help mentor and teach those coming after us.
  • We want to have attendee run discussions that are open and collaborative. In some past conferences these have been referred to birds of a feather conversation or "unconference" sessions (thanks Derek Dysart!).
  • We want to have attendee run hands on labs in smaller group settings.
  • After session activities that are family focused (game night, etc.) will be required.
  • We want the conference in a location near a major airport, at a family friendly resort/hotel.

There are other Microsoft family focused conferences which is where the final idea settled in for me. But we don't necessarily want to replicate those. After all we are Sitecore community members, we tend not to follow the typical norms.

We do want more feedback on the idea. Once we can gauge what you as the community are interested in, then we can drill down into the information, start getting people involved in the effort, and officially begin the organization of this conference.

You can reply to this blog, or a much better way to leave feedback is to send myself(@mservais) or Akshay(@akshaysura13) a message or tweet on Twitter. We really want to know if you would consider attending such an event and what else you might like to see.

Looking forward to hearing from you all.

-Mark

Sitecore FYI post

14. August 2016 15:29 by Mark Servais in Sitecore  //  Tags:   //   Comments (0)

Just a really quick note on something I encountered this past week.....

I was working with a LinkField in Sitecore and I needed to retreive the Url. Obviously the Url property on the link field is available but doesn’t populate for internal links. So to determine when to use the field Url or process the internal link I was using the IsInternal property. Well I found out that this property isn’t always accurate. Confirmed by Mike Reynolds, another Sitecore MVP and enthusiast, when the LinkType is null or blank, it defaults to “internal”. This means if you clear out your LinkField, the IsInternal property will return true.

 

A Sitecore bug has been logged and the public reference number 120621 can be used to track status. More information about public reference numbers can be found here.

 

For the time being until the fix is put in a future update to Sitecore, check the LinkField TargetID property of IsGlobalNullId to determine if the LinkField is truly referencing a Sitecore item and thus really an internal link.


Knowing the Sitecore content: Opening up Solr's maximum returned results

18. April 2016 06:10 by Mark Servais in Sitecore  //  Tags:   //   Comments (0)

So I got a gentle reminder from a Sitecore project recently that Solr is going to only return 500 maximum results by default per the ContentSearch.SearchMaxResults setting.

As you can guess, I needed more than 500 results to be retrieved from the index.

So it was as easy as modifying the number and I was in a happier place.

But being me, always looking at the periphery, what if I wanted all results for everything. In older versions of Sitecore you were able to place a '0' for a value and receive the whole collection from the index for your search.

Well that was in older versions of Sitecore, so that didn't go. It actually gives me 0 results. Really useful by the way having a search forced to return zero results.

Regardless through a brief Slack chat conversation Mark Cassidy that the new unlimited results value is actually leaving it as an empty string (""). That did seem to bring everything back so great - curiosity extinguished - right?

Yes, but that flame was sparked again with a comment from Richard Seal. "... just a caveat when doing that. That will send int.MaxValue to Solr as the max rows." For those that don't have that memorized - that value would be 2,147,483,647 for an int32 and for an int64 it is 9,223,372,036,854,775,807. Yes I had to look those up a well.

In our case -  int.MaxValue is equivilent to an int32 value. The int64 number was impressive to me so I through it in to both educate and confuse.

Disclaimer: I have not used a decompilation tool to determine the exact interfaces from Sitecore to Solr for this blog, so I do not know how Sitecore addresses things like modification of FETCH-SIZE and etc. with Solr. Those tasks I do when I need to know and for this - I'm on a don't need to know basis.

So I return up to 2 billion records back. That can be a bit taxing.

In my original scenario of increasing the number of SearchMaxResults, I increased it to 15000. Why? Because the feed I was generating from the index had 3,987 (or something like that) pieces of content. Well over the 500.

But then why 15000? Simply for growth of content. New pages, articles, and events will both accumulate and drop out of content. It will take some time for them to hit that ceiling, and when they do - we can change the number.

Going after 2 billion results would still have only surfaced the 3987 pieces of content but it seems a little overhead might be coming for those 3987 records doing it this way.

Being Solr and Lucene are roomates of sort (Solr being built on top of Lucene), it is a bit interesting. As the amount of data increases in the index, I can assume that the algorithm will need an increasing amount of resources to parse records. This is a pretty safe assumption I think. If the algorithm to return resulting sets uses the same algorithm for numeric transformations that the steps should increase as well.

ref Schindler, U, Diepenbroek, M, 2008. Generic XML-based Framework for Metadata Portals. Computers & Geosciences 34 (12), 1947-1955. doi:10.1016/j.cageo.2008.02.023

Quote: Because Apache Lucene is a full-text search engine and not a conventional database, it cannot handle numerical ranges (e.g., field value is inside user defined bounds, even dates are numerical values). We have developed an extension to Apache Lucene that stores the numerical values in a special string-encoded format with variable precision (all numerical values like doubles, longs, floats, and ints are converted to lexicographic sortable string representations and stored with different precisions (for a more detailed description of how the values are stored, see NumericUtils). A range is then divided recursively into multiple intervals for searching: The center of the range is searched only with the lowest possible precision in the trie, while the boundaries are matched more exactly. This reduces the number of terms dramatically.

For the variant that stores long values in 8 different precisions (each reduced by 8 bits) that uses a lowest precision of 1 byte, the index contains only a maximum of 256 distinct values in the lowest precision. Overall, a range could consist of a theoretical maximum of 7*255*2 + 255 = 3825 distinct terms (when there is a term for every distinct value of an 8-byte-number in the index and the range covers almost all of them; a maximum of 255 distinct values is used because it would always be possible to reduce the full 256 values to one term with degraded precision). In practice, we have seen up to 300 terms in most cases (index with 500,000 metadata records and a uniform value distribution).

Lots of words isn't it? I think it is just easier (at least for my math skills) to generate calculations around content and expected returned results. Breaking up indexes potentially by ontologies and related categorizations of relationships will also assist with limited the scope set being returned.

Best said from an old man I once had the pleasure of having conversation with - "Take only what you really need".


2016 Sitecore MVP Awards and onward

18. February 2016 17:39 by Mark Servais in Sitecore  //  Tags: , ,   //   Comments (0)

It's been a wild and weird year.

I am extremely humbled and honored to be one of Sitecore's 2016 Technology MVPs. Get the list of names here.

During the past year, I found some different ways to preach to the goodness of Sitecore through involvement in the Sitecore! Experienced work, posting through a few different blogs, and conversing with Sitecore customers.

I did more with SPEAK than I imagined through working on XCentium's upcoming Vault product, I learned from each of our guests on the podcast, and really focused my personal interests into career development of myself and a few others.

This year the Sitecore site took hold and the Sitecore Community Slack channel was born. Watching both of these flourish this year has been really fun to watch.

Now there are more MVPs than ever before - 221 of us now. Going through the list some regular faces and a lot of newer folks. Group pictures are really going to suck getting everyone in the shot. A drone might be needed this year to take that group photo.

The community is getting better and better.

The weird for me, besides the weird zombie drunk guy in New Orleans trying to spit food on Mark Stiles, Dan Solovay, and myself, was the amount I took on and the speed of burnout that was incorporated. This year was the first time I felt I needed a hiatus from career focused and some personal endeavors. That was a bit tough for me to do, but in hindsight was necessary.

Going forward, changes are a coming for me this year. New directions around career and life are going to be interesting for me.

Sitecore! Experienced ideas are flowing and getting on the board to execute and finish...

Module, big data and whitepaper ideas are making me salivate like a dog hearing a bell..

We as co-creators are sending off the first of our offspring to university - our work to laying adulthood groundwork is complete and I get to enjoy the role of adviser instead of composer

Embracing and exercising my non-logical thinking more which produced a by product of strengthening my logical thinking. A little odd kinda like a politician that thinks for everyone else before themselves. (BTW - that politician thing doesn't exist in the United States. I don't want people to have false hope about money and politics.)

So here is to Sitecore's 2016 season that will bring the future MVPs of 2017...let's tear into this with a little more swagger in our step, shall we?

  


Things to know about Sitecore SPEAK

11. February 2016 19:00 by Mark Servais in Sitecore  //  Tags: , ,   //   Comments (0)

I just wrapped up a presentation (admittedly clearly not my best) for the Milwaukee Sitecore User Group where I gave an very brief overview of SPEAK and I did a little Betty Crocker baking of an existing Sitecore Marketplace module from Sheer UI to SPEAK.

The prezi is here. The MKE SUG presentation video is here. Finally the summary video I did as a backup is here.

A small Sitecore! Experienced video is here - our first Tangible Knowledge series piece. These are open forum so if you got something uniquely Sitecore to share see us on the Sitecore! Experienced site.

SPEAK has some portions that give it some heat. Let's review some of these nuggets:

Config files:

Sitecore.Speak.config -> Contains a series of SPEAK settings around requireJS files, caching, script minificaton, etc. Play with this file at your own risk. Big takeaway in this file is the addition for pre compilation of SPEAK views and the custom SPEAK handler which is critical for component rendering.

001.Sitecore.Speak.Important.config - Important enough to be at the head of the list. All the client piplelines are defined here for the client processing -clicks, layout rendering, scripts and stylesheets, and bindings.

Sitecore.Speak.ItemWebApi.config -> Pipelines. The word you're going to here for a bit more. So this ties in the pipelines related to item search for SPEAK. Item requests, searchs, and property retrieval are defined here.

Sitecore.Speak.Applications.config -> Some settings and pipelines that deal with dialog presentation overrides , the media browser dialog (XML control override), and logout functionality around SPEAK.

Sitecore.Speak.Components.config -> Some of those things, you know - pipelines. Rules, controls, styling are defined here.

Sitecore.Speak.Mvc.config -> MVC routing prefix is established here with command route and content rendering pipelines.

Sitecore.Speak.LaunchPad.config -> No pipelines! Instead a processor to work with SPEAK log in functions and a setting to enable personalized frames with Analytics.

Sitecore.Speak.AntiCsrf,SheerUI.config - Looks to be a rules filtering limitation - but don't quote me on that one.

Sitecore.ExperienceEditor.Speak.Requests.config & Sitecore.ExperienceExplorer.Speak.Requests.config - processes related to content author activities to verify that actions on the client can take place, retrieve specific information and perform specific processing actions. Looks like a lot of tool setup.

So knowing where things are defined for life in Sitecore will come in handy when having issues with very customized and complex controls.

In keeping with the theme of pipelines, we just don't have them for the code-behind. In your Sitecore instance file structure, go to website/sitecore/shell/client/Speak/Assets/lib/core/<pick your version here, we are looking at 2.0>. The sitecore.js file begins the journey of functions that are the girders and bolts for the SPEAK framework. You can read this at your leisure. 

Ok you really don't need to spend leisure time reading this, read Moby Dick, White Fang, Grapes of Wrath, or a great piece of literature.

Do however take a little bit of non-leisure time to review this script as it will give you some insights on the client side composition of SPEAK and where frameworks like jQuery, Knockout.js, and Backbone.js come into play and also where their wings may have been clipped/enhanced for SPEAK.

You likely will never want to make changes here, but always good to know what is going on where.

This URL -> https://doc.sitecore.net/speak = your friend when working with SPEAK. You are going to make a lot of other friends too. Several Sitecore employees, Sitecore MVPs, and dedicated developers have written blogs on some trials and successes with their speak efforts.

The most difficult part about working with SPEAK has been knowing what each of the components can and can't do. Even with the improvements in documentation, you are going to have needs and wants to push the provided components further than they were designed to go. You may even find the need to have to create something brand new (I encourage you to do so frequently).

There are a few good tutorials on how to get started with SPEAK and I will not reiterate that information here. I will though share with you some honest advice around my using SPEAK for XCentium's Vault product and other little tidbits I have worked on.

1. Don't screw with the main layouts. Yes that is a technical term that I made tamer than the original word. Sitecore has put these in place for a consistent feel for all customers. I haven't seen too many hard and fast UI best practices for consistency from the controls provided, but the dashboard pages and dialogs have a definitive sandbox to do you thing in. Play in the sandbox as much as possible.

2. The learning curve is certainly inclined. Even if you have a solid understanding of the stack behinds SPEAK (I consider myself mediocre here), there are things that you can, can't, should, and shouldn't do. Trial and error around building stuff is the best teacher here.

3. The premise of SPEAK is built on concepts you should know as a Sitecore developer. Placeholders, templates, renderings, etc. It's just a different composition toolbox and space.

4. Sitecore Rocks is another friend of yours. In fact you really can't do SPEAK without it. I did though have to go into the Content Editor within the Core database to verify some checkboxes. They didn't set very clean for me in Rocks.

5. Estimation is futile at first. That incline I mentioned before, it humbles you. Starting out, especially if building custom SPEAK components, you are going to mis-judge the time it will take you to accomplish tasks. If you are a consultant, and promising custom SPEAK based functionality, you may want to decide on some what-if overage scenarios. At minimum, give yourself plenty of runway to complete what needs to be done. If possible start with smaller tasks to begin to get a structural feel around the environment.

6. Understand the concepts behind backbone and knockout. While you will not want to rely on them entirely in case the stack changes later, you most likely will want to leverage the architecture the best you are able to keep your components and overall flow clean.

7. Listeners are king.

8. Rules help with component to component interaction. If that fails, utilize your page code capabilities to facilitate that communication. 

9. Keep your code generalizations in nuggets for re-use but expect that each "page" entity in SPEAK will require its own unique capabilities.

10. Provide as much feedback as possible. Sitecore has invested time and energy into this as a future piece of the puzzle. The more voices they here about issues, improvement ideas, etc., the better it is for the entire community. The real good part - they are listening.

11. Your browser development tools are another really close friend you will make. Learn them well.


I hope you found some wisdom in my words. Good luck with your adventures and share what you are doing.

Here are some of the best places for SPEAK information as of now:

Sitecore Support, the Sitecore community (community.sitecore.net, the Sitecore slack channel (#sitecore-speak), Twitter, etc.), your local Sitecore User Groups - talk to other Sitecore folks to see what they are doing.


Sitecore 8.1 - /sitecore/client/Business Component Library/version 2/Content/Guidance/Dashboard

Sitecore.Net Documentation - http://bit.ly/1JnuXrQ

Julia Gavrilova - http://bit.ly/1OCTWTY

Jakob Christensen – http://bit.ly/1mYrDtdhttp://bit.ly/1P9E4ZO

Martina Welander - http://bit.ly/1P9E7Vk

Anders Laub - http://bit.ly/22FHspb

Göran  Halvarsson - http://bit.ly/1MOmPLE

Vikram Rathore - http://bit.ly/1JnvqtQ

Martin English - http://bit.ly/1WgKD1e

Mike Robbins - http://bit.ly/1Tfas3I


My stuff - https://vimeo.com/sitecoreexperienced/sitecoreexperienced9   http://www.markservais.com/post/2015/08/24/xcentium-speaking-aloud-changing-css           https://prezi.com/firrr2kjvpcu/speak-converting-a-module/

You can always practice your Google Foo -> "Sitecore SPEAK".

Software Engineers - Continuing to Evolve : A Response To The Atlantic

9. November 2015 21:59 by Mark Servais in   //  Tags:   //   Comments (0)

The Atlantic published an article by Ian Bogost regarding the industry use of "engineering" for software and the relationship of facets in comparisons of disciplines in software creation to disciplines of public project creations such as roads and bridges. 

I've been building software for over 30 years now. Quite a long time to watch technologies rise and fall, disciplines come and go, and buzzwords be created from thin air only to fade into extinction almost as quickly as they came.

However I am at times a Software Engineer and during those times I am not - I still aspire to implement process and structures to be called one.

Why only at times? Shouldn't I be a Software Engineer all the time?

Sometimes the proverbial crap doesn't hit the fan the same way twice and as I later will discuss based on the sate of the industry, we don't always get what we want.


Engineering defintion from Merriam-Websterthe work of designing and creating large structures (such as roads and bridges) or new products or systems by using scientific methodsthe control or direction of something (such as behavior)

We'll refer to this a bit later.

While I don't completely agree with the author, herein referred to as Ian, and his mindset detailed in the Atlantic article. But instead of going off half cocked about the pride I take in developing software, I realize there are times under sometimes uncontrollable circumstances that actually support Ian's thinking. There are several main ideas running in my head in which I think the arguments can swing either way.


1) Engineering is not just for public efforts and in the public interest and shouldn't be considered only a public infrastructure thing.

This is one aspect that I don't agree with Ian at all - based on the implied definition of "engineering".

Let's think about the history of engineering as depicted in the article. Military and Civil Engineering date back to 1325 AD if the resource I found is correct. Correct or not, I do think it is safe to assume the way we construct machines, buildings, and civil engineering systems has matured over thousands of years, probably since the Egyptians and the Mesopotamians. Sometimes it takes us a humans a while to get something down solid. 4000+ years has done some good things.

With software generally being born around the mid 1950's, it is safe to say that from an engineering approach - software is still in its infancy. Other engineering practices have had a much longer time to incubate and get better. We in software are still babies in the engineering world.

Not all engineering feats benefit the public and is responsible for public safety and reliability. The Manhattan Project had engineers and it certainly didn't adhere to responsibility of public safety and reliability. As I understand nuclear fission is subject to spontaneous reactions. So the perceived notation that engineering adheres to responsible public consumption is a diminished pipe dream at best. 

Engineering expands well beyond the implied definition in the article. Sometimes feats of pure engineering happen for the individual. Plenty of DIYers are wiring their homes, installing solar power supplies, constructing buildings, and so on. Many of them are not engineers.

With that however, have you seen some of this work like I have with previous home owners, might not be a bad idea to be certified and licensed.

However Ian hits it on the head with this quote - "Computing has become infrastructure, but it doesn't work like infrastructure." 

He is right, as software pros - we don't always get it right and many different fronts. This can lead to....


2) Sometimes engineers across the board jack %$it up.

Ian points out many different software failures within his article. Target, Anthem, and Ashley Madison are among a few of the many companies mentioned in the news lately and have scrambled to repair reputations. We use cloud based services all the time that hiccup and spit up all over the place from time to time. Like the baby reference I just put in there?

When structural engineering was finding its way, there were plenty of similar episodes. If Darwin awards were more like Emmys, we can see awards given for the Tacoma Narrow Bridge, the Bhopal disaster, the Challenger, and the Titanic. These failures happen however and engineers in all disciplines aren't perfect.

While no disaster is acceptable in software or any other engineering discipline, we tend to forgive software more often than not for various imperfections. That in itself doesn't support software working like infrastructure. Like any approach, and as Ian mentions in regards to 'greenwashing' and 'engineerwashing', many issues get covered up through the creation process.

In my mind, the argument for software engineering to be detrimental to it's core engineering based on frequency of failures is ludicrous. All facets of engineering can be improved on practices and execution. I agree though that because of software's infancy, it desires the need to be more organized through consistent scientific practices and standardization would be beneficial to reduce such failures.


3) Old school software career journey versus today's software journey.

This is where Ian and I agree. To quote Ian -> 

"But by definition, 'engineering' has traditionally entailed the completion of and Accreditation Board of Engineering and Technology (ABET)-approved 4-year degree."

I'm not sure I agree with the four year degree - I argue it takes much more than a typical standard 4 year degree to establish true expertise in engineering principles. I argue that 8 years plus a journeyman program is needed to properly master and to knowledgeably adhere to many standardized practices to produce high quality functioning software.

With the ease of anyone getting their hands on computers and learning to program them, we are seeing many self-made programmers. Nothing wrong with this, it's how I think most of us start out. I started out this way and grew into the role through practice and education.

The difference as Ian points out is that with minimal skill sets and experiences "engineers" are jumping into startups and focusing on minimal viable products to market. We've become very forgiving to expect updates to recently released software to stabilize features. Because of our quick to market approaches, we sometimes bypass quality measures.

"To 'engineer' is to jury-rig, to get something working more or less, for a time. Sufficiently enough that it serves an immediately obvious purpose, but without concern or perhaps even awareness of its longevity."

Ian describes a MacGyver scrappiness in building software. While I really hate admitting it, we are in a cycle in which getting a product to market, and "improving" on it as it matures in the marketplace, is becoming the standard path. 

This can dilute proper production necessities that allow software to be classified as an engineering approach. However, I do disagree with Ian on the following:

"And even successful, methodologies like Scrum never allow that infrastructure to stabilize."

Stabilization is referred to as the lack of tweaks and features on a regular basis. In fact these methodologies in my opinion produce better software when the methodologies are properly adhered to. Frequent additions of features is not an indication of instability of a software solution or product.

As a software industry, we really have been failing at certifications and licensing for practitioners. The major reasoning is agreement to what standards and practices should be adhered to. There are so many flavors to our young industry that it is becoming increasingly difficult to gain industry consistency.


4) Business needs at time outweigh proper techniques and quality - not with just code folks.

We are a order and drive-up to get our goods society. One of the core perceived issues with high quality software is that it takes too much time and costs too much to be cost effective for the enterprise. We want our return on software investment much quicker and in shorter cycles. It is good for fostering an adaptable business environment.

Software is also a discipline that goes well beyond code, and more than likely requires a team of skilled individuals to bring out certain aspects of a particular solution. Every member of the team has a direct reflection on the quality of the next work performed in the project process.

Is this development or engineering? I argue it is in between. Development is really the implementation of design and process through software code. It is certainly far from the social welfare that Ian has stated as a facet of engineering.

But, in a majority of cases it doesn't fit that definition above. The only place it doesn't fit that definition is for "by using scientific methods". We can certainly quantify software in many different measurements. Big O notation, issue counts, cyclomatic complexity and cohesion, maintainability index, and so on. The problem is for the most part - we never even talk about these in business software development. Not until there is a problem.

While there is a scientific basis for software, it is a great facade to demonstrate the art of software. In the past, I've been under the belief that software can be a hybrid of science and art. As I've matured, I realize this isn't the case.

The scientific foundation, including basic logistical concepts in mathematics, are imperative for software engineering to take place. Artistic elements can be placed on top this foundation to make software appealing, particularly code in my context of this article. Code can have a pleasing aesthetic to the eye. Aspects like UX and UI design are typically a completely different, and necessary, type of art form in my opinion.


5) Software Engineering in Practice

So everything leads us to this. Not everyone in every software creation capacity is going to be of an engineer status. The trends in current development practices, in which I agree with Ian, are trending away from engineering principles and encompassing more of a tradesman approach to software. 

In my roles in software I would absolutely love to adhere the proper disciplines around particular principles, practices, and incorporate strict quality control metrics 100% of the time.

Alas, I am not an independently wealthy software developer and have to follow the lead to stay within  appropriate budgets and scope requirements for clients looking to maximize their investments with short ROI cycles.

This is not a bad thing for software, but those cases are not engineering by definition in real situations. Once the software industry matures to the point in which organization and proper accreditation take place, software engineering will no longer be an outlier of engineering practices.

In my opinion a brotherhood of software engineering professionals backed with proper credentialing will stifle creative software development to a certain extent, but it is a necessity when it comes to properly becoming one of the myriad disciplines of engineering. 

Engineering is relating software creation through scientific approaches that can be measured and have been proven to support accountability and proven application of expertise.

Due to many of the debacles in software lately will we circle back to the approaches we started? 

I think we will have to at some point and we'll do it in tandem with keeping costs low, consistent and shorter delivery cycles, and being able to reintroduce high quality practices throughout a software project life-cycle. We will apply proper adherence to mutually agreeable metrics in design and implementation.

As I said - we are still babies in this world of software but I'm hoping we can learn from the other disciplines so we don't need 4000 or so years to really get behind it to get it right.

Calendar

<<  September 2018  >>
MonTueWedThuFriSatSun
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

View posts in large calendar

Month List