I've summarised some of the most interesting/important parts of my TechEd 2011 NZ notes here.
Keynote -
Part 1 Part 2
Presenter: Adam Cogan @AdamCogan
- Concat - implicit cast. Null handling.
- Try_Convert - return null rather than exception is cast fails
- Parse - Returns the result of the expression, translated to the requested data type.
- Format - like .NET format [23:00]
- EOMonth - End of month [25:00]
- DateFromParts - Build a data from parts
- Throw [33:40] - rethrow the exception
- sp_describe_first_result_set - types from the result set [38:00]
Presenter: Ivan Towlson
- Challenges
- Code readability - async can break up the logical flow
- Exception handling - Where did the exception occur.
- Resource management - placement of using statements, etc...
- async "This method may return before is has finished".
- await contextual keyword.
"Return from this method for now*, but resume it again when the following operation has completed"
* Maybe
- The await keyword will ultimately strip off the asynchronous Task without blocking the calling thread.
- Exception handling - Centralized exception handling. Very similar to how the synchronous method would be written. Don't need a separate exception handler.
- CancellationToken, CancellationTokenSource - OperationCanceledException
- await Task.WhenAll(downloads); //A task that becomes complete when all of the sub tasks are complete.
- Inside await
- Split method into synchronous blocks.
- Compiler creates glue code for GetAwaiter()
- Awaiter has a OnCompleted callback, GetResult(), and IsCompleted.
- await Internally uses StateMachine
What async/await Isn't
- A Way to do parallel processing - Use Parallel LINQ or the TPL
- A way for multiple concurrent operations to coordinate - Use agents
Shifting computations in time
- Futures (Task) computations in progress who whose results will become available at some point.
- Delays (Lazy) computations which will be delayed until the results are needed (but performed sync)
"defer the creation of a large or resource-intensive object or the execution of a resource-intensive task, particularly when such creation or execution might not occur during the lifetime of the program"
- Promises:
- Agents: concurrent objects which communicate asynchronously and are internally serial
Summary
- Blocking calls in naughty.
- async and await allow you to write async/good programs that are as easy to write and to read as sync/bad ones.
See also:
Presenters: Ian Randall @kiwipom and Ben Gracewood @nzben
- Metro Design Principles
- Pixel (device independent pixels)
Sub unit - 5x5 pixels
1 Unit - 20x20 pixels
- XAML Spy - HTML DOM browser equivalent for XAML
- Spacing - 1/2 unit (10 pixels) between similar elements.
- Font Ramp: Header, Sub Header, Small Sub Header, Body Text
- Fast and Fluid
- Motion
- Responsiveness
- Get off the UI thread
- Wait 25 ms when arriving at the page before loading content. Displays initial page faster.
- Authentically Digital - Avoid skeuomorphism
"The details and design should focus on function rather than trying to emulate real-world analog versions of things, like the animation of a page turning in an e-book."
- Use Contracts to integrate with the rest of windows.
You don't need your own independent settings or Search functions.
Presenters: Andy Prow and Kirk Jackson
- Back Tracking on a RegEx and consume CPU time. Place time limits on execution.
- Consider segmenting the authentication system from the core database to protect against SQL injection exposing data.
Presenter Nick Harris @cloudnick
- Windows Push Notification Service (WNS)
- Types of tile template variation: Text only, images only or a combination.
- Badges for tiles
- Use Toast Templates to inform the user of something important.
The best toast notifications are personally relevant and time sensitive.
Don't over use toast notifications.
- Each tile has a unique Channel URI. Requested by App on each run. URI can change. Typically expires every 30 days. Maybe purged sooner.
Generated by WNS.
- PushNotificationChannelManager win8
HttpNotificationChannel.Find WindowsPhone7
- ToastContentFactory from Nuget
- If building your own the WNSRecipe and NPNSRecipe help
Presenter: Gus Pickering, Sam Langley and Zach Hitchcock
- Application Experience Review (AER) was used for early apps. Highly recommended to go through if you can.
- Expression Encoder for screen captures.
- Ensure you include a privacy policy (required if you have internet capability) and a support email address in the app.
- Typically use 7+ for the age limit unless there is a reason to set it lower.
- Many different ways to imply a grid, color, size, proximity, shape,
- User Experience:
- Make your hit areas bigger
- Snapped view is important
- Include portrait (unless good reasons not to)
- Use semantic zoom
- Skeuomorphism - making things look like their real world counterpart.
- For testing - Use a second portrait monitor to test orientation. (or the simulator)
- Learning JavaScript as a programming language
JavaScript: The Good Parts. Douglas Cockford.
- JavaScript Libraries
Using existing libraries will probably contain unnecessary compatibility code for other browsers.
- Useful Tools:
- Visual Studio 2012 - JavaScript Console, DOM Explorer, Simulator
- Fiddler.
- Composer - send Get/Put requests to a URL Manually put in values.
- AutoResponder - fiddler intercepts and responds with your predefined response
- Javascript libraries
- Underscore.js - Give functions similar to Linq queries in JavaScript
- JavaScript
- Mozilla Developer Reference
- Be disciplined with conventions and testing to avoid issues due to lack of typing system. Write defensive code for type checking.
Presenter: Ivan Towlson
- Windows Runtime C# classes must be sealed.
Can't have generic classes in a public interface. Internal components can.
- Windows Runtime C# structs can only contain public fields, and nothing else.
A C# class can't contain public fields.
- You can't create your own public exception classes, only use the predefined sealed type.
- You can't have ref parameters in a public method.
- These restrictions don't apply to pure .NET libraries. Only those targeting the Windows Runtime.
- Javascript doesn't support inheritance. Hence all public classes need to be sealed. They can do it internally as they can code special cases (projections?) in WinRT.
- Portable class library (.NET class library) that can be consumed by and .NET runtime and .NET in WinRT.
- .winmd files. MetaData files for the runtime. Can be opened by IL DASM.
- Catalog of all the classes used in an app are stored in the registry.
- Windows Runtime is built on COM.
- Language projections generally protect you from COM. Hence can't define own exception types as that is all the COM supports.
Presenter: Mark Manderson
- As you move further from the screen it is harder to do content creation. Becomes more about consumption.
- Covered pros and cons of:
- Voice Recognition:
+ Control area is large
+ Very little user training required
+ A natural communication mechanism
- Machine may need training to be effective
- Natural human speech patterns are hard to parse
- Noise cancellation required
- High machine load
- user frustration
- Depth Cameras:
+ Skeletal/Hand tracking for posing and gestures
+ Face and Head tracking
+ Recognition of a specific user
+ Interaction at medium distance
+ Natural Gestures
- Can only show a limited amount of information.
- Can require exaggerated movement
- A heavy software layer
- Occlusion - More than one user
- User Fatigue
- Sensor Fusion:
+ Can infer environmental factors
- Orientation, location, movement, etc...
- Environmental effects on user
E.g. Augmented reality systems.
- Touch:
+ Now cheap and ubiquitous
+ Windows 8 is very touch centric
+ Natural User Interface
- Fat Fingers
- The Ghost touch - quirks of the sensor technology
- "Gorilla Arm" - Sore arms after extended usage.
- Lack of haptic feedback - no physical feedback.
- Direct Input Mechanisms:
+ Used where precision is required
+ Great for content creation
+ Allows economy of movement - reduces fatigue..
- Must be very close to the machine
- OOS/Repetitive strain injury
- Considerable training can be required
- Not natural - an abstraction
Presenters: Ben Gracewood and Nigel Sampson
Demo source code.
- Use device independent pixels to allow scaling. Gives independence from the device resolution.
- XAML Spy, select visual elements
- Support for Snap View "Snapped" and portrait
- /Common/BindableBase.cs - CallerMemberName Attribute to implement INotifyPropertyChanged. Also CallerFilePath and CallerLineNumber.
public sealed class Logger
{
public static void TraceMessage(string message,
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0)
{
Console.WriteLine("message: " + message);
Console.WriteLine("member name: " + memberName);
Console.WriteLine("source file path: " + sourceFilePath);
Console.WriteLine("source line number: " + sourceLineNumber);
}
}
- DefaultViewModel (from File > new project) is just IObservableMap<...>
this.DefaultViewModel["Groups"] = //...
Typically the first thing to throw away from the default templates.
- ReSharper gives intellisense for StaticResources.
- SemanticZoomView - Give more information in the zoomed out view than just square tiles if possible.
- Not an optical Zoom
- If your grid is grouped then have semantic zoom.
- Pretty much impossible to extend
- A lot of scope for creativity
- Can be more than just navigation
Currently only one level of zoom. Should continue to show the same information at the same level.
- Async/Await [41:30]
override OnUnhandledException
In async void methods an unhandled exception gets put onto the default stack pool and causes the application to crash out rather than handle the exception.
Anywhere there is an async void ensure you add exception handling as OnUnhandledException won't catch it.
- Helper method. HandleErrors to wrap any async void. [46:30]
private async void HandleErrors(Func<Task> action)
{
try
{
await action();
}
catch (Exception ex)
{
DisplayError(ex);
}
}
private async void DisplayError(Exception ex)
{
var dialog = new MessageDialog(ex.Message, "Unhandled exception in Application!");
await dialog.ShowAsync();
}
- If the method returns Task<T> ensure there is an await in the call or any exceptions will be swallowed up.
- Code52 tool to reset highlight colour - HAMMER.Pants.exe Change cool in theme resources. Take generated file (Generic.xaml) and add to App Resources folder. Include it with the other Resource dictionaries (In App.xaml > ResourceDictionary.MergedDictionaries).
Presenter: Bevan Arps
Presenter: Grant Archibald @garchibald
- WebAPI is designed to work across HTTP. New Framework to easily Send/Receive data over HTTP to a range of clients.
- Data format agnostic but usually JSON or XML
- Easy to consume from JavaScript!
- Add packages for help and odata.
- Add a SecurityException Filter. Only return the top level exception message
var client = new HttpClient(handler);
client.DefaultRequestHeaders.Add("Accept", format);
await client.GetAsync(url);
await client.PostAsync(url, … JsonConvert …);
await client.PutAsync(url, … JsonConvert …);
await client.DeleteAsync(url);
$.ajax({
url: '/api/Members',
contentType: 'application/json',
dataType: 'json',
type: 'GET',
success: function(…) { },
error: function(…) {}
);
See Also:
- Continuous Testing - Run Tests After Build
- Support for different testing frameworks
- Reduced number of windows to work with
Presenter: Kevin Isom - @kev_nz
- www.phonegap.com
- Allows you to make a mobile web application and deploy it to the suitable store for the device.
- Also allows you to talk to the hardware. Camera, messaging, audio recording.
- A weakness is animation support. Especially when using PhoneGap on WP7.
- Still a Windows Phone App under the hood. Could easily create a hybrid application.
- www subfolder can be common with other phone platforms.
- Won't have support for touch events in WP7. Need to use click events, which are a bit slower.
- If your app is your product, write native for each device.
Presenter: Lewis Benge
- Seamless access to devices under Windows 8
- Play To for streaming to TVs. Industry standard DLNA.
- CameraCaptureUI
Control for built-in camera control with pre-defined user workflow.
Similar to 'pick' photos or videos from the file system
Specify quality of capture
Set Timers
- WIN8 minimum hardware spec
Ambient Light
Motion Sensor Fusion
Windows Location Provider
GPS (if mobile hardware is present)
- Location
Every single Windows 8 can provide location data (if the user allows it)
Includes enrichment from bing maps.
- Light-aware apps. Adjust for Dark, Indoors, Outdoors. Contrast adjustment on Visual State.
- ST Microelectorincs eMotion Development Board
- Near Field Communication (NFC)
Under the Windows.Networking namespace.
Tags are read/write. Not powered, no batteries.
- Windows.Devices.Enumeration - Device discover and notifications about devices.
- Windows RT devices don't expose low level bluetooh devices.
- Companion app - automatically installed when hardware is added.
- Windows 8 SDK samples - Media Capture
Presenter: Orion Edwards
[
Source]
- Interlocked methods - Atomic in nature.
Increment, Decrement, Exchange, CompareExchange, Add [6:00]
- The C# and JIT compilers only consider the single-threaded case when optimizing. Behaviour depends on the environment/platform. [13:27]
- Volatile keyword - ensures the compiler doesn't optimise the the usage and create bugs. [14:19]
- The CPU rearranges the order of reads and writes to memory! [16:00]
Each CPU keeps track of it's own reordering, but doesn't inform the others. [19:30]
Solutions:
- Use a lock - Standard Lock inserts appropriate barriers behind the scene.
- Memory Barrier - Thread.MemoryBarrier
- Memory Model
x86 and x64 will only reorder "Stores reorders after Loads".
ARM processors may do significantly more reorderings.
- Lock-free programming
Interlocked.CompareExchange
Your data structure must be immutable - allows multiple threads to read concurrently
- Lock-Free Performance benefits are hard to get. Almost always better off using locks
- Threading Model
What threads can access what data?
What threads exist and can I create more?
- No threading model
- Single Event Loop
- Single Event Loop + workers
- Multiple event loops
- Programming/Debugging tips
All threading bugs are caused by access to shared data
Avoid it where possible
Make it immutable where possible
- Deadlocks are usually easy to solve with Memory dumps.
- Don't run arbitrary unknown code while holding locks. E.g. Don't fire a change notification within the lock.
- Create attributes that can make classes/members as threadsafe of on the UI thread.
Presenter: Bevan Arps
- INotifyPropertyChanged implementation can be simplified in .NET 4.5 using CallerMemberName attribute
- Nullable<T> now has .GetValueOrDefault(foo) as an alternative to ??
- Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) .NET 4.0 [8:00]
- XPath get xpath evaluation result:
var namedSubsections = document.XPathEvaluate("section/subsection[@name]"); [18:45]
- Linq [19:40]
.TakeWhile discard all that match the condition. Stops as soon as the condition is false.
- Lazy - Allows for single instantiation and has support for thread safety.
- ThreadLocal - One instance per thread. [21:30]
- MoreLINQ - Linq extensions from Jon Skeet
.MaxBy - Find the highest value.
.Concat() appends onto the end of the sequence
.ForEach() for enumerable in addition to the built in support for List.
.Pipe() applies an action to each item as it passes through the sequence.
- AsCount - create an extension method on int that allows formatting for singular and plural
- Exception.AsEnumerable extension method creates a sequence from the root exception and the inner exceptions.
- AsStrings extension method to extract Data property key value pairs form exceptions. Includes checking for nulls.
Every Exception in .NET has a Data property.
- Chained Null checks
With - takes an input object and a function
Return - value or default.