Posts in Category "Marketing Cloud"

Adobe@Adobe at Sundance 2016

IMG_2159

The Adobe@Adobe Video Production Team was on hand at the 2016 Sundance Film Festival, helping out with two major Adobe initiatives being put on by Adobe’s Social Media Team at the event. Adobe was a leadership sponsor of the film festival this year, and helped celebrate independent film, storytelling, while helping to share stories about how Adobe’s industry leading video tools help bring new ideas to life.

PillowTalk Interviews

The first initiative, PillowTalk, was a series of live-streamed, and on-demand interviews with a number of filmmakers, actors, and artists. The series was unique in that it invited the guests to be interviewed in bed, in a less formal setting to discuss their films, and what they see coming up next in the industry. The A@A Video Production Team provided their technical production skills to broadcast out these interviews over YouTube Live, reaching over 1.4 million viewers of these videos. Taken from an unusual top-down perspective, the interviews were extremely well received by both guests and fans alike, as the interviews took place on a bed right inside the extremely busy Airbnb Haus, allowing onlookers to watch the interviews live. It was a lot of fun, and provided a fresh, relaxed interview environment, that seemed in-tune with the atmosphere of the always amazing Airbnb Haus. The A@A Team continues to help with Adobe’s expansion into social live-stream experiences, as that medium continues to be a fun and interactive way to reach customers.

Make It Experience featuring Adobe Post

Between PillowTalk interviews, and in partnership with Airbnb, attendees were invited to jump into bed themselves, to take a photo memory of their Sundance experience, while getting the chance to bring their photos to life with Adobe Post, Adobe’s newest mobile app that builds stunning graphics in seconds. The Adobe@Adobe Video Team was able to develop an efficient workflow that allowed attendees to take a photo in bed, and then share that photo to an iPad, which allowed editing of the photo in Adobe Post. The workflow then automatically applied a branded Adobe & Airbnb border to the image, and shared the photo back to the user via Twitter, email, or iMessage. The activation was a huge success, with over 3000 people being photographed over the week. Despite the complexities of moving digital assets around so quickly, for so many people, the workflow was still able to easily able to handle the crowds, and help people get their shared photo in a timely manner. The solution utilized a couple of third party technologies such as a CamRanger wireless DSLR remote control that allowed camera control from an iPad (as the Canon 5D MkII we used was ceiling mounted), as well as a great iPad application called “Workflow” that allowed for easy automation for what would have been manual tasks, like adding a custom border to a photo, or sending a Tweet or email. The magic of Adobe Post ensured that everyone’s photo turned out looking great, and we utilized the Creative Cloud for our photo gallery of final images! Of course, the impact of this social engagement was measured in Adobe Social, where Adobe was able to greatly exceed their 2015 numbers for brand reach.

Once again, it was an honour for the A@A Team to be included in these activities at Sundance 2016 (while getting the chance to catch a couple of wonderful films as well!), and we are pleased that we were able to help expose new people to some of Adobe’s amazing technology, while helping to strengthen the Adobe brand. Looking forward to helping out again in 2017!

CC Tutorials Gets Connected

Creative Cloud Tutorials is a mobile app our team built that delivers training content to our customers. CC Tutorials was built after talking with the Adobe Primetime team about use cases for their new Primetime Player SDK.

The product team wanted to provide a full featured player to developers to help them get started. We wrote the video player inside CC Tutorials as that code that the product team could provide to our external customers.

Along the way our CC Tutorials App now has over 165,000 downloads.

Continue reading…

Personalized Customer Experience

The Adobe@Adobe team have been working on early builds of AEM Screens to deliver a personalized customer experience in San Jose’s new Customer Experience Center. The center opened in mid-September with a variety of next generation digital experiences. Working with the Brand, CEC and AEM Screens teams we built an internet of things (IoT) enabled experience.

“A@A brings personalized information screens on a new level; a perfect, 1st reference for AEM Screens.”

– Martin Buergi, Product Manager

Continue reading…

Build single page applications using AngularJS on AEM

Larger presentation can be found here

Code repo is here

More detailed video sessions will be posted here the second week of July

CQ Tips and Tricks #4 – Switching SiteCatalyst Reporting Suite at runtime based on host

Recently I was configuring a new CQ install and we needed to switch SiteCatalyst reporting suites based on the host the application was running on.

The way we ended up doing this was by adding some custom javascript in the General SiteCatalyst Settings section of the framework.

