SlideShare une entreprise Scribd logo
1  sur  25
Télécharger pour lire hors ligne
Premium community conference on Microsoft technologies itcampro@ itcamp14#
The new stream and storage
paradigm
twitter: @raffaeler
email: raffaeler@vevy.com
blog: http://www.iamraf.net
Programming on Windows 8.1:
Premium community conference on Microsoft technologies itcampro@ itcamp14#
Huge thanks to our sponsors & partners!
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• ActivateInstance API
to create objects
• Native types
• IVector<T> and
IMap<T, K>
• HRESULT for errors
.NET Framework Projection magics
• Familiar new
keyword
• Familiar BCL types
• List<T> and
Dictionary<T, K>
• Exceptions
WinRT .NET projection
But projections and mappings can’t fix all the frictions
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• The need to enforce the async paradigm
–“fast and fluid” means a better UX
–Blocking apps are crappy!
• Solutions:
–async/await
–Promise pattern
The asynchronous problem
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• async / await language feature is easy
• Promise is a ‘continuation’
Async quick recap
var content = await FileIO.ReadTextAsync(storageFile);
lblResult.Text = result;
var content = File.ReadAllText(path);
lblResult.Text = result;
Callback
Sync
Async
create_task(FileIO::ReadTextAsync(storageFile))
.then( [ = ] (String^ content) {
lblResult->Text = result;
}
C++ Promise
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• The need to enforce a sandbox
–Protecting the system and user’s resources
from the Apps
• A sandbox is substantially a process with
low privileges
–App process is created with an very poor token
–Leverage the Integrity Levels
–A high number of APIs cannot be used
• sockets, System.IO, Streams, http api, …
The security problem
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• System.IO
– Let you browse/navigate the disk
– Let you access absolute path
– Use the old-school synchronous pattern
• Storage API
– Must restrict the access to few well-known locations
• Can access arbitrary locations picked from the user
– Must never block the main thread
• Security and Async are two requirements not
allowing mapping or conversion
The I/O APIs have both those problems
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• Application Package
– The place where EXE and DLL lives in
• Using MEF or an IoC? This is your code repository
– Xaml Uri: "ms-appx:///"
• If the manifest specified special folders …
… and the Store certification approved it
– KnownFolder contains the special folders
• Documents, Pictures, Music, etc.
– Note: Documents capability is hidden in VS and its
usage is permitted only to company accounts
What can an app access to?
Windows.ApplicationModel.Package.Current.InstalledLocation
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• ApplicationData.Current.LocalFolder
– Local assets, no storage limits
– Xaml Uri: "appdata:///local/"
• ApplicationData.Current.RoamingFolder
– Synced content, limited in size
• ApplicationData.RoamingStorageQuota (100K)
– Xaml Uri: "ms-appdata:///roaming/"
• ApplicationData.Current.TempFolder
– Use only for short duration operations
– Xaml Uri: "ms-appdata:///temp/"
Application-specific folders
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• Files shipped with the package
–Mark them as 'content' in Visual Studio
–"Copy Always" ensure fresh updated content
–From XAML use "ms-appx:///" or "/"
–From code use
• Windows.ApplicationModel.Package.Current.
InstalledLocation
• var img = new Uri("ms-appx:///Assets/Logo.png");
– Uri as only absolute in WinRT
Resources
<Image Source="/Assets/Logo.png" Height="100"/>
<Image Source="ms-appx:///Assets/Logo.png" Height="100"/>
Premium community conference on Microsoft technologies itcampro@ itcamp14#
DEMO:
A LAP AROUND STORAGE API
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• There are still missing methods in some classes
of the WinRT API
• .NET users can use Extension Methods in the
shared code to fill the gap
– Add a method which is identical to the one
available in Win8.1
• Trick! Extension methods do not prevail over
real ones
– Win8.1 will execute the real WinRT one
– WP8.1 will execute the extension method
Windows Phone 8.1 API differences
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• Do you remember the security constraints?
– Poor token, low integrity level, restricted APIs
• Sometimes we need to bypass the limitations
– Accessing a file outside the ones owned by the
App
• Pickers use the Runtime Broker to bypass the
limitation
– Accesses the resources for the requesting App
– User is always in control of the Broker requests
Pickers
Premium community conference on Microsoft technologies itcampro@ itcamp14#
Pickers and the Runtime Security Broker
Kernel services
WinRT
Runtime
Security Broker
COM / Win32 filtered Complete COM / Win32
Component
Device
access
Picker
Host
…
Component
Broker UI
Process
AppContainer
Process
Restricted token
Low Integrity Level
Standard token
Medium Integrity Level
Premium community conference on Microsoft technologies itcampro@ itcamp14#
WORKING WITH STREAMS
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• Streams can block the client code
–Until you read/write, you will never know
• Working in chunks makes sense
–Files, network, … typically send/receive chunks
• Buffering limits the use of async to loading
or writing the buffer
• WinRT use a low level buffering concept
–IBuffer interface representing byte arrays
The need of buffering
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• It's made only of Capacity and Length
– Creation via Buffer class (no read/write methods)
– Write access is possible via
• WindowsRuntimeBuffer.Create
• Low level access via COM interface
– IBufferByteAccess (C++ only)
– Conversions/mappings by:
IBuffer and friends
WinRT Type .NET Type .NET  WinRT WinRT  .NET
IBuffer Byte[] AsBuffer, CopyTo ToArray, CopyTo
IBuffer Byte N/A GetByte
IBuffer
Stream
MemoryStream
AsStream,
GetWindowsRuntimeBuffer AsStream
WindowsRuntimeBufferExtensions
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• DataReader can read IBuffer
• IInputStream and IOutputStream
– Are backed up by IBuffer based buffers
IBuffer is used from other APIs
byte[] blob = Utiltities.CreateSampleBlob();
byte[] blob2 = new byte[blob.Length];
IBuffer buffer = blob.AsBuffer();
using (DataReader reader = DataReader.FromBuffer(buffer))
{
reader.ReadBytes(blob2);
}
Debug.Assert(Utiltities.IsSameDataAndDifferentReference(blob, blob2));
using (DataReader reader = DataReader.FromBuffer(buffer))
{
buffer2 = reader.ReadBuffer((uint)blob.Length);
blob2 = buffer2.ToArray();
}
Debug.Assert(!buffer.IsSameData(buffer2));
WindowsRuntimeBufferExtensions
Premium community conference on Microsoft technologies itcampro@ itcamp14#
Streams hierarchy
IInputStreamReference
IRandomAccessStream
Reference
IAsyncOperationWithProgress<IBuffer, uint>
ReadAsync(IBuffer buffer,
uint count,
InputStreamOptions options);
IAsyncOperationWithProgress<uint, uint>
WriteAsync(IBuffer buffer);
IAsyncOperation<bool> FlushAsync();
string ContentType {get; }
IRandomAccessStream CloneStream();
IInputStream GetInputStreamAt(
ulong position);
IOutputStream GetOutputStreamAt(
ulong position);
void Seek([In] ulong position);
bool CanRead { get; }
bool CanWrite { get; }
ulong Position { get; }
ulong Size { get; set; }
Sequential access interfaces
IInputStream IOutputStream
IRandomAccessStream
IRandomAccessStream
WithContentType
IClosable
(IDisposable)
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• Maintain internally an IBuffer
• LoadAsync load the buffer
• ReadXYZ methods hit the buffer, not the stream!
– They can be safely synchronous
DataReader puts IBuffer and streams together
Stream
I/O
Latency
0 Size
LoadAsync LoadAsync LoadAsync
IBuffer
DataReader
ReadBoolean
ReadByte
ReadBytes
…
var file = await Package.Current
.InstalledLocation
.GetFileAsync(@"AssetsLogo.png");
using (var stream = await file.OpenReadAsync())
{
using (var reader = new DataReader(stream))
{
await reader.LoadAsync((uint)stream.Size);
Debug.WriteLine("0x" +
reader.ReadByte().ToString("x2"));
} // stream is disposed here ...
// ... unless reader.DetachStream() is not called
}
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• Writes are against the IBuffer
• The stream is written only at StoreAsync time
• FlushAsync can be used to flush the underlying
stream
DataWriter use the same schema
Stream
I/O
Latency
0 Size
StoreAsync StoreAsync StoreAsync
IBuffer
DataWriter
WriteBoolean
WriteByte
WriteBytes
…
// ...
using (var writer = new DataWriter(stream))
{
writer.WriteInt32(1);
written = await writer.StoreAsync();
writer.DetachStream();
}
// ...
Premium community conference on Microsoft technologies itcampro@ itcamp14#
WinRT Type .NET Type .NET  WinRT WinRT  .NET
IInputStream Stream AsInputStream AsStreamForRead
IOutputStream Stream AsOutputStream AsStreamForWrite
IRandomAccessStream Stream AsRandomAccessStream AsStream
Converting streams between .NET and WinRT
byte[] blob = Utiltities.CreateSampleBlob();
byte[] blob2 = new byte[blob.Length];
using (var memStream = new MemoryStream())
{
await memStream.WriteAsync(blob, 0, blob.Length);
memStream.Seek(0, System.IO.SeekOrigin.Begin);
using (var reader = new DataReader(memStream.AsInputStream()))
{
await reader.LoadAsync((uint)blob.Length);
reader.ReadBytes(blob2);
}
}
Debug.Assert(Utiltities.IsSameDataAndDifferentReference(blob, blob2));
Premium community conference on Microsoft technologies itcampro@ itcamp14#
TIPS
Premium community conference on Microsoft technologies itcampro@ itcamp14#
• RandomAccessStream static class expose
helper methods to copy a stream
–CopyAsync, CopyAndCloseAsync
• C++ will take advantage of async/await
–they makes a huge difference!
• IBufferByteAccess
Useful tips to remember
Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess>
GetByteBuffer(Windows::Storage::Streams::IBuffer^ buffer)
{
Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> ibba;
Microsoft::WRL::ComPtr<IUnknown> unknown(reinterpret_cast<IUnknown*>(buffer));
unknown.As<Windows::Storage::Streams::IBufferByteAccess>(&ibba);
return ibba;
}
HRESULT Buffer([out] byte** value);
Premium community conference on Microsoft technologies itcampro@ itcamp14#
Q & A

Contenu connexe

Tendances

Embedded systems tools & peripherals
Embedded systems   tools & peripheralsEmbedded systems   tools & peripherals
Embedded systems tools & peripheralsimtiazalijoono
 
Java vs .net
Java vs .netJava vs .net
Java vs .netTech_MX
 
A Comparison of .NET Framework vs. Java Virtual Machine
A Comparison of .NET Framework vs. Java Virtual MachineA Comparison of .NET Framework vs. Java Virtual Machine
A Comparison of .NET Framework vs. Java Virtual MachineAbdelrahman Hosny
 
Introduction to ,NET Framework
Introduction to ,NET FrameworkIntroduction to ,NET Framework
Introduction to ,NET FrameworkANURAG SINGH
 
Dotnet framework
Dotnet frameworkDotnet framework
Dotnet frameworkNitu Pandey
 
Practical Malware Analysis: Ch 8: Debugging
Practical Malware Analysis: Ch 8: Debugging Practical Malware Analysis: Ch 8: Debugging
Practical Malware Analysis: Ch 8: Debugging Sam Bowne
 
Compilers and interpreters
Compilers and interpretersCompilers and interpreters
Compilers and interpretersRAJU KATHI
 
Java and internet fundamentals.
Java and internet fundamentals.Java and internet fundamentals.
Java and internet fundamentals.mali yogesh kumar
 
Embedded linux system development (slides)
Embedded linux system development (slides)Embedded linux system development (slides)
Embedded linux system development (slides)Jaime Barragan
 
CNIT 126: 10: Kernel Debugging with WinDbg
CNIT 126: 10: Kernel Debugging with WinDbgCNIT 126: 10: Kernel Debugging with WinDbg
CNIT 126: 10: Kernel Debugging with WinDbgSam Bowne
 
Embedded linux
Embedded linuxEmbedded linux
Embedded linuxWingston
 
Codescape Debugger 8
Codescape Debugger 8Codescape Debugger 8
Codescape Debugger 8Damien Ruscoe
 
Practical Malware Analysis: Ch 0: Malware Analysis Primer & 1: Basic Static T...
Practical Malware Analysis: Ch 0: Malware Analysis Primer & 1: Basic Static T...Practical Malware Analysis: Ch 0: Malware Analysis Primer & 1: Basic Static T...
Practical Malware Analysis: Ch 0: Malware Analysis Primer & 1: Basic Static T...Sam Bowne
 
Common language runtime clr
Common language runtime clrCommon language runtime clr
Common language runtime clrSanSan149
 
Microsoft dot net framework
Microsoft dot net frameworkMicrosoft dot net framework
Microsoft dot net frameworkAshish Verma
 

Tendances (20)

Embedded systems tools & peripherals
Embedded systems   tools & peripheralsEmbedded systems   tools & peripherals
Embedded systems tools & peripherals
 
report
reportreport
report
 
Java vs .net
Java vs .netJava vs .net
Java vs .net
 
JAVA INTRODUCTION - 1
JAVA INTRODUCTION - 1JAVA INTRODUCTION - 1
JAVA INTRODUCTION - 1
 
A Comparison of .NET Framework vs. Java Virtual Machine
A Comparison of .NET Framework vs. Java Virtual MachineA Comparison of .NET Framework vs. Java Virtual Machine
A Comparison of .NET Framework vs. Java Virtual Machine
 
Introduction to ,NET Framework
Introduction to ,NET FrameworkIntroduction to ,NET Framework
Introduction to ,NET Framework
 
Dotnet framework
Dotnet frameworkDotnet framework
Dotnet framework
 
Practical Malware Analysis: Ch 8: Debugging
Practical Malware Analysis: Ch 8: Debugging Practical Malware Analysis: Ch 8: Debugging
Practical Malware Analysis: Ch 8: Debugging
 
Compilers and interpreters
Compilers and interpretersCompilers and interpreters
Compilers and interpreters
 
Developing an Embedded IoT Solution using Mongoose OS.
Developing an Embedded IoT Solution using Mongoose OS.Developing an Embedded IoT Solution using Mongoose OS.
Developing an Embedded IoT Solution using Mongoose OS.
 
Java and internet fundamentals.
Java and internet fundamentals.Java and internet fundamentals.
Java and internet fundamentals.
 
Java ms harsha
Java ms harshaJava ms harsha
Java ms harsha
 
Embedded linux system development (slides)
Embedded linux system development (slides)Embedded linux system development (slides)
Embedded linux system development (slides)
 
CNIT 126: 10: Kernel Debugging with WinDbg
CNIT 126: 10: Kernel Debugging with WinDbgCNIT 126: 10: Kernel Debugging with WinDbg
CNIT 126: 10: Kernel Debugging with WinDbg
 
Embedded linux
Embedded linuxEmbedded linux
Embedded linux
 
Codescape Debugger 8
Codescape Debugger 8Codescape Debugger 8
Codescape Debugger 8
 
Practical Malware Analysis: Ch 0: Malware Analysis Primer & 1: Basic Static T...
Practical Malware Analysis: Ch 0: Malware Analysis Primer & 1: Basic Static T...Practical Malware Analysis: Ch 0: Malware Analysis Primer & 1: Basic Static T...
Practical Malware Analysis: Ch 0: Malware Analysis Primer & 1: Basic Static T...
 
Common language runtime clr
Common language runtime clrCommon language runtime clr
Common language runtime clr
 
Chapter 1
Chapter 1Chapter 1
Chapter 1
 
Microsoft dot net framework
Microsoft dot net frameworkMicrosoft dot net framework
Microsoft dot net framework
 

Similaire à Programming on Windows 8.1: The New Stream and Storage Paradigm (Raffaele Rialdi)

ITCamp 2013 - Raffaele Rialdi - Windows Runtime (WinRT) deep dive
ITCamp 2013 - Raffaele Rialdi - Windows Runtime (WinRT) deep diveITCamp 2013 - Raffaele Rialdi - Windows Runtime (WinRT) deep dive
ITCamp 2013 - Raffaele Rialdi - Windows Runtime (WinRT) deep diveITCamp
 
ITCamp 2011 - Mihai Nadas - Windows Azure interop
ITCamp 2011 - Mihai Nadas - Windows Azure interopITCamp 2011 - Mihai Nadas - Windows Azure interop
ITCamp 2011 - Mihai Nadas - Windows Azure interopITCamp
 
ITCamp 2011 - Cristian Lefter - SQL Server code-name Denali
ITCamp 2011 - Cristian Lefter - SQL Server code-name DenaliITCamp 2011 - Cristian Lefter - SQL Server code-name Denali
ITCamp 2011 - Cristian Lefter - SQL Server code-name DenaliITCamp
 
ITCamp 2017 - Raffaele Rialdi - Adopting .NET Core in Mainstream Projects
ITCamp 2017 - Raffaele Rialdi - Adopting .NET Core in Mainstream ProjectsITCamp 2017 - Raffaele Rialdi - Adopting .NET Core in Mainstream Projects
ITCamp 2017 - Raffaele Rialdi - Adopting .NET Core in Mainstream ProjectsITCamp
 
Mihai Tataran - Building Windows 8 Applications with HTML5 and JS
Mihai Tataran - Building Windows 8 Applications with HTML5 and JSMihai Tataran - Building Windows 8 Applications with HTML5 and JS
Mihai Tataran - Building Windows 8 Applications with HTML5 and JSITCamp
 
ITCamp 2013 - Martin Kulov - Demystifying Visual Studio 2012 Performance Tools
ITCamp 2013 - Martin Kulov - Demystifying Visual Studio 2012 Performance ToolsITCamp 2013 - Martin Kulov - Demystifying Visual Studio 2012 Performance Tools
ITCamp 2013 - Martin Kulov - Demystifying Visual Studio 2012 Performance ToolsITCamp
 
ITCamp 2013 - Petru Jucovschi - Application ecosystems
ITCamp 2013 - Petru Jucovschi - Application ecosystemsITCamp 2013 - Petru Jucovschi - Application ecosystems
ITCamp 2013 - Petru Jucovschi - Application ecosystemsITCamp
 
“Seamless Deployment of Multimedia and Machine Learning Applications at the E...
“Seamless Deployment of Multimedia and Machine Learning Applications at the E...“Seamless Deployment of Multimedia and Machine Learning Applications at the E...
“Seamless Deployment of Multimedia and Machine Learning Applications at the E...Edge AI and Vision Alliance
 
Realtime traffic analyser
Realtime traffic analyserRealtime traffic analyser
Realtime traffic analyserAlex Moskvin
 
The Roslyn Compiler: Look at Your Code from a Different Perspective (Raffaele...
The Roslyn Compiler: Look at Your Code from a Different Perspective (Raffaele...The Roslyn Compiler: Look at Your Code from a Different Perspective (Raffaele...
The Roslyn Compiler: Look at Your Code from a Different Perspective (Raffaele...ITCamp
 
Azure tales: a real world CQRS and ES Deep Dive - Andrea Saltarello
Azure tales: a real world CQRS and ES Deep Dive - Andrea SaltarelloAzure tales: a real world CQRS and ES Deep Dive - Andrea Saltarello
Azure tales: a real world CQRS and ES Deep Dive - Andrea SaltarelloITCamp
 
ITCamp 2013 - Lorant Domokos - Chasing the one codebase, multiple platforms d...
ITCamp 2013 - Lorant Domokos - Chasing the one codebase, multiple platforms d...ITCamp 2013 - Lorant Domokos - Chasing the one codebase, multiple platforms d...
ITCamp 2013 - Lorant Domokos - Chasing the one codebase, multiple platforms d...ITCamp
 
Open source building blocks for the Internet of Things - Jfokus 2013
Open source building blocks for the Internet of Things - Jfokus 2013Open source building blocks for the Internet of Things - Jfokus 2013
Open source building blocks for the Internet of Things - Jfokus 2013Benjamin Cabé
 
Presentation 3 software developer in rfid
Presentation 3 software developer in rfidPresentation 3 software developer in rfid
Presentation 3 software developer in rfidMouhanad Alkhaldi
 
ITCamp 2013 - Adrian Stoian - Whats new in ConfigMgr 2012 SP1
ITCamp 2013 - Adrian Stoian - Whats new in ConfigMgr 2012 SP1ITCamp 2013 - Adrian Stoian - Whats new in ConfigMgr 2012 SP1
ITCamp 2013 - Adrian Stoian - Whats new in ConfigMgr 2012 SP1ITCamp
 
Kurento - FI-WARE Bootcamp
Kurento - FI-WARE BootcampKurento - FI-WARE Bootcamp
Kurento - FI-WARE BootcampIvan Gracia
 
Getting More Out of the Node.js, PHP, and Python Agents - AppSphere16
Getting More Out of the Node.js, PHP, and Python Agents - AppSphere16Getting More Out of the Node.js, PHP, and Python Agents - AppSphere16
Getting More Out of the Node.js, PHP, and Python Agents - AppSphere16AppDynamics
 
VA Smalltalk Update
VA Smalltalk UpdateVA Smalltalk Update
VA Smalltalk UpdateESUG
 
TypeScript - Javascript done right
TypeScript - Javascript done rightTypeScript - Javascript done right
TypeScript - Javascript done rightWekoslav Stefanovski
 

Similaire à Programming on Windows 8.1: The New Stream and Storage Paradigm (Raffaele Rialdi) (20)

ITCamp 2013 - Raffaele Rialdi - Windows Runtime (WinRT) deep dive
ITCamp 2013 - Raffaele Rialdi - Windows Runtime (WinRT) deep diveITCamp 2013 - Raffaele Rialdi - Windows Runtime (WinRT) deep dive
ITCamp 2013 - Raffaele Rialdi - Windows Runtime (WinRT) deep dive
 
ITCamp 2011 - Mihai Nadas - Windows Azure interop
ITCamp 2011 - Mihai Nadas - Windows Azure interopITCamp 2011 - Mihai Nadas - Windows Azure interop
ITCamp 2011 - Mihai Nadas - Windows Azure interop
 
ITCamp 2011 - Cristian Lefter - SQL Server code-name Denali
ITCamp 2011 - Cristian Lefter - SQL Server code-name DenaliITCamp 2011 - Cristian Lefter - SQL Server code-name Denali
ITCamp 2011 - Cristian Lefter - SQL Server code-name Denali
 
ITCamp 2017 - Raffaele Rialdi - Adopting .NET Core in Mainstream Projects
ITCamp 2017 - Raffaele Rialdi - Adopting .NET Core in Mainstream ProjectsITCamp 2017 - Raffaele Rialdi - Adopting .NET Core in Mainstream Projects
ITCamp 2017 - Raffaele Rialdi - Adopting .NET Core in Mainstream Projects
 
Mihai Tataran - Building Windows 8 Applications with HTML5 and JS
Mihai Tataran - Building Windows 8 Applications with HTML5 and JSMihai Tataran - Building Windows 8 Applications with HTML5 and JS
Mihai Tataran - Building Windows 8 Applications with HTML5 and JS
 
ITCamp 2013 - Martin Kulov - Demystifying Visual Studio 2012 Performance Tools
ITCamp 2013 - Martin Kulov - Demystifying Visual Studio 2012 Performance ToolsITCamp 2013 - Martin Kulov - Demystifying Visual Studio 2012 Performance Tools
ITCamp 2013 - Martin Kulov - Demystifying Visual Studio 2012 Performance Tools
 
ITCamp 2013 - Petru Jucovschi - Application ecosystems
ITCamp 2013 - Petru Jucovschi - Application ecosystemsITCamp 2013 - Petru Jucovschi - Application ecosystems
ITCamp 2013 - Petru Jucovschi - Application ecosystems
 
“Seamless Deployment of Multimedia and Machine Learning Applications at the E...
“Seamless Deployment of Multimedia and Machine Learning Applications at the E...“Seamless Deployment of Multimedia and Machine Learning Applications at the E...
“Seamless Deployment of Multimedia and Machine Learning Applications at the E...
 
Realtime traffic analyser
Realtime traffic analyserRealtime traffic analyser
Realtime traffic analyser
 
The Roslyn Compiler: Look at Your Code from a Different Perspective (Raffaele...
The Roslyn Compiler: Look at Your Code from a Different Perspective (Raffaele...The Roslyn Compiler: Look at Your Code from a Different Perspective (Raffaele...
The Roslyn Compiler: Look at Your Code from a Different Perspective (Raffaele...
 
Azure tales: a real world CQRS and ES Deep Dive - Andrea Saltarello
Azure tales: a real world CQRS and ES Deep Dive - Andrea SaltarelloAzure tales: a real world CQRS and ES Deep Dive - Andrea Saltarello
Azure tales: a real world CQRS and ES Deep Dive - Andrea Saltarello
 
ITCamp 2013 - Lorant Domokos - Chasing the one codebase, multiple platforms d...
ITCamp 2013 - Lorant Domokos - Chasing the one codebase, multiple platforms d...ITCamp 2013 - Lorant Domokos - Chasing the one codebase, multiple platforms d...
ITCamp 2013 - Lorant Domokos - Chasing the one codebase, multiple platforms d...
 
Open source building blocks for the Internet of Things - Jfokus 2013
Open source building blocks for the Internet of Things - Jfokus 2013Open source building blocks for the Internet of Things - Jfokus 2013
Open source building blocks for the Internet of Things - Jfokus 2013
 
Presentation 3 software developer in rfid
Presentation 3 software developer in rfidPresentation 3 software developer in rfid
Presentation 3 software developer in rfid
 
ITCamp 2013 - Adrian Stoian - Whats new in ConfigMgr 2012 SP1
ITCamp 2013 - Adrian Stoian - Whats new in ConfigMgr 2012 SP1ITCamp 2013 - Adrian Stoian - Whats new in ConfigMgr 2012 SP1
ITCamp 2013 - Adrian Stoian - Whats new in ConfigMgr 2012 SP1
 
Kurento - FI-WARE Bootcamp
Kurento - FI-WARE BootcampKurento - FI-WARE Bootcamp
Kurento - FI-WARE Bootcamp
 
C# on a CHIPs
C# on a CHIPsC# on a CHIPs
C# on a CHIPs
 
Getting More Out of the Node.js, PHP, and Python Agents - AppSphere16
Getting More Out of the Node.js, PHP, and Python Agents - AppSphere16Getting More Out of the Node.js, PHP, and Python Agents - AppSphere16
Getting More Out of the Node.js, PHP, and Python Agents - AppSphere16
 
VA Smalltalk Update
VA Smalltalk UpdateVA Smalltalk Update
VA Smalltalk Update
 
TypeScript - Javascript done right
TypeScript - Javascript done rightTypeScript - Javascript done right
TypeScript - Javascript done right
 

Plus de ITCamp

ITCamp 2019 - Stacey M. Jenkins - Protecting your company's data - By psychol...
ITCamp 2019 - Stacey M. Jenkins - Protecting your company's data - By psychol...ITCamp 2019 - Stacey M. Jenkins - Protecting your company's data - By psychol...
ITCamp 2019 - Stacey M. Jenkins - Protecting your company's data - By psychol...ITCamp
 
ITCamp 2019 - Silviu Niculita - Supercharge your AI efforts with the use of A...
ITCamp 2019 - Silviu Niculita - Supercharge your AI efforts with the use of A...ITCamp 2019 - Silviu Niculita - Supercharge your AI efforts with the use of A...
ITCamp 2019 - Silviu Niculita - Supercharge your AI efforts with the use of A...ITCamp
 
ITCamp 2019 - Peter Leeson - Managing Skills
ITCamp 2019 - Peter Leeson - Managing SkillsITCamp 2019 - Peter Leeson - Managing Skills
ITCamp 2019 - Peter Leeson - Managing SkillsITCamp
 
ITCamp 2019 - Mihai Tataran - Governing your Cloud Resources
ITCamp 2019 - Mihai Tataran - Governing your Cloud ResourcesITCamp 2019 - Mihai Tataran - Governing your Cloud Resources
ITCamp 2019 - Mihai Tataran - Governing your Cloud ResourcesITCamp
 
ITCamp 2019 - Ivana Milicic - Color - The Shadow Ruler of UX
ITCamp 2019 - Ivana Milicic - Color - The Shadow Ruler of UXITCamp 2019 - Ivana Milicic - Color - The Shadow Ruler of UX
ITCamp 2019 - Ivana Milicic - Color - The Shadow Ruler of UXITCamp
 
ITCamp 2019 - Florin Coros - Implementing Clean Architecture
ITCamp 2019 - Florin Coros - Implementing Clean ArchitectureITCamp 2019 - Florin Coros - Implementing Clean Architecture
ITCamp 2019 - Florin Coros - Implementing Clean ArchitectureITCamp
 
ITCamp 2019 - Florin Loghiade - Azure Kubernetes in Production - Field notes...
ITCamp 2019 - Florin Loghiade -  Azure Kubernetes in Production - Field notes...ITCamp 2019 - Florin Loghiade -  Azure Kubernetes in Production - Field notes...
ITCamp 2019 - Florin Loghiade - Azure Kubernetes in Production - Field notes...ITCamp
 
ITCamp 2019 - Florin Flestea - How 3rd Level support experience influenced m...
ITCamp 2019 - Florin Flestea -  How 3rd Level support experience influenced m...ITCamp 2019 - Florin Flestea -  How 3rd Level support experience influenced m...
ITCamp 2019 - Florin Flestea - How 3rd Level support experience influenced m...ITCamp
 
ITCamp 2019 - Emil Craciun - RoboRestaurant of the future powered by serverle...
ITCamp 2019 - Emil Craciun - RoboRestaurant of the future powered by serverle...ITCamp 2019 - Emil Craciun - RoboRestaurant of the future powered by serverle...
ITCamp 2019 - Emil Craciun - RoboRestaurant of the future powered by serverle...ITCamp
 
ITCamp 2019 - Eldert Grootenboer - Cloud Architecture Recipes for The Enterprise
ITCamp 2019 - Eldert Grootenboer - Cloud Architecture Recipes for The EnterpriseITCamp 2019 - Eldert Grootenboer - Cloud Architecture Recipes for The Enterprise
ITCamp 2019 - Eldert Grootenboer - Cloud Architecture Recipes for The EnterpriseITCamp
 
ITCamp 2019 - Cristiana Fernbach - Blockchain Legal Trends
ITCamp 2019 - Cristiana Fernbach - Blockchain Legal TrendsITCamp 2019 - Cristiana Fernbach - Blockchain Legal Trends
ITCamp 2019 - Cristiana Fernbach - Blockchain Legal TrendsITCamp
 
ITCamp 2019 - Andy Cross - Machine Learning with ML.NET and Azure Data Lake
ITCamp 2019 - Andy Cross - Machine Learning with ML.NET and Azure Data LakeITCamp 2019 - Andy Cross - Machine Learning with ML.NET and Azure Data Lake
ITCamp 2019 - Andy Cross - Machine Learning with ML.NET and Azure Data LakeITCamp
 
ITCamp 2019 - Andy Cross - Business Outcomes from AI
ITCamp 2019 - Andy Cross - Business Outcomes from AIITCamp 2019 - Andy Cross - Business Outcomes from AI
ITCamp 2019 - Andy Cross - Business Outcomes from AIITCamp
 
ITCamp 2019 - Andrea Saltarello - Modernise your app. The Cloud Story
ITCamp 2019 - Andrea Saltarello - Modernise your app. The Cloud StoryITCamp 2019 - Andrea Saltarello - Modernise your app. The Cloud Story
ITCamp 2019 - Andrea Saltarello - Modernise your app. The Cloud StoryITCamp
 
ITCamp 2019 - Andrea Saltarello - Implementing bots and Alexa skills using Az...
ITCamp 2019 - Andrea Saltarello - Implementing bots and Alexa skills using Az...ITCamp 2019 - Andrea Saltarello - Implementing bots and Alexa skills using Az...
ITCamp 2019 - Andrea Saltarello - Implementing bots and Alexa skills using Az...ITCamp
 
ITCamp 2019 - Alex Mang - I'm Confused Should I Orchestrate my Containers on ...
ITCamp 2019 - Alex Mang - I'm Confused Should I Orchestrate my Containers on ...ITCamp 2019 - Alex Mang - I'm Confused Should I Orchestrate my Containers on ...
ITCamp 2019 - Alex Mang - I'm Confused Should I Orchestrate my Containers on ...ITCamp
 
ITCamp 2019 - Alex Mang - How Far Can Serverless Actually Go Now
ITCamp 2019 - Alex Mang - How Far Can Serverless Actually Go NowITCamp 2019 - Alex Mang - How Far Can Serverless Actually Go Now
ITCamp 2019 - Alex Mang - How Far Can Serverless Actually Go NowITCamp
 
ITCamp 2019 - Peter Leeson - Vitruvian Quality
ITCamp 2019 - Peter Leeson - Vitruvian QualityITCamp 2019 - Peter Leeson - Vitruvian Quality
ITCamp 2019 - Peter Leeson - Vitruvian QualityITCamp
 
ITCamp 2018 - Ciprian Sorlea - Million Dollars Hello World Application
ITCamp 2018 - Ciprian Sorlea - Million Dollars Hello World ApplicationITCamp 2018 - Ciprian Sorlea - Million Dollars Hello World Application
ITCamp 2018 - Ciprian Sorlea - Million Dollars Hello World ApplicationITCamp
 
ITCamp 2018 - Ciprian Sorlea - Enterprise Architectures with TypeScript And F...
ITCamp 2018 - Ciprian Sorlea - Enterprise Architectures with TypeScript And F...ITCamp 2018 - Ciprian Sorlea - Enterprise Architectures with TypeScript And F...
ITCamp 2018 - Ciprian Sorlea - Enterprise Architectures with TypeScript And F...ITCamp
 

Plus de ITCamp (20)

ITCamp 2019 - Stacey M. Jenkins - Protecting your company's data - By psychol...
ITCamp 2019 - Stacey M. Jenkins - Protecting your company's data - By psychol...ITCamp 2019 - Stacey M. Jenkins - Protecting your company's data - By psychol...
ITCamp 2019 - Stacey M. Jenkins - Protecting your company's data - By psychol...
 
ITCamp 2019 - Silviu Niculita - Supercharge your AI efforts with the use of A...
ITCamp 2019 - Silviu Niculita - Supercharge your AI efforts with the use of A...ITCamp 2019 - Silviu Niculita - Supercharge your AI efforts with the use of A...
ITCamp 2019 - Silviu Niculita - Supercharge your AI efforts with the use of A...
 
ITCamp 2019 - Peter Leeson - Managing Skills
ITCamp 2019 - Peter Leeson - Managing SkillsITCamp 2019 - Peter Leeson - Managing Skills
ITCamp 2019 - Peter Leeson - Managing Skills
 
ITCamp 2019 - Mihai Tataran - Governing your Cloud Resources
ITCamp 2019 - Mihai Tataran - Governing your Cloud ResourcesITCamp 2019 - Mihai Tataran - Governing your Cloud Resources
ITCamp 2019 - Mihai Tataran - Governing your Cloud Resources
 
ITCamp 2019 - Ivana Milicic - Color - The Shadow Ruler of UX
ITCamp 2019 - Ivana Milicic - Color - The Shadow Ruler of UXITCamp 2019 - Ivana Milicic - Color - The Shadow Ruler of UX
ITCamp 2019 - Ivana Milicic - Color - The Shadow Ruler of UX
 
ITCamp 2019 - Florin Coros - Implementing Clean Architecture
ITCamp 2019 - Florin Coros - Implementing Clean ArchitectureITCamp 2019 - Florin Coros - Implementing Clean Architecture
ITCamp 2019 - Florin Coros - Implementing Clean Architecture
 
ITCamp 2019 - Florin Loghiade - Azure Kubernetes in Production - Field notes...
ITCamp 2019 - Florin Loghiade -  Azure Kubernetes in Production - Field notes...ITCamp 2019 - Florin Loghiade -  Azure Kubernetes in Production - Field notes...
ITCamp 2019 - Florin Loghiade - Azure Kubernetes in Production - Field notes...
 
ITCamp 2019 - Florin Flestea - How 3rd Level support experience influenced m...
ITCamp 2019 - Florin Flestea -  How 3rd Level support experience influenced m...ITCamp 2019 - Florin Flestea -  How 3rd Level support experience influenced m...
ITCamp 2019 - Florin Flestea - How 3rd Level support experience influenced m...
 
ITCamp 2019 - Emil Craciun - RoboRestaurant of the future powered by serverle...
ITCamp 2019 - Emil Craciun - RoboRestaurant of the future powered by serverle...ITCamp 2019 - Emil Craciun - RoboRestaurant of the future powered by serverle...
ITCamp 2019 - Emil Craciun - RoboRestaurant of the future powered by serverle...
 
ITCamp 2019 - Eldert Grootenboer - Cloud Architecture Recipes for The Enterprise
ITCamp 2019 - Eldert Grootenboer - Cloud Architecture Recipes for The EnterpriseITCamp 2019 - Eldert Grootenboer - Cloud Architecture Recipes for The Enterprise
ITCamp 2019 - Eldert Grootenboer - Cloud Architecture Recipes for The Enterprise
 
ITCamp 2019 - Cristiana Fernbach - Blockchain Legal Trends
ITCamp 2019 - Cristiana Fernbach - Blockchain Legal TrendsITCamp 2019 - Cristiana Fernbach - Blockchain Legal Trends
ITCamp 2019 - Cristiana Fernbach - Blockchain Legal Trends
 
ITCamp 2019 - Andy Cross - Machine Learning with ML.NET and Azure Data Lake
ITCamp 2019 - Andy Cross - Machine Learning with ML.NET and Azure Data LakeITCamp 2019 - Andy Cross - Machine Learning with ML.NET and Azure Data Lake
ITCamp 2019 - Andy Cross - Machine Learning with ML.NET and Azure Data Lake
 
ITCamp 2019 - Andy Cross - Business Outcomes from AI
ITCamp 2019 - Andy Cross - Business Outcomes from AIITCamp 2019 - Andy Cross - Business Outcomes from AI
ITCamp 2019 - Andy Cross - Business Outcomes from AI
 
ITCamp 2019 - Andrea Saltarello - Modernise your app. The Cloud Story
ITCamp 2019 - Andrea Saltarello - Modernise your app. The Cloud StoryITCamp 2019 - Andrea Saltarello - Modernise your app. The Cloud Story
ITCamp 2019 - Andrea Saltarello - Modernise your app. The Cloud Story
 
ITCamp 2019 - Andrea Saltarello - Implementing bots and Alexa skills using Az...
ITCamp 2019 - Andrea Saltarello - Implementing bots and Alexa skills using Az...ITCamp 2019 - Andrea Saltarello - Implementing bots and Alexa skills using Az...
ITCamp 2019 - Andrea Saltarello - Implementing bots and Alexa skills using Az...
 
ITCamp 2019 - Alex Mang - I'm Confused Should I Orchestrate my Containers on ...
ITCamp 2019 - Alex Mang - I'm Confused Should I Orchestrate my Containers on ...ITCamp 2019 - Alex Mang - I'm Confused Should I Orchestrate my Containers on ...
ITCamp 2019 - Alex Mang - I'm Confused Should I Orchestrate my Containers on ...
 
ITCamp 2019 - Alex Mang - How Far Can Serverless Actually Go Now
ITCamp 2019 - Alex Mang - How Far Can Serverless Actually Go NowITCamp 2019 - Alex Mang - How Far Can Serverless Actually Go Now
ITCamp 2019 - Alex Mang - How Far Can Serverless Actually Go Now
 
ITCamp 2019 - Peter Leeson - Vitruvian Quality
ITCamp 2019 - Peter Leeson - Vitruvian QualityITCamp 2019 - Peter Leeson - Vitruvian Quality
ITCamp 2019 - Peter Leeson - Vitruvian Quality
 
ITCamp 2018 - Ciprian Sorlea - Million Dollars Hello World Application
ITCamp 2018 - Ciprian Sorlea - Million Dollars Hello World ApplicationITCamp 2018 - Ciprian Sorlea - Million Dollars Hello World Application
ITCamp 2018 - Ciprian Sorlea - Million Dollars Hello World Application
 
ITCamp 2018 - Ciprian Sorlea - Enterprise Architectures with TypeScript And F...
ITCamp 2018 - Ciprian Sorlea - Enterprise Architectures with TypeScript And F...ITCamp 2018 - Ciprian Sorlea - Enterprise Architectures with TypeScript And F...
ITCamp 2018 - Ciprian Sorlea - Enterprise Architectures with TypeScript And F...
 

Dernier

GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 

Dernier (20)

GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 

Programming on Windows 8.1: The New Stream and Storage Paradigm (Raffaele Rialdi)

  • 1. Premium community conference on Microsoft technologies itcampro@ itcamp14# The new stream and storage paradigm twitter: @raffaeler email: raffaeler@vevy.com blog: http://www.iamraf.net Programming on Windows 8.1:
  • 2. Premium community conference on Microsoft technologies itcampro@ itcamp14# Huge thanks to our sponsors & partners!
  • 3. Premium community conference on Microsoft technologies itcampro@ itcamp14# • ActivateInstance API to create objects • Native types • IVector<T> and IMap<T, K> • HRESULT for errors .NET Framework Projection magics • Familiar new keyword • Familiar BCL types • List<T> and Dictionary<T, K> • Exceptions WinRT .NET projection But projections and mappings can’t fix all the frictions
  • 4. Premium community conference on Microsoft technologies itcampro@ itcamp14# • The need to enforce the async paradigm –“fast and fluid” means a better UX –Blocking apps are crappy! • Solutions: –async/await –Promise pattern The asynchronous problem
  • 5. Premium community conference on Microsoft technologies itcampro@ itcamp14# • async / await language feature is easy • Promise is a ‘continuation’ Async quick recap var content = await FileIO.ReadTextAsync(storageFile); lblResult.Text = result; var content = File.ReadAllText(path); lblResult.Text = result; Callback Sync Async create_task(FileIO::ReadTextAsync(storageFile)) .then( [ = ] (String^ content) { lblResult->Text = result; } C++ Promise
  • 6. Premium community conference on Microsoft technologies itcampro@ itcamp14# • The need to enforce a sandbox –Protecting the system and user’s resources from the Apps • A sandbox is substantially a process with low privileges –App process is created with an very poor token –Leverage the Integrity Levels –A high number of APIs cannot be used • sockets, System.IO, Streams, http api, … The security problem
  • 7. Premium community conference on Microsoft technologies itcampro@ itcamp14# • System.IO – Let you browse/navigate the disk – Let you access absolute path – Use the old-school synchronous pattern • Storage API – Must restrict the access to few well-known locations • Can access arbitrary locations picked from the user – Must never block the main thread • Security and Async are two requirements not allowing mapping or conversion The I/O APIs have both those problems
  • 8. Premium community conference on Microsoft technologies itcampro@ itcamp14# • Application Package – The place where EXE and DLL lives in • Using MEF or an IoC? This is your code repository – Xaml Uri: "ms-appx:///" • If the manifest specified special folders … … and the Store certification approved it – KnownFolder contains the special folders • Documents, Pictures, Music, etc. – Note: Documents capability is hidden in VS and its usage is permitted only to company accounts What can an app access to? Windows.ApplicationModel.Package.Current.InstalledLocation
  • 9. Premium community conference on Microsoft technologies itcampro@ itcamp14# • ApplicationData.Current.LocalFolder – Local assets, no storage limits – Xaml Uri: "appdata:///local/" • ApplicationData.Current.RoamingFolder – Synced content, limited in size • ApplicationData.RoamingStorageQuota (100K) – Xaml Uri: "ms-appdata:///roaming/" • ApplicationData.Current.TempFolder – Use only for short duration operations – Xaml Uri: "ms-appdata:///temp/" Application-specific folders
  • 10. Premium community conference on Microsoft technologies itcampro@ itcamp14# • Files shipped with the package –Mark them as 'content' in Visual Studio –"Copy Always" ensure fresh updated content –From XAML use "ms-appx:///" or "/" –From code use • Windows.ApplicationModel.Package.Current. InstalledLocation • var img = new Uri("ms-appx:///Assets/Logo.png"); – Uri as only absolute in WinRT Resources <Image Source="/Assets/Logo.png" Height="100"/> <Image Source="ms-appx:///Assets/Logo.png" Height="100"/>
  • 11. Premium community conference on Microsoft technologies itcampro@ itcamp14# DEMO: A LAP AROUND STORAGE API
  • 12. Premium community conference on Microsoft technologies itcampro@ itcamp14# • There are still missing methods in some classes of the WinRT API • .NET users can use Extension Methods in the shared code to fill the gap – Add a method which is identical to the one available in Win8.1 • Trick! Extension methods do not prevail over real ones – Win8.1 will execute the real WinRT one – WP8.1 will execute the extension method Windows Phone 8.1 API differences
  • 13. Premium community conference on Microsoft technologies itcampro@ itcamp14# • Do you remember the security constraints? – Poor token, low integrity level, restricted APIs • Sometimes we need to bypass the limitations – Accessing a file outside the ones owned by the App • Pickers use the Runtime Broker to bypass the limitation – Accesses the resources for the requesting App – User is always in control of the Broker requests Pickers
  • 14. Premium community conference on Microsoft technologies itcampro@ itcamp14# Pickers and the Runtime Security Broker Kernel services WinRT Runtime Security Broker COM / Win32 filtered Complete COM / Win32 Component Device access Picker Host … Component Broker UI Process AppContainer Process Restricted token Low Integrity Level Standard token Medium Integrity Level
  • 15. Premium community conference on Microsoft technologies itcampro@ itcamp14# WORKING WITH STREAMS
  • 16. Premium community conference on Microsoft technologies itcampro@ itcamp14# • Streams can block the client code –Until you read/write, you will never know • Working in chunks makes sense –Files, network, … typically send/receive chunks • Buffering limits the use of async to loading or writing the buffer • WinRT use a low level buffering concept –IBuffer interface representing byte arrays The need of buffering
  • 17. Premium community conference on Microsoft technologies itcampro@ itcamp14# • It's made only of Capacity and Length – Creation via Buffer class (no read/write methods) – Write access is possible via • WindowsRuntimeBuffer.Create • Low level access via COM interface – IBufferByteAccess (C++ only) – Conversions/mappings by: IBuffer and friends WinRT Type .NET Type .NET  WinRT WinRT  .NET IBuffer Byte[] AsBuffer, CopyTo ToArray, CopyTo IBuffer Byte N/A GetByte IBuffer Stream MemoryStream AsStream, GetWindowsRuntimeBuffer AsStream WindowsRuntimeBufferExtensions
  • 18. Premium community conference on Microsoft technologies itcampro@ itcamp14# • DataReader can read IBuffer • IInputStream and IOutputStream – Are backed up by IBuffer based buffers IBuffer is used from other APIs byte[] blob = Utiltities.CreateSampleBlob(); byte[] blob2 = new byte[blob.Length]; IBuffer buffer = blob.AsBuffer(); using (DataReader reader = DataReader.FromBuffer(buffer)) { reader.ReadBytes(blob2); } Debug.Assert(Utiltities.IsSameDataAndDifferentReference(blob, blob2)); using (DataReader reader = DataReader.FromBuffer(buffer)) { buffer2 = reader.ReadBuffer((uint)blob.Length); blob2 = buffer2.ToArray(); } Debug.Assert(!buffer.IsSameData(buffer2)); WindowsRuntimeBufferExtensions
  • 19. Premium community conference on Microsoft technologies itcampro@ itcamp14# Streams hierarchy IInputStreamReference IRandomAccessStream Reference IAsyncOperationWithProgress<IBuffer, uint> ReadAsync(IBuffer buffer, uint count, InputStreamOptions options); IAsyncOperationWithProgress<uint, uint> WriteAsync(IBuffer buffer); IAsyncOperation<bool> FlushAsync(); string ContentType {get; } IRandomAccessStream CloneStream(); IInputStream GetInputStreamAt( ulong position); IOutputStream GetOutputStreamAt( ulong position); void Seek([In] ulong position); bool CanRead { get; } bool CanWrite { get; } ulong Position { get; } ulong Size { get; set; } Sequential access interfaces IInputStream IOutputStream IRandomAccessStream IRandomAccessStream WithContentType IClosable (IDisposable)
  • 20. Premium community conference on Microsoft technologies itcampro@ itcamp14# • Maintain internally an IBuffer • LoadAsync load the buffer • ReadXYZ methods hit the buffer, not the stream! – They can be safely synchronous DataReader puts IBuffer and streams together Stream I/O Latency 0 Size LoadAsync LoadAsync LoadAsync IBuffer DataReader ReadBoolean ReadByte ReadBytes … var file = await Package.Current .InstalledLocation .GetFileAsync(@"AssetsLogo.png"); using (var stream = await file.OpenReadAsync()) { using (var reader = new DataReader(stream)) { await reader.LoadAsync((uint)stream.Size); Debug.WriteLine("0x" + reader.ReadByte().ToString("x2")); } // stream is disposed here ... // ... unless reader.DetachStream() is not called }
  • 21. Premium community conference on Microsoft technologies itcampro@ itcamp14# • Writes are against the IBuffer • The stream is written only at StoreAsync time • FlushAsync can be used to flush the underlying stream DataWriter use the same schema Stream I/O Latency 0 Size StoreAsync StoreAsync StoreAsync IBuffer DataWriter WriteBoolean WriteByte WriteBytes … // ... using (var writer = new DataWriter(stream)) { writer.WriteInt32(1); written = await writer.StoreAsync(); writer.DetachStream(); } // ...
  • 22. Premium community conference on Microsoft technologies itcampro@ itcamp14# WinRT Type .NET Type .NET  WinRT WinRT  .NET IInputStream Stream AsInputStream AsStreamForRead IOutputStream Stream AsOutputStream AsStreamForWrite IRandomAccessStream Stream AsRandomAccessStream AsStream Converting streams between .NET and WinRT byte[] blob = Utiltities.CreateSampleBlob(); byte[] blob2 = new byte[blob.Length]; using (var memStream = new MemoryStream()) { await memStream.WriteAsync(blob, 0, blob.Length); memStream.Seek(0, System.IO.SeekOrigin.Begin); using (var reader = new DataReader(memStream.AsInputStream())) { await reader.LoadAsync((uint)blob.Length); reader.ReadBytes(blob2); } } Debug.Assert(Utiltities.IsSameDataAndDifferentReference(blob, blob2));
  • 23. Premium community conference on Microsoft technologies itcampro@ itcamp14# TIPS
  • 24. Premium community conference on Microsoft technologies itcampro@ itcamp14# • RandomAccessStream static class expose helper methods to copy a stream –CopyAsync, CopyAndCloseAsync • C++ will take advantage of async/await –they makes a huge difference! • IBufferByteAccess Useful tips to remember Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> GetByteBuffer(Windows::Storage::Streams::IBuffer^ buffer) { Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> ibba; Microsoft::WRL::ComPtr<IUnknown> unknown(reinterpret_cast<IUnknown*>(buffer)); unknown.As<Windows::Storage::Streams::IBufferByteAccess>(&ibba); return ibba; } HRESULT Buffer([out] byte** value);
  • 25. Premium community conference on Microsoft technologies itcampro@ itcamp14# Q & A