Building a SharePoint 2010 WSP Using TeamCity

avatar

I’ve been using Continuous Integration for years.  It’s been a part of almost every project I’ve worked on.  Prior to a few months ago, I was a CruiseControl.NET devotee, but recently a few of my colleagues expressed a preference for TeamCity.  I tried it, and now I’m a convert!

However, the Microsoft stack is not set up with CI in mind.  You’ll need to use a few tricks to set up your build on a computer which does not have a full dev environment.  This is particularly true when developing for SharePoint 2010 using Visual Studio 10.

Using TeamCity

Setting up TeamCity is pretty straightforward.  It’s a free product (up to 20 builds), and can be downloaded on the JetBrains web site.  I won’t go into the basics of TeamCity right now. However, once the product is installed, start by setting up a simple project with a version control settings, but no build steps – it simply downloads the code from your repository.

Preparing to use MSBuild

There are quite a few dependencies to satisfy, for a SharePoint build.  You’re using .NET 3.5, but you’ll want to make sure to use MSBuild 4.0 if you’ve been using VS2010. Features like WSP creation are not available in earlier versions.

Setting up dependencies

I used to do this step though trial and error, but recently found a great resource for this: http://msdn.microsoft.com/en-us/library/ff622991.aspx.  Follow the instructions in step 1. (Prepare the Build System).  Obviously we’re not using TFS here, so skip that step. This step outlines the dependencies, and instructs us on which dll’s we need to manually add to the GAC.  There’s a whole list.  The short explanation is that you copy the dll’s from your dev environment, and place them into the GAC the build server.

One “gotcha” here is that that you need to make sure you’re using the correct version of gacutil.exe when adding items to the GAC.  The reason is that .NET 4.0 adds a second GAC(!), so if you get the following message, you’ll know you have this problem:

Failure adding assembly to the cache:   This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.

On my machine, the path of the proper version of gacutil.exe was located in

C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\gacutil.exe

Make sure you are working from the most recent version of the Microsoft Windows SDK.   The following page should take you there: http://msdn.microsoft.com/en-us/windows/bb980924.aspx

Remember, YMMV here.  If you do not have SharePoint installed on your build machine, you’ll have to add any SharePoint dll’s necessary to build your project as well.  Anything that you miss will be readily apparent in the next step…

Adding your MSBuild step to TeamCity

Go back to the project you set up, and add a Build step.  Select MSBuild from the Dropdown. Your project should look similar to this:

image

Notice the Command Line Parameters setting.  IsPackaging=True causes the build to actually generate WSP’s for any of your projects that are configured to do so.  Without this parameter, a simple build will be performed.

Hope you enjoyed my first post!  Let me know how it goes.

Share

Implementing Favorites in SharePoint 2010

avatar

As a SharePoint consultant, I’m often asked to provide features which “should” exist, but Microsoft just doesn’t provide. Often these are features which might be common in the Web 2.0 world, but – well, not here.

In one of my current projects (based on a Publishing Site), the paradigm of a “favorite button” is central to the desired site functionality. Users should be able to “favorite” any document or folder. These documents and folders are visible in a centrally located list, along with metadata items such as Modified Date and Author.

There are many possible ways to implement this, but initially I chose to use SharePoint 2010’s Social Tagging feature as the basic building block. It’s already set up to store link information by user, and integrates with the Keywords area of the Term Store. On the back end, this is the same mechanism used when you click “I like it” on any page.

This article is more concerned with the back end of things – the code listed below can be wrapped in web services, web parts or whatever you like, to provide functionality to the end user.

Tagging items

Social Tags are essentially key/value pairs, with the key being a Uri (e.g. the url of a web page), and the value being a description. In addition to the tag of “I like it”, other tags may be created in the Keywords area of the Term Store, and then used to tag documents. Here’s the code I’m using to tag a document:

[csharp]
///

/// Updates or adds a social tag for this user.
/// User info is derived from context.
/// Tag is added to term store if necessary.
///

public static void UpdateSocialTag(SPSite site, string socialTagName, string title, string url)
{
SPServiceContext context = SPServiceContext.GetContext(site);
SocialTagManager mySocialTagManager = new SocialTagManager(context);
//Retrieve the taxonomy session from the SocialTagManager.
TaxonomySession taxSession = mySocialTagManager.TaxonomySession;
TermStore termStore = taxSession.DefaultKeywordsTermStore;

Term newTerm = termStore.FindOrCreateKeyword(socialTagName);
Uri tagUri = ConvertToUri(site, url);
mySocialTagManager.AddTag(tagUri, newTerm, title);
}
[/csharp]