//check for communities.dev|qa|stage.adobe.com or prod
s.dynamicAccountSelection=true;
s.dynamicAccountList="adbecush=communities.adobe.com;adbecush=communities.adobe.com;adbecush=cush-author.corp.adobe.com";

Here is a screen shot for reference.
sitecatlyst_settings

CQ Tips and Tricks #3 – Getting a service from JSP

This is just a quick little example of my two favorite ways to grab a service in a JSP page.

adaptTo is super handy

<%@taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling/1.0"%>
<sling:defineObjects />

<%@ page session="false" import="com.day.cq.security.UserManager"%>

<%
    UserManager userManager = resource.adaptTo(UserManager.class);
%>

see this page for more details on Adaptors make sure what your trying to adaptTo is mapped correctly. For example in this case I went from Resource to UserManager not all classes support AdaptTo.

Another simple way it to get a service is using the slingScriptHelper

<%@taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling/1.0"%>
<sling:defineObjects />
<%@ page session="false" import="com.day.cq.contentsync.handler.util.RequestResponseFactory"%>

<%
    RequestResponseFactory requestResponseFactory = sling.getService(RequestResponseFactory.class);
%>

CQ Tips and Tricks #2 – Handy Urls

This is by no means an exhaustive list of all the handy URL’s found in the CQ 5.5 – 5.6 platform.  This is my short list of clipboard handy URLS.

URLS

/crx/explorer/index.jsp  – CRX explorer

/crx/de/index.jsp – CRXDE Lite url

/libs/cq/search/content/querydebug.html – Query debug tool

/libs/granite/security/content/admin.html – New user manager standalone ui  [5.6 only?]

/libs/cq/contentsync/content/console.html – Content sync console

/system/console/bundles – Felix web admin console

/system/console/jmx/com.adobe.granite.workflow%3Atype%3DMaintenance – Felix web admin console JMX / Workflow maintenance tasks

/system/console/jmx/com.adobe.granite%3Atype%3DRepository – Felix web admin console JMX / Repository maintenance tasks

/system/console/depfinder – This new 5.6 tool will help you figure out what package exports a class and also prints a Maven Dependency for the class.

/libs/granite/ui/content/dumplibs.rebuild.html?rebuild=true – Helpful link for debugging caching problems. Wipes the clientlibs and designs and forces it to rebuild it. Thanks to Mark Ellis for this link.

/system/console/adapters – This link shows you the Adapters are registered in the system. This helps you figure out what you can adaptTo() from resource to resource.

/libs/cq/compat/components/ntupgrade.html – This link allows you to update Node Types in the system. Thanks Tamer.

https://www.adobeaemcloud.com/content/packageshare.html – Link to the external interface for the CQ Package Share.

http://localhost:4502/crx/explorer/diagnostic/prof.jsp – Shows you the built in profiler

http://localhost:4502/system/console/profiler – Shows you the built in profiler

Params

wcmmode=DISABLED – This handy publisher parameter turns off CQ authoring features so you can preview a page cleanly
debugClientLibs=true – This will help to debug clientLibs includes

If you have more handy URL’s and or parameters that you think others should know about please comment on this blog entry and I will add them to the list.

CQ Tips and Tricks #1 – How to define a SlingServlet [CQ5.5-5.6]

There are many ways to define an OSGI service.
This is the preferred coding style for CQ version 5.5-5.6 that we follow on our team.

Registering the servlet by path

import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;

import javax.servlet.ServletException;
import java.io.IOException;

@SlingServlet(
    paths={"/services/unicom/v1/"}
)
@Properties({
    @Property(name="service.pid", value="com.adobe.unicom.v1.servlets.OmnnitureLoggingServlet",propertyPrivate=false),
    @Property(name="service.description",value="Omniture service call logging servlet", propertyPrivate=false),
    @Property(name="service.vendor",value="Adobe Systems Incorporated - Adobe@Adobe Team", propertyPrivate=false)
})
public class OmnnitureLoggingServlet extends SlingAllMethodsServlet
{
    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
    {
        //Do something fun here
    }

    @Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
    {
        //Do something fun here
    }
}

OR  registering the servlet by resource type and extension

import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;

import javax.servlet.ServletException;
import java.io.IOException;

@SlingServlet(
    resourceTypes = {"rep:User"},
    methods = {"GET", "POST"}
)
@Properties({
    @Property(name="service.pid", value="com.adobe.unicom.v1.servlets.OmnnitureLoggingServlet",propertyPrivate=false),
    @Property(name="service.description",value="Omniture service call logging servlet", propertyPrivate=false),
    @Property(name="service.vendor",value="Adobe Systems Incorporated - Adobe@Adobe Team", propertyPrivate=false)
})
public class OmnnitureLoggingServlet extends SlingAllMethodsServlet
{
    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
    {
        //Do something fun here
    }

