Thursday, July 28, 2011

Manually configuring a Tridion 2011 .NET Content Deployer Instance

I'm a big fan of doing "manual" installations of the Tridion Content Delivery layer (be it for .NET or Java, as is probably clear here) and I had not got around for a while to do a complete .NET setup so I could document it somehow.

Until today.

Please note: the steps below are for a 64-bit server. On a 32 bit server you need a couple more files, copied from the x86 installation folder.

These are the steps taken:
Get your files right:
The Hotfix rollup #1 shipped with quite a few updated jar files, but somehow not all files are shipped (cd_tcdl, cd_dynamic and probably a few others are missing, and you need the originals from the 2011 installer). Solution: copy the updated jar files from the hotfix rollup _over_ the files shipped with 2011.

Create your HTTP deployer website:
This is the basic structure for the site:
/
/bin
/bin/config
/bin/lib
In the root, ( / ) drop the httpupload.aspx
In /bin, drop the following 4 dlls:
  • netrtsn.dll
  • Tridion.ContentDelivery.Configuration.dll
  • Tridion.ContentDelivery.dll
  • xmogrt.dll
in /bin/config, place the following configuration files (more details on what goes in these files later):
  • cd_deployer_conf.xml
  • cd_storage_conf.xml
  • logback.xml
in /bin/lib, drop a s***load of jar files...
All jar files from [ContentDeliveryInstall]/java/third-party-lib
The following files from [ContentDeliveryInstall]/java/lib:
  • cd_broker.jar
  • cd_cache.jar
  • cd_core.jar
  • cd_datalayer.jar
  • cd_deployer.jar
  • cd_linking.jar
  • cd_model.jar
  • cd_tcdl.jar
  • cd_upload.jar
And, last but certainly not least, add your jdbc (sqljdbc or ojdbc) driver to this folder.

Configuration

