Monday, September 28, 2015

Microsoft Ignite 2015 Round Up / Summary

I've summarised some of the most interesting/important parts of my TechEd 2015 NZ notes in this post.

The top five sessions for the conference based on session feedback:

  1. The Secret to Telling Awesome Stories from Microsoft's Chief Storyteller
  2. The Microsoft DevOps Vision
  3. Aligning Architecture to Organisation
  4. Public Speaking Skills for Quiet People
  5. Torment Your Colleagues with the 'Roslyn' .NET Compiler Platform

My top sessions, in no particular order

Great Artists Steal: Build better software by applying patterns and ideas from different languages

Orion Edwards - @borland

github.com/borlande/Ignite2015

  • Ruby
  • C# Scoping lambda for locks and transactions, building up and then committing.
  • Consider the parameter naming. Try and form a phrase. C# named parameters.
  • Swift
  • if let - unwarps null references in if/else.
  • C# - Create Optional generic type. Implicitly converts from null. Unwrap to take lamba to handle existing and null cases. Not great for input parameters.
  • Also, HtmlEncoded, Atomic, Tainted, Either
  • C++ - Zero Cost Abstraction
  • Can be used with struct in C# as well.
  • System.DateTime is an example. Useful for multiple data types in combination. When unit of measure is important.
  • If you can get a Haskell program to compile, it is probably free of bugs.
  • Grand Central Dispatch - from Apple
  • Queues are lightweight threads. You "dispatch" lambda functions to them.
  • Like Dispatcher in C#
  • Serial Queue. Jobs won't run in parallel.
  • github.com/borland/SerialQueue
  • Go
  • goroutines and channels
  • Channel with send and receive.

Torment Your Colleagues with "Roslyn" .NET Compiler Platform

Ivan Towlson

"The Duke Nukem Forever of compilers"
  • C# and Visual Basic compilers
  • Syntax trees for code
  • Semantic model
  • Visual Studio editor integration.
  • Roslyn Overview on dotnet github.
  • Syntax Visualizer - browse the entire tree.

The Secret to Telling Awesome Stories from Microsoft's Chief Storyteller

The Internet of Hackable Things

Kirk Jackson @kirkj - Felix Shi @comradpara

Project Premonition: Mosquito seeking drones and Microsoft Azure

So You Want to Present at Ignite

Chris Jackson

  • 60 seconds to get their attention. Then got to land the point.
  • How to be effective as an influencer.
  • Preparing your submission - earning the right to be heard.
  • Build your reputation. Humans make the decision on who gets the cut. Who is the person, are they credible.
  • Be authenticate.
  • Volunteer to speak. Start a blog if writing is your thing.
  • Less likely to pick the total unknown.
  • Understand the goal of the track. What is the story they are trying to tell.
  • Sell yourself to the track lead.
  • Preparing for your talk.
  • Presentation design and presentation aids.
  • What do the track owners looks for.
  • What is on the screen should only be there to pull people back on track.
  • Keep the number of words on the slide to a minimum.
  • Max 5 words on 5 lines.
  • Make it real with demos.
  • You already know the material. You don't remember what it is like to not know.
  • The first 60 seconds. If it sounds awkward and unrehearsed with it's unrehearsed.
  • Practice the first 60 seconds the most.
  • What is shipping and what are the trends.
  • Inspire, don't teach. Take an action at the end of 60 minutes. One to three things tops.
  • Tell Stories. List of facts do little to inspire us.
  • How do I make this real.
  • Pillars and organization. How do you support the primary objective of the talk. Is it driving the outcome you want.
  • Stick your landing. Try to avoid ending on Q&A
  • Get speaker training. Someone who will tell you stuff you need to hear.

The Cinematic Cloud - Pixar Studios

Developing Cross Platform Mobile Apps with XAML and MVVM

See Also:

Thursday, September 24, 2015