The reason this method is called “Update” is that if this Uri has already been tagged, that tag will be replaced.

Retrieving a list of favorites

I’ll also want to display my list of favorites. Social tagging does not intrinsically lend itself to pulling out the list of items which have a particular tag, but we can add that capability using the following code:

[csharp]
///

/// Get the items tagged with TermName for this user.
/// If empty, return an empty array
///

internal static SocialTag[] GetUserSocialTags(SPSite site, string termName)
{
List socialTags = new List();

SPServiceContext serviceContext = SPServiceContext.GetContext(site);
UserProfileManager mngr = new UserProfileManager(serviceContext); // load the UserProfileManager
UserProfile currentProfile = mngr.GetUserProfile(false);// Get the user’s profile

if (currentProfile == null) return socialTags.ToArray(); // user must have profile
SocialTagManager smngr = new SocialTagManager(serviceContext);

// Get the SocialTerm corresponding to this term.
SocialTerm favTerm = GetSocialTerm(termName, currentProfile, smngr);
if (favTerm == null) return socialTags.ToArray();

// Get the terms for the user. Loop through them for conformity.
SocialTag[] tags = smngr.GetTags(currentProfile);
foreach (SocialTag tag in tags)
if (tag.Term == favTerm.Term)
socialTags.Add(tag);
return socialTags.ToArray();
}

///

/// retrieve a named social term.
///

private static SocialTerm GetSocialTerm(string tag, UserProfile currentProfile, SocialTagManager smngr)
{
// Get the terms for the user
SocialTerm[] terms = smngr.GetTerms(currentProfile);
SocialTerm favTerm = null;

//Iterate through the terms and search for the passed tag
foreach (SocialTerm t in terms)
{
if (string.Compare(t.Term.Name, tag, true) == 0)
{
favTerm = t;
break;
}
}
return favTerm;
}
[/csharp]

This code forms the “core” of my favorites system. The ability to tag a document (or remove tag) is wrapped in a web service to allow us to provide provide AJAX functionality. I wrote a web part to display the favorites, with simple sorting and filtering.

Metadata features

One missing element is the metadata, a part of the requirement I mentioned above. For this, I wrote code (as part of my Favorites Web Part) to pull out the necessary metadata for each Uri given, provided it’s a reference to the current site.

Share

Using the .s4-titlerowhidetitle in your custom master page.

avatar

When creating a custom master page you want to make sure to keep the s4-titlerowhidetitle class.  If you don’t have this in your custom master page you can find the tag  directly after the #s4-bodyContainer in your v4.master. (Please don’t edit the v4.master directly!)

<div  id="s4-titlerow" class="s4-notdlg s4-titlerowhidetitle">
...
</div>
 

IMHO it’s a gem when editing your SharePoint page. When you edit your non-branded SharePoint page ever notice how the header area disappears, that is the .s4-titlerowhidetitle at work.  I definitely want to keep this functionality in my custom master page.

For my custom master page I placed the div tag around everything in my header (logo, search, top navigation, title area, breadcrumb, and status bar container).

5-10-2012 9-50-59 AM

5-10-2012 9-39-02 AM

Now when I edit my page everything in my header is neatly tucked away, and I don’t have to scroll down to see my main content.

image

Thanks for reading!

Share

A cleaner layout when using the Web Part Tool Pane!

avatar

How many times have you gone to edit a web part on the page, only to have to scroll to the right to see the tool pane?

5-10-2012 7-57-25 AM

If you happen to have a large screen then this is not much of an issue, but if you have a smaller screen or have numerous windows open it can become a pain.

Here is a great workaround I have come up with that solved my problem.

Move the MSO_Content Div Tag

First in your custom master page, you want to locate the div tag <div id=”MSO_ContentDiv” runat=”server”> (for more clarification on this div tag I suggest reading this post by Waldek Mastykarz). 

I want to  wrap the content that holds the left nav and the main content with this div tag. For this example I added the div tag directly before the  <div id=”s4-mainarea” class=”s4-pr s4-widecontentarea”>. 