    @Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException
    {
        //Do something fun here
    }
}

To handle all requests and filter on selector you can change the example above to read something like this.

import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;

import javax.servlet.ServletException;
import java.io.IOException;

@SlingServlet(
    resourceTypes = {"sling/servlet/default"},
    methods = {"GET"},
    selectors = {"report"},
    extensions = {"json"}
)
@Properties({
    @Property(name="service.pid", value="com.adobe.unicom.v1.servlets.OmnnitureLoggingServlet",propertyPrivate=false),
    @Property(name="service.description",value="Omniture service call logging servlet", propertyPrivate=false),
    @Property(name="service.vendor",value="Adobe Systems Incorporated - Adobe@Adobe Team", propertyPrivate=false)
})
public class OmnnitureLoggingServlet extends SlingAllMethodsServlet
{
........

To handle all requests for a Page with a special selector.
IE http://www.fake.com/content/page.mycustomselector.html

import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;

import javax.servlet.ServletException;
import java.io.IOException;

@SlingServlet(
    resourceTypes = {"cq:Page"},
    methods = {"GET"},
    selectors = {"mycustomselector"}
)
@Properties({
    @Property(name="service.pid", value="com.adobe.unicom.v1.servlets.OmnnitureLoggingServlet",propertyPrivate=false),
    @Property(name="service.description",value="Omniture service call logging servlet", propertyPrivate=false),
    @Property(name="service.vendor",value="Adobe Systems Incorporated - Adobe@Adobe Team", propertyPrivate=false)
})
public class OmnnitureLoggingServlet extends SlingAllMethodsServlet
{
........

To handle all requests for a Page with a special extension.
IE http://www.fake.com/content/page.myfakeext

import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;

import javax.servlet.ServletException;
import java.io.IOException;

@SlingServlet(
    resourceTypes = {"cq:Page"},
    methods = {"GET"},
    extensions = {"myfakeext"}
)
@Properties({
    @Property(name="service.pid", value="com.adobe.unicom.v1.servlets.OmnnitureLoggingServlet",propertyPrivate=false),
    @Property(name="service.description",value="Omniture service call logging servlet", propertyPrivate=false),
    @Property(name="service.vendor",value="Adobe Systems Incorporated - Adobe@Adobe Team", propertyPrivate=false)
})
public class OmnnitureLoggingServlet extends SlingAllMethodsServlet
{
........

For more details on the Felix Annotations see

Introducing the new CQ Typekit integration component

After it was announced that we were acquiring Typekit I had to go see what we were buying. I was pleased to find a great new tool for my web toolbox. Over the years I have had the displeasure of having to reject comp from designers because of their use of beautiful fonts. In some cases I had to cut up comps into a million pieces to try to perserve the intergerty of the design. Over all non standard web fonts have been a real pain to deal with. Yes, there have been other solutions to help me deal with custom fonts overtime but none I really liked. I really like Typekit and the website itself is a work of art.
I am going over the top a bit but its a great platform and I am glad we acquired the company.

Now that I have found a new friend in Typekit, I needed to introduce it to my best friend CQ. After my first integration I thought “Wouldn’t it be cool if an author could do this without any coding or IT help?”. So I went off and created a simple page property extension that allows a author to bind a page and its children to a Typekit kit ID.

The following is a video I shot demoing our new integration component which can be found on the CQ package share. Please forgive my lack of enthusiasm in the video. I was very tired on the day of the shoot.

Our customer package share recently underwent a major upgrade. While I am working on getting this package re-hosted in the package share here is a link to the current version.

Adobe’s social media strategy + Adobe Digital Marketing Suite = Awesome ROI

As a leader in digital marketing and digital media software, Adobe doesn’t have to turn far to find the products and technology that it needs to create, deploy, measure, and optimize digital marketing campaigns. For the launch of Adobe Creative Suite 6 and Adobe Creative Cloud, Adobe took the opportunity to showcase its robust social media initiatives and Adobe Digital Marketing Suite.

“We wanted to engage customers and drive solid business results through social media, so we had to clearly understand the impact of all our strategies,” says Maria Poveromo, director of social media for Adobe. “We not only set out to generate as much buzz as possible, but we also wanted to continually adapt our strategies along the way and see the returns.” Continue reading…