Salesforce Winter `16 breaking SOAP Partner API changes

Just encountered this connecting to a Winter `16 Sandbox Org (v35.0) via the SOAP Partner API from Summer `15 (v34.0).

I've cross posted to the Salesforce StackExchange and raised support case 12544039

System.InvalidOperationException: There is an error in XML document (1, 2239646). ---> System.InvalidOperationException: Instance validation error: 'urn:SearchLayoutFieldsDisplayed' is not a valid value for soapType.
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read2427_soapType(String s)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read2428_Field(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read2458_DescribeSObjectResult(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read2692_describeSObjectsResponse()
   at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer193.Deserialize(XmlSerializationReader reader)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at FuseIT.G4S.SalesforceConnector.SalesforcePartner.SforceService.describeSObjects(String[] sObjectType)

I suspect the problem is the new soapType's that were added in API version 35.0 for Winter `16.

As they didn't exist in v34.0 of the API, if they come back in the SOAP response the .NET XML Serialization won't know how to handle them.

The following API call against v34.0 of the Partner API shows the problem.

Request

To: https://cs5.salesforce.com/services/Soap/u/34.0/00DO00000000001

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:partner.soap.sforce.com">
   <soapenv:Header>
      <urn:SessionHeader>
         <urn:sessionId>00DO00000000001!AQYAQKme4PP0v_FURhdtYVACcTF6vsvw_NOTmyREALsessionId_8irB66snPfNb9MLrSDB7dT95YvZA8hFVFD63cyt</urn:sessionId>
      </urn:SessionHeader>
   </soapenv:Header>
   <soapenv:Body>
      <urn:describeSObjects>
         <urn:sObjectType>SearchLayout</urn:sObjectType>
      </urn:describeSObjects>
   </soapenv:Body>
</soapenv:Envelope>

Response Snippet

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:partner.soap.sforce.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header>
      <LimitInfoHeader>
         <limitInfo>
            <current>39</current>
            <limit>5000000</limit>
            <type>API REQUESTS</type>
         </limitInfo>
      </LimitInfoHeader>
   </soapenv:Header>
   <soapenv:Body>
      <describeSObjectsResponse>
         <result>
           
     <!--SNIP-->
   
            <fields>
               <autoNumber>false</autoNumber>
               <byteLength>0</byteLength>
               <calculated>false</calculated>
               <caseSensitive>false</caseSensitive>
               <createable>false</createable>
               <custom>false</custom>
               <defaultedOnCreate>false</defaultedOnCreate>
               <deprecatedAndHidden>false</deprecatedAndHidden>
               <digits>0</digits>
               <filterable>false</filterable>
               <groupable>false</groupable>
               <idLookup>false</idLookup>
               <label>Fields Displayed</label>
               <length>0</length>
               <name>FieldsDisplayed</name>
               <nameField>false</nameField>
               <namePointing>false</namePointing>
               <nillable>true</nillable>
               <permissionable>false</permissionable>
               <precision>0</precision>
               <queryByDistance>false</queryByDistance>
               <restrictedPicklist>false</restrictedPicklist>
               <scale>0</scale>
               <soapType>urn:SearchLayoutFieldsDisplayed</soapType>   
               <!-- ^^^ PROBLEM IS HERE for v34.0 - this isn't a valid soapType until v35.0 -->
               <sortable>false</sortable>
               <type>complexvalue</type>
               <unique>false</unique>
               <updateable>false</updateable>
            </fields>
   
            <!--SNIP-->
               
            <keyPrefix>4co</keyPrefix>
            <label>Search Layout</label>
            <labelPlural>Search Layouts</labelPlural>
            <layoutable>false</layoutable>
            <mergeable>false</mergeable>
            <name>SearchLayout</name>
            <queryable>true</queryable>
            <replicateable>false</replicateable>
            <retrieveable>false</retrieveable>
            <searchable>false</searchable>
            <undeletable>false</undeletable>
            <updateable>false</updateable>
            <urlDetail xsi:nil="true"/>
            <urlEdit xsi:nil="true"/>
            <urlNew xsi:nil="true"/>
         </result>
      </describeSObjectsResponse>
   </soapenv:Body>