<div id="MSO_ContentDiv" runat="server">
<div id="s4-mainarea" class="s4-pr s4-widecontentarea">
....
</div><!-- end #s4-mainarea-->
</div><!-- end#MSO_ContentDiv—>


 

Update your custom CSS file

Next add the following CSS to your page layout or to your Custom CSS file.

#MSOTlPn_WebPartPageDiv #s4-leftpanel {display: none;}
#MSOTlPn_WebPartPageDiv div#MSO_ContentTable {margin: 0px; !important;}

 

A cleaner layout

When in normal edit mode your page looks like this.

5-10-2012 8-16-09 AM

When editing a web part and the tool pane is needed your page will look like this:

5-10-2012 8-25-15 AM

As you can see your left navigation is hidden and your content area has been moved over to the left. You could take this further with your page layouts and un-float specific elements so that they fall in line on the page for easier editing.

Note: If you have web parts in your left hand column that need editing this is not the solution for you.

Thanks for reading!

Share

SharePoint 2010 Customizations and Modal dialog Boxes

avatar

I blogged on this once before, but I just found the text part posted from 12/29/2009. So I am posting it again with updates.

When creating a custom master page with SharePoint 2010 you will run into issues.  First one: you find that the modal dialog (pop-up) is using some, or all, of your custom master page branding. 

How does this happen? This happens when you have set your system master page to use your custom master page. The site master page is used for publishing/content pages and the system master page is used by all the forms and view pages of the site. 

5-7-2012 9-54-31 AM

You don’t have these options (unless publishing is turned on) when you are using a team site or blog site, so your custom master page will also be used by the System Master Page.

What are my options?

One workaround is just not using your custom master page as the system master page (also known as the default, application _layouts).

There are times when you will use your custom master page in the system master pages, like team sites,  blogs or any other number of reasons.  When this page is customized using fixed widths, background colors and images, etc., it also changes the look and feel of your modal (pop-up) boxes.  

Using the .s4-notdlg

You can use the .s4-notdlg class. Randy Drisgill created a blog post on this subject dealing with Custom Master pages and Dialog Boxes on using the CSS class called s4-notdlg, this is a good workaround when you don’t want large blocks to show – like the header/title row, breadcrumb, left nav area, and footer/copyright.  The .s4-notdlg renders a display none. 

5-7-2012 9-40-07 AM

Using the .ms-dialog

Lets say you create a custom master page and you have a wrapper that uses a background image with a color:   .mywrapper {background: url("bg.gif") repeat-y left top #f8f8f8; }. 

5-7-2012 9-35-43 AM

This wrapper is also outside the #s4-workspace and the #s4-bodycontainer, if you use the the .s4-notdlg class – everything on your page will disappear in the modal dialog box.

5-7-2012 10-10-43 AM

Using .ms-dialog before the class that is causing issues and you can reverse the effects:
.ms-dialog .mywrapper { background-image: none; background-color: transparent;}

Now our modal dialog box looks normal.

5-7-2012 9-26-43 AM

Thanks for reading, and please let me know if this post has helped.

Share

Adding Custom Site Actions Items to my SharePoint 2010 Blog

avatar

When you first create a blog on SharePoint 2010 it seems clunky in allowing the management of posts, comments, etc. Since I have a fixed width blog I don’t use the third column. Yes you can move the web part but what fun is that when we can try something new and add some links into the Site Actions.

5-1-2012 10-45-41 AM

Chances are I could have broken my site by doing this, but when working with SharePoint you should have NO Fear.  Understand that when you are working on customizing master pages you will break your site many many times, its just part of the process.

Adding the Custom items

 

Open your custom master page and find the last item of the <SharePoint:MenuItemTemplate…. code and copy and paste that into notepad or copy the following code into notepad:

<SharePoint:MenuItemTemplate runat="server" id="MenuItem_CommitNewUI"
  Text="<%$Resources:wss,siteactions_commitnewui%>"
  Description="<%$Resources:wss,siteactions_commitnewuidescription%>"
  ImageUrl="/_layouts/images/visualupgradehh.png"
  MenuGroupId="300"
  Sequence="330"
  UseShortId="true"
  ClientOnClickScriptContainingPrefixedUrl="GoToPage   
  (‘~site/_layouts/prjsetng.aspx’)"
  PermissionsString="ManageWeb"
  PermissionMode="Any"
  ShowOnlyIfUIVersionConfigurationEnabled="true" />

Note: ID’s need to be unique make sure anything that uses an ID is changed. 

My first custom Site Actions item was Create Post so I updated my copied code and made the first change ID (<SharePoint:MenuItemTemplate runat="server" id="CreatePost"). Again anything that uses an ID should be unique.

The text that is the heading or title of your action is simply called Text – Text="<%$Resources:wss,siteactions_commitnewui%>" – remove the code and just add your own Text="Create Blog Post".

The description of your action is called Description – Description="<%$Resources:wss,siteactions_commitnewuidescription%>" – remove the code and add your own Description="Create a great Blog Post".

So far you should have:

<SharePoint:MenuItemTemplate runat="server" id="CreatePost"
  Text="Create Blog Post"
  Description="Create a great blog post"

The next item to change is the Image URL. I am sure you can add you own image and link it to the URL, but I used what was already there. I found the items that had the icons I wanted to use and then went back through the code to copy that image url and added it to my code. If you make your own images make sure they have a transparent background and use the same size (32 x 32) as the existing icons.

  ImageUrl="/_layouts/images/ActionsEditPage.png"

The site actions are broken up into Group ID’s and sequences. The last one  had a group ID of 300, set your group ID to 400.

5-1-2012 10-55-56 AM

5-1-2012 11-29-49 AM

Each item you add (Create Blog Post – 410, Manage Blog Post – 420 and Manage Comments – 430) will have a different sequence number. When creating my first item Create Blog Post I choose to sequence the items in groups of 10.

  MenuGroupId="400"
  Sequence="410"

Your code should look similar to this now.

<SharePoint:MenuItemTemplate runat="server" id="CreatePost"
  Text="Create Blog Post"
  Description="Create a great blog post"

  ImageUrl="/_layouts/images/ActionsEditPage.png"
 
MenuGroupId="400"
  Sequence="410"

Next we want to change the ClientOnClickScriptContainingPrefixedUrl="GoToPage(‘~site/_layouts/prjsetng.aspx’)". These are the links that will take us to Create and Manage Posts and Manage Comments. To get the correct URL you can use view source on your default blog page. The code you are looking for will be formatted in a LI. You can do a search in your view source for “Create a Post” and find the code you need to use. You would do the same for the other links you want to create.

5-1-2012 12-26-56 PM

<li>
<span style="height:8px;width:8px;position:relative;display:inline-block;overflow:hidden;" class="s4-clust"><a style="display:inline-block;height:8px;width:8px;"><img src="/_layouts/images/fgimg.png" style="border:0;position:absolute;left:-0px !important;top:-447px !important;" /></a></span><a href="javascript:" onclick="javascript:ShowPopupDialog(‘/site/Blog/Lists/Posts/NewPost.aspx?Source=/site/Blog/‘)" id="admlnk0">Create a post</a>
</li>

Comparing my view source to the existing code it was easy to find the link I needed to use.

ClientOnClickNavigateUrl="~site/_layouts/settings.aspx"

ClientOnClickNavigateUrl="/hwaterman/blog/Lists/Posts/NewPost.aspx?Source=/hwaterman/blog/"

The remaining items are Permissions, I selected to use the same permissions as the Site Settings item, however you can use whatever permissions you want.

PermissionsString="EnumeratePermissions,ManageWeb,ManageSubwebs…"

That’s it, your code should now look like:

<SharePoint:MenuItemTemplate runat="server" id="CreatePost"
   Text="Create Blog Post"
   Description="Create a great blog post"
   ImageUrl="/_layouts/images/ActionsEditPage.png"
   MenuGroupId="400"
   Sequence="410"
   UseShortId="true"
   ClientOnClickNavigateUrl="/hwaterman/blog/Lists/Posts/NewPost.aspx?
    Source=/hwaterman/blog/"
   PermissionsString="EnumeratePermissions,ManageWeb,ManageSubwebs,
    AddAndCustomizePages,ApplyThemeAndBorder,ManageAlerts,
    ManageLists,ViewUsageData"
   PermissionMode="Any" />   

I used this on my own blog site and have added it to a few others. I am sure this can be used for a number of different shortcuts you might want to place in the Site Actions of your custom master page.

Thanks for reading!

Share

Adding a twitter feed with a SharePoint xml viewer web part

avatar

Working on sites these days you have many social feeds that need to be added to your SharePoint site. One way we have accomplished this is using the XML viewer web part.

You can add this into a web part zone on your page through your browser or you can add the web part directly to your master page. I typically don’t add this directly into a client’s master page, but for my blog I did add it directly to my master page.

Browse to your site and add the XML Viewer Web Part to your page. To make this work you need the XML Link – this will be the RSS feed/code used to pull the information from twitter. Next you need the XSL Link, this will format the tweets that you are pulling from twitter.

Getting the XML Link

First thing you need is a link for your Twitter account.  For my site I use an RSS feed and can also control the number of tweets I want to show on my site (count=3). http://twitter.com/statuses/user_timeline/xxxxxxxx.rss?count=3.  Since Twitter removed the RSS feed on their site you can use this link to find your RSS feed link or you can use the following code, which is just as easy. http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=xxxxx

Now that you have your feed link you can add the XML viewer web part to your page/zone and make the proper connections.

twitter-post1

Code for the XSL Link

 

<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"

    version="1.0"

    xmlns:xsl="
http://www.w3.org/1999/XSL/Transform"

    xmlns:cmswrt="http://schemas.microsoft.com/WebPart/v3/Publishing/runtime"

    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss" xmlns:twitter="http://api.twitter.com"

    exclude-result-prefixes="ddwrt xsl cmswrt x"

    xmlns:ddwrt="
http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:ddwrt2="urn:frontpage:internal">

    <xsl:output method="html" indent="no" />

      <xsl:param name="rss_FeedLimit">4</xsl:param>

    <xsl:output method="html" />

      <xsl:template match="rss" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss" xmlns:twitter="http://api.twitter.com">

      <ul class="twitter-feed">

        <xsl:for-each select="channel/item">

          <xsl:if test="position() &lt;= $rss_FeedLimit">

                <xsl:call-template name="item" />

          </xsl:if>

      </xsl:for-each>

      </ul>

    </xsl:template>

      <xsl:template name="item">

        <xsl:variable name="item_title" select="description"/>

            <li>

            <p class="date">

              <xsl:value-of select="substring(pubDate, 1, 16)" />

            </p>

           <p class="tweet"> 
             <xsl:attribute name="title"><xsl:value-of select="substring-after($item_title, ‘:’)" disable-output-escaping="yes"/></xsl:attribute>

                <xsl:value-of select="substring-after($item_title, ‘:’)" disable-output-escaping="yes"/>

            </p>

            </li>

      </xsl:template>

</xsl:stylesheet>

Copy this code into notepad and name it twitter.xsl or yournamehere.xsl. Then upload the file to your Style Library or another library where you keep your custom xsl files.

Using the feed count in this code you can change this number to increase or decrease the number of twitter items showing in your web part (<xsl:param name="rss_FeedLimit">4</xsl:param>).

For styling you can change the class for the <ul>, the date and the tweet are wrapped in a <p> tag and have their own classes as well.

Credit to Michael Mendelson for letting me show off his code.

Thanks for reading!

 

Share

We are all in this together

avatar

Pile of moneyThe recent breaking news regarding GSA continues to bring to light the need for our citizens to band together and help us return to a country envied by the world. Most of us are aware of the tremendous deficit that our country continues to operate on and, even if you try not to listen, the coverage of ways to reduce the budget is in every media outlet known to man. Politicians are elected based on convincing us that they can solve the budget problem. I am hopeful that we will ultimately pick a path and find a way to actually achieve success in balancing the budget, in reality we have to.

I certainly understand solving the budget deficit is complex but I also understand it involves controlling and reducing costs. It is clear that GSA in this example did a poor job of that, but GSA is not the only guilty party. I have worked in support of government agencies my entire working career and have witnessed wasteful spending and habits more than once, I’m sure we all have. As our country continues down the road of financial responsibility we can all contribute more to the health of our country beginning today by taking two steps:

1. Controlling costs by making sound decisions on purchases and cost expenditures.
2. Focusing on efficiency improvements in the services we deliver, not the size of the solution.

Both of these steps sound easy, but can we do it? We have to remember that as a contractor or a civil servant each and every expenditure that we recommend ultimately comes out of our pockets. So when you make a recommendation on buying something for your company or agency, ask yourself: If I had to buy this with my paycheck would I still recommend it? If no, then you probably don’t need it. When building a solution of delivering a service we need to change the focus to efficient operations. Historically, people have been proud of the size of the organizations they built, but size costs money, we need now to change the focus on pride of delivering not more for less, but what is needed for the minimum cost.

These two steps alone may not solve our budget deficit alone but it will begin to develop a culture that supports the enormous change that must occur to return our country to the greatness we crave.

Share

love my cloudshare

avatar

Recently I had to get a SharePoint Foundation environment up pretty quickly to test a branding solution that was built for a client. Kris Wagner had always talked up CloudShare, so I decided to give it a try.  Easy was not the word, it was easier than easy and now I am hooked.

Our company purchased a few licenses for CloudShare and I have to say this makes life easier for our IT gurus.  They were frequently asked at the last minute to build XYZ in the cloud for this demo or this project.  Now they can focus on more important tasks and the developers and I can spin up almost any environment needed in minutes. 

If I want to try something new that I have read in a blog post, I am off into my CloudShare environment. I am not worried when and if I break anything, just delete the environment and spin up a new one in minutes. I also don’t have to tell IT that I broke the server they just built because I was playing in SharePoint. Another benefit I don’t have to carry extra HD’s around for my VM’s (yay!) and I can use this from any computer.

Some of the features include, sharing environments, assigning team members and quick snapshots.  Want to check out the HP Media Center for SharePoint? Easy just visit the SharePoint Showcase where you can “easily create an instant SharePoint environments for development, testing and demos using one of CloudShare’s  pre-configured solutions”.

Thanks for reading.

Share

Will an iTV be H.A.L. for your home?

avatar

While I cannot claim any insider information on the rumored Apple iTV, nor have I been analyzing supply chains or the purchase of 52″ glass, I have to confess to a certain fascination with the potential for an Apple treatment of television, particularly after reading the Steve Jobs  biography over the holidays and getting an iPhone 4s for Christmas.

As with many disruptions from Apple, I think many people are missing the point of an iTV. They’re focusing on what it might mean for television rather than what it could mean for your home. The iPhone certainly changed the way I make phone calls, but that was only a small part of what the iPhone really was. In the same way, I have no doubt that the iTV will make the consumption of interactive video content insanely simpler, more intuitive, and more socially connected. I can’t imagine Apple launching a “TV” without those attributes.

But as a recent post in Mashable by Samantha Murphy points out, the real power of an iTV, if done right, will be as a Trojan horse for home automation. Any technologist who has played with Siri immediately intuits her awesome potential as she acquires more verbs and nouns and the integration with more apps. Now fast forward to an iTV. I cannot imagine an iTV without the ability to ask Siri to play a new sitcom that I might like or to remember to record the Capitals game. But what’s really cool is asking Siri to turn down the temperature when I leave the house through integration with Nest. Or for Siri to let me know that I’m running low on milk and whether that reminder should be added to my iPhone. Or for Siri to know that I’m about to watch a feature movie and ask whether she should dim the lights.

iPhones and iPads are already rich mobile sensor platforms, they’re already wireless hubs, they already contains open APIs and app ecosystems, they have voice recognition and artificial intelligence. Why wouldn’t an iTV have all those things? And what could the app ecosystem do with them?

I’m starting to realize that we’re 12 to 18 months away–maybe 18 to 24 if Apple holds back some capabilities for the iTV2–from having a proto-H.A.L. in our homes.

It’s also interesting to see how Microsoft responds. They have so many advantages in this space with the XBox platform and Kinect. They SHOULD already be the dominant players in home automation, but they haven’t yet brought the entire ecosystem together in the way Apple consistently has. Google is also clearly moving in this direction with their Google TV product. But as with phones and tablets, it’s hard not to imagine Apple cracking the code first.

From my perspective at Synteractive, it’s also intriguing to think about what this will eventual mean for enterprises and the consumerization of IT. Both the iPhone and iPad rocked our consumer lives first before starting to change our business lives. I imagine the same will hold true. It’s insanely cool to start imagine the corporate applications that become possible with a cheap, standard platform for sensors + wireless + open APIs + app ecosystems + voice recognition + artificial intelligence.

Share

Subscribe and Follow

Sign up for new posts to be sent to your email.

Archives