Obviously you must change the settings in these files to match your server configuration (sorry if it doesn't display very well on this blog, copy/pasting should work).

cd_deployer_conf.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!-- The Tridion Content Distributor Deployer configuration specifies all
    configuration values required to receive and deploy content to a delivery system. -->
<Deployer Version="6.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:noNamespaceSchemaLocation="schemas/cd_deployer_conf.xsd">
    <Processors>
        <Processor Action="Deploy" 
   Class="com.tridion.deployer.Processor">
            <Module Type="SchemaDeploy" 
    Class="com.tridion.deployer.modules.SchemaDeploy"/>
            <Module Type="PageDeploy" 
    Class="com.tridion.deployer.modules.PageDeploy">
                 <Transformer Class="com.tridion.deployer.TCDLTransformer"/>
            </Module>
            <Module Type="BinaryDeploy" 
    Class="com.tridion.deployer.modules.BinaryDeploy"/>
            <Module Type="ComponentDeploy" 
    Class="com.tridion.deployer.modules.ComponentDeploy"/>
            <Module Type="TemplateDeploy" 
    Class="com.tridion.deployer.modules.TemplateDeploy"/>
            <Module Type="PublicationDeploy" 
    Class="com.tridion.deployer.modules.PublicationDeploy"/>
            <Module Type="TaxonomyDeploy" 
    Class="com.tridion.deployer.modules.TaxonomyDeploy"/>

            <Module Type="ComponentPresentationDeploy"
    Class="com.tridion.deployer.modules.ComponentPresentationDeploy">
                <Transformer Class="com.tridion.deployer.TCDLTransformer"/>
            </Module>
            <Module Type="StructureGroupDeploy" 
    Class="com.tridion.deployer.modules.StructureGroupDeploy"/>
        </Processor>
        <Processor Action="Undeploy" 
   Class="com.tridion.deployer.Processor">
            <Module Type="PageUndeploy" 
    Class="com.tridion.deployer.modules.PageUndeploy"/>
            <Module Type="ComponentPresentationUndeploy" 
    Class="com.tridion.deployer.modules.ComponentPresentationUndeploy"/>
            <Module Type="TaxonomyUndeploy" 
    Class="com.tridion.deployer.modules.TaxonomyUndeploy"/>
            <Module Type="StructureGroupUndeploy" 
    Class="com.tridion.deployer.modules.StructureGroupUndeploy"/>
        </Processor>
    </Processors>
    <Queue>
        <Location Path="c:\tridion\incoming" 
   WindowSize="20" Workers="10" Cleanup="true" Interval="2s"/>
    </Queue>
    <HTTPSReceiver MaxSize="10000000" 
  Location="C:\tridion\incoming" InProcessDeploy="true"/>
     <License Location="c:/Program Files(x86)/Tridion/config/cd_licenses.xml"/>
    <TCDLEngine>
        <Properties>
            <!-- Default code generation will always be targetted towards the use of tag libraries and
                  server controls. Uncomment these lines to drop that behaviour -->
            <Property Name="tcdl.dotnet.style" Value="controls"/>
            <Property Name="tcdl.jsp.style" Value="tags"/>
        </Properties>
    </TCDLEngine>

</Deployer>

cd_storage_conf.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration Version="6.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="schemas/cd_storage_conf.xsd">
  <Global>
    <ObjectCache Enabled="false">
      <Policy Type="LRU" Class="com.tridion.cache.LRUPolicy">
        <Param Name="MemSize" Value="16mb"/>
      </Policy>
      <Features>
        <Feature Type="DependencyTracker" Class="com.tridion.cache.DependencyTracker"/>
      </Features>
    </ObjectCache>
    <Storages>
      <Storage Type="persistence" Id="sqlserver" dialect="MSSQL" Class="com.tridion.storage.persistence.JPADAOFactory">
        <Pool Type="jdbc" Size="5" MonitorInterval="60" IdleTimeout="120" CheckoutTimeout="120" />
        <DataSource Class="com.microsoft.sqlserver.jdbc.SQLServerDataSource">
          <Property Name="serverName" Value="localhost" />
          <Property Name="portNumber" Value="1433" />
          <Property Name="databaseName" Value="Tridion_Broker" />
          <Property Name="user" Value="TridionBrokerUser" />
          <Property Name="password" Value="tridion" />
        </DataSource>
      </Storage>
      <Storage Type="filesystem" Class="com.tridion.storage.filesystem.FSDAOFactory" Id="iisFile">
        <Root Path="c:\inetpub\wwwroot" />
      </Storage>
    </Storages>
  </Global>
  <ItemTypes defaultStorageId="sqlserver" cached="false">
    <Item typeMapping="Page" cached="false" storageId="iisFile"/>
    <Item typeMapping="Binary" cached="false" storageId="iisFile"/>
  </ItemTypes>
  <License Location="c:/Program Files (x86)/Tridion/config/cd_licenses.xml"/>

</Configuration>
logback.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
    <!-- Properties -->
    <property name="log.pattern" value="%date %-5level %logger{0} - %message%n"/>
    <property name="log.history" value="7"/>
    <property name="log.folder" value="c:/tridion/log/website"/>
    <property name="log.level" value="debug"/>

    <!-- Appenders -->
    <appender name="rollingCoreLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.folder}/cd_core.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>${log.history}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <prudent>true</prudent>
    </appender>

    <!-- Loggers -->
    <logger name="com.tridion" level="${log.level}"/>
    <root level="OFF">
        <appender-ref ref="rollingCoreLog"/>
    </root>
</configuration>

Now you have to create a website in IIS that uses this folder as its root folder. If using 2008 R2 you may want to change the application pool identity to Network Service, and you will have to give this user WRITE permissions on the filesystem storage location, as specified in cd_storage_conf.

And that's pretty much it. Configure a Publication Target that uses your new website:/httpupload.aspx and you're ready to go.

Last tip: If you need to publish large packages (think > 4 MB or whatever is the low limit for an IIS POST by default) create a web.config for this website and put the following inside:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="false" targetFramework="4.0" />
    <httpRuntime maxRequestLength="2097151"
    executionTimeout="600"/>
  </system.web>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2000000000" />
      </requestFiltering>
    </security>
  </system.webServer>
</configuration>

Thursday, July 21, 2011

Spicing the community up

As the most visible face of the SDL Tridion MVP Selection Panel I get asked plenty of questions about the selection process, the nominations, the qualifications of the MVPs, etc.

Here's an FAQ to try to sort this thing once and for all:

How do I get to be an MVP?
Very simple:
  1. Contribute to the community. This includes - but is not limited to - twitter, facebook, linkedin, personal blogs, the Tridion Forum, SDLTridionWorld
  2. Get nominated by following the instructions on the MVP Program page
Can I nominate myself?
Yes.


What is a Community Builder?
An MVP that works for SDL.

Who are the Community Builders?
This information is not publicized since we want to promote external MVPs - partners, customers, independents. However, we felt that some contributions from our own people were too good to go unpunished so SDL employees receive a Community Builder award instead. Letting the wider world know about "person X" being a Community Builder is left to the person's own discretion.

Why is {person A} an MVP and not {person B}?
This is one of the most common questions I get. Well, likely because {person B} did not follow the steps outlined above on "How do you get to be an MVP?". The MVP program's goal is NOT to identify the best Tridion resources out there. In many cases, the current MVPs would not even qualify to a "Top 20" of the best Tridion resources in the world (in my not-so-humble opinion). They get the award not because of what they know (though that helps) but because of what they do. Every time an MVP answers a question in the Forum, hundreds of people (potentially) learn from it. Every time an MVP blogs something, the whole world can learn from it. Every time {person B} does a very successful implementation and does not tell the world anything about the solutions chosen, we all lose.

Are you saying MVPs are not the best of the best?
Yes, I am saying that being an MVP does not mean you are better than anyone else. It means you share more than others.


Now that this little FAQ is out of the way...
What the **** are our current MVPs doing? It sure has been a long time since I read anything good by any of them (exception made to Walter that keeps on pushing good stuff out).

Sunday, June 05, 2011

Importing Content into Tridion

Something I get asked almost every time a new project starts - or a new consultant or partner starts working with Tridion - is how to import content into Tridion.

It kinda baffles me, since I always thought it is pretty easy to import content into Tridion, but apparently that's not the case. Here's a few things to consider, I'm pretty sure most of this applies to _any_ content management system, and is not really related to Tridion.

Well formed content
Though it seems obvious, I see many content migrations coming from systems that do not enforce a strict XML schema as Tridion does, and therefore a simple one-to-one migration will fail miserably. "Easy" workarounds on this one:
- Use XmlWriter when creating the content representation for Tridion, and the ItemFields collections to create your content in. If it fails validation, it will probably fail before you try to save it.
- When dealing with Rich Text fields, use Tidy.NET to ensure your content is valid Xhtml.

Consider if a content migration is really what you want
One of the main reasons to change WCM is that your current content format does not match the business requirements. Guess what happens if you migrate your content "as-is" into Tridion? Yup, the content format still does not match your business requirements. So why are you even contemplating migration? Sure, you can get some of the content in, but you really should think about what you're trying to achieve before spending weeks writing a content migration tool that will prove to be worthless in a very short time frame. Do not underestimate the power of manual content migration in some cases.

How easy is it to get the source content?
This obviously depends on a lot of aspects of your current/old WCM, not all of them are as easy, and all of them are different.

In other words, really think about what it is you're trying to achieve before embarking on a migration project that insists on changing mid-way through the migration.

Since you read this far, here's a couple of bonus code samples :)

Converting html to xhtml using Tidy.NET:
private const String XhtmlNamespace = "http://www.w3.org/1999/xhtml";
public static String ConvertHtmlToXhtml(String source)
{
    MemoryStream input = new MemoryStream(Encoding.UTF8.GetBytes(source));
    MemoryStream output = new MemoryStream();

    TidyMessageCollection tmc = new TidyMessageCollection();
    Tidy tidy = new Tidy();


    tidy.Options.DocType = DocType.Omit;
    tidy.Options.DropFontTags = true;
    tidy.Options.LogicalEmphasis = true;
    tidy.Options.Xhtml = true;
    tidy.Options.XmlOut = true;
    tidy.Options.MakeClean = true;
    tidy.Options.TidyMark = false;
    tidy.Options.NumEntities = true;

    tidy.Parse(input, output, tmc);

    XmlDocument x = new XmlDocument();
    XmlDocument xhtml = new XmlDocument();
    xhtml.LoadXml("<body />");
    XmlNode xhtmlBody = xhtml.SelectSingleNode("/body");

    x.LoadXml(Encoding.UTF8.GetString(output.ToArray()));
    XmlAttribute ns = x.CreateAttribute("xmlns");
    ns.Value = XhtmlNamespace;
    XmlNode body = x.SelectSingleNode("/html/body");
    if (body != null)
        foreach (XmlNode node in body.ChildNodes)
        {
            if (node.NodeType == XmlNodeType.Element)
                if (node.Attributes != null) 
                    node.Attributes.Append(ns);

            if (xhtmlBody != null) 
                xhtmlBody.AppendChild(xhtml.ImportNode
                    (node, true));
        }
    return xhtmlBody != null ? xhtmlBody.InnerXml : null;
}


Getting a new or existing component (for update vs creation, CoreService with a custom client library)
static Component GetNewOrExistingComponent
    (string componentName, Folder folder)
{
    Component returnObject = null;
    componentName = SecurityElement.Escape(componentName);
    XmlNamespaceManager nm = new XmlNamespaceManager
        (new NameTable());
    nm.AddNamespace(Constants.TcmPrefix,
        Constants.TcmNamespace);
    CoreServiceSession session =
        new CoreServiceSession(CoreServiceEndpoint);
    OrganizationalItemItemsFilter filter = 
        new OrganizationalItemItemsFilter(session)
            {ItemTypes = new[] {ItemType.Component}};

    string xpath = String.Format
        ("tcm:Item[@Title='{0}']", componentName);
    XmlElement listItems = folder.GetListItems(filter);
    if (listItems != null)
        if (listItems.SelectNodes(xpath, nm).Count > 0)
        {
            string componentId = listItems.SelectSingleNode
                (xpath, nm).Attributes["ID"].Value;
            returnObject = session.GetObject
                (new TcmUri(componentId)) as Component;
        }
        else
        {
            returnObject = new Component(session, folder.Id);
        }
    return returnObject;
}

Note: This sample uses a custom client Library I wrote on top of the CoreService, and this library is not available yet - and I'm not sure I will make it available at all due to how long it took me to write it, and the fact that it is a work-in-progress. Releasing it means supporting it, and I unfortunately don't have the time to support my plants at home, let alone a still-half-buggy library that someone may try to use in production systems. Anyway, the code just looks like TOM.NET, so you shouldn't have any trouble reverse-engineering what this code does.

Sunday, March 27, 2011

Rants on Tridion implementations

Those of you who know me, and work/worked with me, know that my job is not always an easy or necessarily happy one. In a nutshell, I tend to tell customers that "if you see me walk into your project, it means you're in trouble".

So, if you're about to start implementing Tridion, and you don't want to see me walk into your project to fix it, here's a few things to remember:

Before you try to do XYZ with Tridion, try to do it without Tridion. Seriously, if you don't know what the expected output of a page is, how do you expect to write a template that "does" it?

If you think you know WCM and therefore learning Tridion is a non-issue, think again. Then re-think. And a year later re-evaluate what you know about WCM. If there is one thing I can tell about Tridion and the other WCM packages available, is that Tridion IS different - and customers buy the software for those EXACT reasons that make it different. If you're planning to implement Tridion just like you would [insert random WCM package here], then why don't you go implement [random WCM package] instead? Many times I've heard things like "We're not planning to use BluePrinting", "why can't I just create pages" and "feature XYZ should be out of the box" (this last one is my favourite, since everyone wants XYZ done differently, but out of the box anyway). The higher-up people that made the decision to buy Tridion were likely triggered to do it based on Blueprinting, Component-based content and the extensibility points offered - not because they thought the implementation team likes those concepts.

Stop being a language zealot. So what if you need to understand Java for deployer extensions? And so what if you need to use c# for Event Systems? It's not as if programmers care about that? You should care functionality and complete API, not what language. If language _really_ is an issue for you, then write your own mediator, there's even a sample for that in the documentation.

Make sure you understand that you will always need 2 types of people in your development team: Web designers and programmers. Web designers will not do a good job writing templates, and programmers are typically bad web designers. It is one of the best features of the product that both teams can work together by focusing on different template building blocks. So use it.

Think before you do anything. This should be a no-brainer, right? Some examples...
Everyone wants to implement SmartTarget, but it is OH-SO-RARE that people actually know what they want to do with it. Developers don't get it, they think they could have done everything themselves through code (missing the point that this is exactly what SmartTarget is about).
Audience Segmentation? You need to know the _current_ audience before you start segmenting it.

And I could go on ranting, but enough negativity for today. Here's how I tell people to learn Tridion.
  1. Get yourself a development environment to play with.
  2. Find your way into the Tridion Developer Forum (via Customer Support).
  3. Get yourself enrolled into a Technical Training. Really. It will open your eyes and save you a lot of time.
  4. Read the template implementation guide. I am not kidding, RTFM can do miracles for you.
  5. Now implement a simple, one-page site. Make sure all content is translatable via blueprinting, and editable via SiteEdit.
  6. Once that's working, implement the multiple language versions of that site.
I tend to tell people to start with something really simple (crawling before walking). Like the Google home page, for instance.

OK, enough ranting for the day, happy thoughts and enjoy implementing Tridion. It is an amazing piece of software, and once you get it, you will think differently about WCM systems.

Sunday, February 13, 2011

Tutorials and Copyright...

I'm having a bit of a conundrum here. I wrote a few quite extensive Tutorials on Tridion 2011 which I want to make public via Tridion World but I can't understand if I'm infringing copyright or not.

Let me explain: In these tutorials there are very detailed, step-by-step instructions with loads of screenshots. My goal here is to make sure I don't ever again get basic questions like "what do I need to install for Tridion to use an Oracle database back end?" or "What are the Windows 2008 R2 Roles I must install?".

Of course, having Tridion screenshots is NOT copyright infringement, because I work for the copyright owner and I would be distributing it via the copyright's owner website. I am allowed to create those screenshots and empowered to distribute them via Tridion World (but I am not allowed to distribute it via my own website, even though many other people do that and we don't seem to care much about it).

The way I see it, I can't really distribute the Oracle Client installation screenshots, or Windows 2008 install, or the SQL Server 2008 R2 installation screenshots.
And if I remove those screenshots, the tutorials are not as detailed as I need them to be.

Anyone out there with suggestions? Should I contact the 3rd parties (Oracle and Microsoft mostly) and ask for their approvals?

I'll figure it out...

Update: found some info on Screenshot copyright in general and Microsoft guidelines for screenshots, and it looks like I'm in the clear, since I do not modify any of the screenshot content, do clearly identify it as being from an Oracle or Microsoft product and don't do anything evil with it.

So, new tutorials to show up soon in Tridion World

Saturday, November 13, 2010

Tridion Content Delivery and Caching

I recently had to assist a customer increasing the performance of their (Tridion-powered) site. The initial claim was that Tridion caching was not performing as expected and their database was being hit too many times.

I have used Tridion cache in all my projects, and especially when coupled with Dynamic Component Presentations I see drastic performance improvements. I don't remember ever having performance issues related to this, so I was a bit astonished as to the claim.

A quick overview of the code for this "static" site quickly revealed the reason why cache was not performing as desired - and I'll get to this in a second.

The Tridion content delivery cache uses a fairly complex dependency algorithm and something we call the "Cache Channel Service" to notify all delivery nodes when a given item has been published/republished/unpublished and therefore invalidate its cached version. When all is operating normally you will NEVER get an out-of-date page, even on a large (100+ servers) delivery environment. (You can read more details about the Cache Channel Service on this article at SDLTridionWorld).