</soapenv:Envelope>

Ideally Salesforce shouldn't be sending elements from the v35.0 back to the v34.0 API. It's likely that SearchLayoutField, SearchLayoutButtonsDisplayed, SearchLayoutButton and RecordTypesSupported would cause similar issues with existing integrations.

Bonus namespace alterations

Be aware that some elements have changed namespace between v34.0 and v35.0. E.g. In v34.0 the soapType enumerations location and address were in the urn namespace ("urn:partner.soap.sforce.com"). In v35.0 They are now in the tns namespace (xmlns:tns="urn:partner.soap.sforce.com"). Make sure the API URL you are calling matches up with the WSDL version the classes were generated from.

Tuesday, September 22, 2015

Dreamforce 2015 Round-up / Summary

This was my second year attending Salesforce's annual Dreamforce conference in San Francisco. My first was last year.

Again, I focused mostly on the developer side of things which are around the Moscone West building - Home of the Dev Zone

Dev Zone


Sessions

Using Oculus Rift and Virtual Reality to Visualize Data on Salesforce

Introducing the Welkin Suite IDE for Salesforce

A Salesforce IDE built upon Visual Studio Code.

Custom Folder Structure - The ability to create sub folders within the project to organize components looks to be really useful.

Plus support for code comments.

Apex Enterprise Patterns: Building Strong Foundations

Patterns for:

  • Separation of Concerns + Factory Pattern
  • Service Layer
  • Domain Layer
  • Selector Layer

Parker Harris's True to the Core: What's Next for Our Core Products

Get Ready for a New Kind of Customer Success with Marc Benioff & Special Guests

175,000+ conference attendees. 25,000 of which are developers.

Demo of Thunder, the IoT cloud integrated with the Azure Event Hub for Office 365

Build Reliable Asynchronous Code with Queueable Apex

Apex Interactive Debugger

Fireside Chat with Satya Nadella and Jessi Hempel

A nice perk of becoming a Salesforce MVP this year was reserved setting access to some of the keynotes. In my case I got front row seating to the Satya Nadella keynote. Right in line behind Tony Prophet, who some of you may remember from last years main keynote.

Salesforce Developer Keynote

Introduction To Apex Asynchronous Callout Framework, aka, Continuation

Apex Testing Tips and Tricks - Community Campfire

Generically Call External Classes from Managed Packages

Using Type.forName to get the Type for a classname configured in a custom setting that the managed package can instantiate using .newInstance().

Understanding the Salesforce Architecture: How We Do the Magic We Do

Meet the Developers

Marc Benioff & Parker Harris Q&A

Sessions to catch up on

Dreamboat

<table style="width:194px;"><tr><td align="center" style="height:194px;background:url(https://www.gstatic.com/pwa/s/v/lighthousefe_20150907.00_p0/transparent_album_background.gif) no-repeat left"><a href="https://picasaweb.google.com/107745668347424492499/DreamboatCelebrityInfinity?authuser=0&feat=embedwebsite"><img height="160" src="https://lh3.googleusercontent.com/-1SeOvtlOsDM/Vf9Yix49CfE/AAAAAAACOvA/oVKLqsvNuEg/s160-c-Ic42/DreamboatCelebrityInfinity.jpg" style="margin:1px 0 0 4px;" width="160"></a></td></tr><tr><td style="text-align:center;font-family:arial,sans-serif;font-size:11px"><a href="https://picasaweb.google.com/107745668347424492499/DreamboatCelebrityInfinity?authuser=0&feat=embedwebsite" style="color:#4D4D4D;font-weight:bold;text-decoration:none;">Dreamboat - Celebrity Infinity</a></td></tr></table>

I'd sum up the Dreamboat as:

"among the most impressive accommodation you'll hardly even see"

Dreamforce is a pretty full on conference. You can be booked up from breakfast to as late as you want with meetings, sessions, keynotes, and after hours functions. This usually means waking up sometime around 6 am, maybe grabbing a quick breakfast, and then disembarking to the first meeting of the day. Then staggering back in to get some sleep before doing it all again tomorrow (assuming you make it back before midnight).