However, what very often developers seem to not understand is what is cached, and what is a "dynamic" page in the context of Tridion. So let's do some definitions here.

Tridion Dynamic Page.
We call a page "Dynamic" not when it responds to a user's behavior, preferences or profile. We consider a page as dynamic if the system doesn't necessarily "know" what components will be displayed at the time the page was published. A good example of such a page is a "press release index" page, where the component presentations displayed are dynamically retrieved from the Content Broker at run time.

A page that includes ASCX controls to perform taxonomy lookups and determine which component presentations to display is not what we would call static - even if the page contains no logic to interact with the user's profile (which raises some more questions about why the taxonomy queries are being performed, but that's an issue for another day).

Tridion Object Cache
As the name implies, the Tridion object cache contains all the recently used Tridion objects loaded by your application - this typically includes Page Metadata, Component Metadata, Component Presentations, Dynamic Links, Keywords, Taxonomy objects, etc.

It allows us to minimize the number of times a given object is loaded from the content repository (file system or database) by storing a cached version of it - which gets invalidated only when 1) it is republished/unpublished or 2) the cache runs out of usable memory (configurable setting, by default set to 16 MB).

OK, so what does "object" cache mean?
It means that queries to the content broker (for instance "all press releases sorted by last published") will result on a set of objects being received by your application - and all those objects will probably be in memory already. So when you call ComponentPresentation.GetContent() you  will have an average wait time of 0 milliseconds or thereabouts.

However, your query results are not cached. In context of:
  • How cache invalidation occurs;
  • What we consider dynamic;
  • How often your content may be updated,
it makes sense that database query results don't get cached - otherwise any publishing action would invalidate all query result caching, and on a site that is updated thousands of times a day, this would result in more cache invalidation messages than anything else.

We could automatically make the results cached for a duration of, let's say, 5 minutes - but then you don't get the latest results, etc.

So Tridion (as we expect) took the "hands-off" approach of letting you control the cache through your application.

OK, so back at the issue at hand. I'm trying to ensure that the page I currently load, which may display up to 10 Component Presentations based on keywords attached to these components, improves its average load time from 1 second to as quick as possible. Since all these queries are going to the database, even if database cache is performing correctly, you will have to cope with additional db connections, network latency and what-not - multiplied by 10-12 queries per page, and here's a recipe for "slowness".

This site doesn't get updated very often, and has a very high number of average sessions, so I decided to test it with a 5 minute ASP.NET cache object for all my queries. Each individual query will be cached for a maximum of 5 minutes, which is an acceptable value for content editors/publishers.

What did I find?
Average load time went from 800 milliseconds to 17 milliseconds with an extremely simple change to my code.

For many reasons, I will not post the code as is currently being used at the customer, but here's the basics of it.
A wrapper method was created for Query (Tridion.ContentDelivery.DynamicContent.Query) which takes 2 parameters: the query object and a unique (per query) cache key. This cache key is nothing more than the string concatenation of the query parameters.

private String[] ExecuteTridionQuery(Query query, 
      String CacheKey)
{
  String[] results;
  if (Cache.Get(CacheKey) != null)
   results = (String[])Cache.Get(CacheKey);
  else
  {
  results = query.ExecuteQuery();
  Cache.Add(CacheKey, results, null, 
    DateTime.Now.AddMinutes(5), 
    System.Web.Caching.Cache.NoSlidingExpiration, 
    System.Web.Caching.CacheItemPriority.Normal, null);
  }
  return results;
}

And voilà, instant 60x boost to your "static" page.

N

Monday, October 25, 2010

#upintheair

I get frequently asked "where I've been lately", and been finding it really hard to tell people where I've been, simply because it mostly feels like I only briefly "was" anywhere, never really got to be there - but I do remember going there and coming back.

So, here's a list of where I've been to this year for work, that I can refer people to if I don't feel like telling them... :)

  • San José, CA (
  • Laguna Beach, CA
  • Newport, CA
  • San Francisco, CA
  • Oakland, CA
  • San Ramon, CA
  • Las Vegas, NV
  • Washington, DC
  • Phoenix, AZ
  • Columbus, OH
  • Amsterdam, The Netherlands
  • Helsinki, Finland
  • Lisbon, Portugal

Friday, October 08, 2010

MVP Nomination stats

Got ten nominations in less than a week, so it's looking pretty good for the 2011 MVP awards.

With still nearly 3 months to go (nominations are valid if received before January 1st 2011) I'm hoping to have many more candidates! See how you can nominate someone for an MVP award here.

An interesting fact is that 85% of people nominating others are based in the Netherlands, the UK has not nominated anyone yet, and only one person in the USA has nominated someone.

There's clearly something wrong with those numbers, last time I checked the US had overtaken the Netherlands and the UK in number of visits to the forum and SDLTridionWorld, however the community is still very much based in and around Amsterdam.

A second interesting fact - which I hadn't noticed until someone mentioned it in the MVP summit last week - is that we have several (4) MVPs based in the Netherlands, but none of them is dutch. Actually, we don't have any dutch MVPs, which is quite odd if you look at the company's history. Maybe it will change this year?

Well, keep 'em coming, there is no maximum number of MVPs, all you need to do is to be valuable to the community, and share your knowledge.

Thursday, October 07, 2010

MVP Summit 2010, Fortaleza do Guincho, Portugal

Judging from all the activity on twitter, one would think that the MVPs locked themselves in a room and did nothing else but code.

Indeed, I think we got something very useful off the ground with the Hello World GUI extension sample, and the Content Interaction extension (aka MVP Fondue Kit), but what I really liked the most was the opportunity to spend some time with the Tridion MVPs and pick their brain about the Tridion community, what to improve, what to expect from 2011, the whole MVP nomination process, etc.

And, of course, the location!
Surrounded by the cliffs of Guincho and the imposing Serra de Sintra, the scenery has to be one of the prettiest I've seen.

I'm obviously biased, having lived for 11 years pretty close to this location, but I had never stayed in the Fortaleza do Guincho hotel before, and I must say it was quite a good choice for the event, as we couldn't have asked for more.

So, rather than bore you with more details about what the MVP did or didn't while in Portugal, I'll just leave you with a couple more pictures...




Monday, July 26, 2010

Phoenix, Arizona

Just added one more city to my list of "places I've been to for work". It's 101 degrees outside, at 9:36 PM (that's 38 degrees celsius).

Pretty long week ahead, being involved in a rather large Proof of Concept for an amazing reference if we get the deal.

Time will tell, I hope to announce this company as a customer soon. Now I think I'm going to pass out in bed.

Amazing how you can fly for 5 hours and 1) never leave the same country and 2) land in a place that feels just like the place you left from - except for the temperature, that is.

Thursday, July 22, 2010

This is cool... Tridion 2011 from my iPhone

After all the talk about Tridion on the iPad I thought that if it runs on the iPad, it should run on the iPhone, right?

Right indeed.

Not that I think it's a very useful client, but it does work...

N

Wednesday, July 21, 2010

Preparing for 2011 MVPs

Last year we launched the SDL Tridion MVP program, and being the first time it took a rather "Career Achievement" look to it, and (perhaps unfortunately) many of the nominations (over 60%) were for SDL employees.

No matter what people think of it, we decided to create an independent Selection Panel that would select who deserved the MVP title, and awarded it to those that did make an exceptional job of assisting people in the community.

In preparation for the 2010 MVPs I can confirm that we will keep the independent selection panel (with a couple of adjustments as to the members of the panel to adapt to people's changes in careers), but this year we will not allow for SDL employees to be nominated.

This means that great Tridion resources like Jeremy, Julian, Jeff and Peter will not be 2011 MVPs (and, of course, yours truly).

Now that this is out of the way, here's the 2nd part of my message for today...

Why would you want to be an MVP? 

Granted, being the first time we were doing it, there was a lot of guess work as to what people would want. First - and perhaps foremost - you get to have your name in a rather exclusive list of Tridion professionals. I know of at least 2 people that got contacted for work directly from being on that list, and there's probably more.

Second, you get a shiny award to show off to your friends (who already considered you a geek beforehand, and will now have confirmation of your uber-geek status worldwide).

Third, you get access to a MVP-only Linked-In group of very dubious benefit at the moment.

Fourth, you get to spend a "work" weekend with all your fellow MVPs on a nice sunny location, 1-star Michelin restaurant, and breakfast by the beach (aha!).

Fifth, and professionally the most important, you get access to anything related to Tridion. You want to participate in "internal-only" bootcamps? No problem. You want some version of some software? No problem. Want to play around with Tridion 2011 Beta? No problem. Want to escalate an issue with Customer Support? No problem (well, depending on the issue). Need access to a license, information on some upcoming product, you-name-it? No problem.

So, question for the day: What are you doing now that makes you a great candidate for the MVP award next January?

N