As far as accommodation goes, I'd have to rate the Dreamboat as among the most impressive I've seen. With multiple swimming pools, a gym, theater, basket ball court, and casino (not operational) all on board, there was no shortage of things to do. If only you can find the time. I don't think I made it to the Constellation Lounge during daylight hours and was surprised to see what it looked like during daylight hours.

Plus the views. Open the curtains before leaving for the morning to catch the sun coming up behind the bay bridge. Then see the silhouette of the Golden Gate bridge as the sun sets. Then the city skyline in the evenings.

Salesforce StackExchange breakfast

It was great to catch up with fellow users of the site prior to the start of the conference. A good way to put faces to names before things get going at the conference.

Random learning's

  • It's hard to take a photo of yourself getting a ride on a Pedicab without getting an ass in the picture. Do have small notes for payment.
  • Don't tweet a picture of Yoshiki unless you want to draw the attention of his fans.
  • You're going to need another bag to bring everything back home.
  • Do stop by the Admin zone for the professional headshots. Try to do it early in the week before the lack of sleep starts to catch up with you.
  • Get your twitter handle and avatar on your badge. I spend all year interacting with people via twitter, then struggle to identify them in real life.
  • AT&T do a 1.5GB nano sim card with 1.5GB of data for $45 USD. Combined with the conference WiFi, it was easily enough to get through and stay connected.
  • You can't give session feedback on sessions held in the DevZone theaters as you can't scan into them like you can with the breakout rooms.
  • If you're a developer, ignore the advice to leave your laptop behind. How are you going to complete the Mini Hacks or try anything out as you go if you don't have your tools on hand?
    My Surface Pro 3 was really useful. I could knock out the mini hacks, take down more complicated notes, do on the spot demos, ... Only catch for me was needing to change my date time settings to PST to connect to the WiFi. Go figure.
  • If you can time it right, drop ship things to the FedEx office at 726 Market St. It is only a quick walk from the conference and you can get a "Hold at FedEx location" when shipping.
  • Got a spare 30 minutes. Make a quick excursion to the Expo in Moscone North.
  • Visit the construction site for the Salesforce tower.
  • To use the pre-purchased BART return ticket you need to print out the receipt to present at the airport information booth. They won't accept a digital version on a screen.

UCSF Benioff Hospital Tour

The hospital has autonomous TUG robots helping with transport tasks around the hospital. I'm surprised these weren't featured in the IoT side of the conference.


See also:

Tuesday, September 8, 2015

Dreamforce 2015 is coming. Are you prepared?

Something has always bothered me a bit about conferences. The reveal of large new roadmap features mid-conference. A day of sessions has already gone by, and now there is a keynote telling you about a great new feature that you want to learn more about before the end of the conference. What to do? Ditch all the other sessions that you have otherwise already carefully selected to start learning about a new feature from scratch?

The recent Salesforce global Lightning Experience event has bypassed that by moving the big announcement to a few weeks out before the conference starts. There is some lead time for delegates to adjust session schedules and hit the conference with some knowledge of what they are getting themselves into.

With Dreamforce 2015 just around the corner, it's a great time to get ahead and get yourself some of that preparation knowledge for the changes that are going to occur to the core user interface.

The Developer Trail - Lightning Experience brings together 5 modules that cover areas of interest to a developer.

With the Lightning experience being so new and not available in all orgs yet (not GA), the modules mostly use multi-choice questions in the evaluation rather than inspecting your connected developer edition org. You will however cover some important topics, such as:

You also get to learn the importance of having good admins and not letting the developers do the rollout to a large org. Confetti canons for Everyone!

Once the developer trail is completed, some of the modules have cross over with other trials. Such as the Lightning Experience Basics, which is the starting point for some of the trails. So you would already have a good start on Admin Trail - Migrating to Lightning Experience.

See Also: