SlideShare a Scribd company logo
1 of 54
Download to read offline
@piccoloaiutante - michele@orangecode.it
OrangeCode
Michele Capra
Building High Performance and Reliable
Windows Phone 8 Apps
Tuesday, May 14, 13
Software contractor :
- C# Asp.net mvc, Wpf, Windows Phone..
- Python, Django
- WebDeBs Founder
@piccoloaiutante - OrangeCodeMichele Capra
Who i am
Tuesday, May 14, 13
Building High Performance and Reliable
Windows Phone 8 Apps
@piccoloaiutante - OrangeCodeMichele Capra
What are we going to see
Tuesday, May 14, 13
Building High Performance and Reliable
Windows Phone 8 Apps
@piccoloaiutante - OrangeCodeMichele Capra
What are we going to see
Tuesday, May 14, 13
Building High Performance and Reliable
Windows Phone 8 Apps
@piccoloaiutante - OrangeCodeMichele Capra
What are we going to see
Tuesday, May 14, 13
In general, reliability (systemic def.) is the
ability of a person or system to perform
and maintain its functions in routine
circumstances, as well as hostile or
unexpected circumstances.
Wikipedia
@piccoloaiutante - OrangeCodeMichele Capra
Reliability
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
Reliability
In general, reliability (systemic def.) is the
ability of a person or system to perform
and maintain its functions in routine
circumstances, as well as hostile or
unexpected circumstances.
Wikipedia
Tuesday, May 14, 13
How can we achieve reliability?
• Test your app
@piccoloaiutante - OrangeCodeMichele Capra
Reliability
Tuesday, May 14, 13
Use automatic tests while you’re building your
app.
Manually test your app at the end, especially
when you’re integrating logic and UI.
@piccoloaiutante - OrangeCodeMichele Capra
Testing
Tuesday, May 14, 13
Use automatic tests while you’re building your
app.
Manually test your app at the end, especially
when you’re integrating logic and UI.
@piccoloaiutante - OrangeCodeMichele Capra
Testing
Tuesday, May 14, 13
Basic application:
- Query Spotify database
- Show result
@piccoloaiutante - OrangeCodeMichele Capra
Sample App
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
Sample App
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
Sample App
http://ws.spotify.com/service/version/
method[.format]?parameters
Tuesday, May 14, 13
Architectural Pattern:
• Derived from Presentation Model pattern
(Fowler)
• Clear separation between UI and Logic
Structure our code:
• ViewModel (c#): Logic
• View (Xaml): Presentation
@piccoloaiutante - OrangeCodeMichele Capra
Model-View-ViewModel in Windows Phone 8
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
Model-View-ViewModel in Windows Phone 8
ViewModel View
Property Binding
Tuesday, May 14, 13
We have to make a REST call to Spotify
API.
We are going to create a service (a class
called SongService) that could support our
ViewModel in this action.
@piccoloaiutante - OrangeCodeMichele Capra
Make a query to Spotify
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
Model-View-ViewModel in Windows Phone 8
ViewModelView
Song
Service
Tuesday, May 14, 13
 	
  <StackPanel	
  x:Name="TitlePanel"	
  Grid.Row="0"	
  Margin="12,17,0,28">
	
  	
  	
  	
  	
  	
  <TextBlock	
  Text="OrangeCode"	
  	
  Margin="12,0"/>
	
  	
  	
  	
  	
  	
  <TextBlock	
  Text="Spotify	
  Viewer"	
  Margin="9,-­‐7,0,0"	
  />
	
  	
  </StackPanel>
	
  	
  <Grid	
  x:Name="ContentPanel"	
  Grid.Row="1"	
  Margin="12,0,12,0">
	
  	
  	
  	
  	
  	
  <Grid.RowDefinitions>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <RowDefinition	
  Height="80"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <RowDefinition	
  Height="*"/>
	
  	
  	
  	
  	
  	
  </Grid.RowDefinitions>
	
  	
  	
  	
  	
  	
  <Grid	
  >
	
  	
  	
  	
  	
  	
  	
  	
  	
  <Grid.ColumnDefinitions>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ColumnDefinition	
  Width="*"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ColumnDefinition	
  Width="150"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  </Grid.ColumnDefinitions>
	
  	
  	
  	
  	
  	
  	
  	
  	
  <TextBox	
  	
  Text="{Binding	
  SearchedText,Mode=TwoWay}"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  <Button	
  Content="search"	
  Command="{Binding	
  Search}"/>
	
  	
  	
  	
  	
  	
  </Grid>
	
  	
  	
  	
  	
  	
  <ScrollViewer	
  Grid.Row="1">
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ItemsControl	
  ItemsSource="{Binding	
  TrackList}">
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ItemsControl.ItemTemplate>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <DataTemplate>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <TextBlock	
  Text="{Binding	
  name}"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </DataTemplate>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </ItemsControl.ItemTemplate>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </ItemsControl>
	
  	
  	
  	
  	
  	
  </ScrollViewer>
	
  	
  </Grid>
@piccoloaiutante - OrangeCodeMichele Capra
UI Language - Xaml
Tuesday, May 14, 13
 	
  <StackPanel	
  x:Name="TitlePanel"	
  Grid.Row="0"	
  Margin="12,17,0,28">
	
  	
  	
  	
  	
  	
  <TextBlock	
  Text="OrangeCode"	
  	
  Margin="12,0"/>
	
  	
  	
  	
  	
  	
  <TextBlock	
  Text="Spotify	
  Viewer"	
  Margin="9,-­‐7,0,0"	
  />
	
  	
  </StackPanel>
	
  	
  <Grid	
  x:Name="ContentPanel"	
  Grid.Row="1"	
  Margin="12,0,12,0">
	
  	
  	
  	
  	
  	
  <Grid.RowDefinitions>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <RowDefinition	
  Height="80"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <RowDefinition	
  Height="*"/>
	
  	
  	
  	
  	
  	
  </Grid.RowDefinitions>
	
  	
  	
  	
  	
  	
  <Grid	
  >
	
  	
  	
  	
  	
  	
  	
  	
  	
  <Grid.ColumnDefinitions>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ColumnDefinition	
  Width="*"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ColumnDefinition	
  Width="150"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  </Grid.ColumnDefinitions>
	
  	
  	
  	
  	
  	
  	
  	
  	
  <TextBox	
  	
  Text="{Binding	
  SearchedText,Mode=TwoWay}"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  <Button	
  Content="search"	
  Command="{Binding	
  Search}"/>
	
  	
  	
  	
  	
  	
  </Grid>
	
  	
  	
  	
  	
  	
  <ScrollViewer	
  Grid.Row="1">
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ItemsControl	
  ItemsSource="{Binding	
  TrackList}">
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ItemsControl.ItemTemplate>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <DataTemplate>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <TextBlock	
  Text="{Binding	
  name}"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </DataTemplate>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </ItemsControl.ItemTemplate>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </ItemsControl>
	
  	
  	
  	
  	
  	
  </ScrollViewer>
	
  	
  </Grid>
@piccoloaiutante - OrangeCodeMichele Capra
UI Language - Xaml
Tuesday, May 14, 13
 	
  	
  public	
  class	
  MainViewModel	
  
	
  	
  	
  {
	
  	
  	
  	
  	
  	
  	
  private	
  readonly	
  ISongService	
  _songService;
	
  	
  	
  	
  	
  	
  	
  public	
  string	
  SearchedText	
  {	
  get;	
  set;	
  }
	
  	
  	
  	
  	
  	
  	
  public	
  IList<track>	
  TrackList	
  {	
  get;	
  set;	
  }
	
  	
  	
  	
  	
  	
  	
  public	
  MainViewModel(ISongService	
  songService)
	
  	
  	
  	
  	
  	
  	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  _songService	
  =	
  songService;
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  TrackList=	
  new	
  List<track>();
	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  	
  	
  	
  public	
  async	
  Task	
  	
  Search()
	
  	
  	
  	
  	
  	
  	
  {
	
  	
  var	
  data	
  =	
  await	
  _songService.Query(SearchedText);
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  TrackList	
  =	
  data.tracks;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  OnPropertyChanged("TrackList");
	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  }
@piccoloaiutante - OrangeCodeMichele Capra
Logic Language - C#
Tuesday, May 14, 13
 	
  	
  public	
  class	
  MainViewModel	
  
	
  	
  	
  {
	
  	
  	
  	
  	
  	
  	
  private	
  readonly	
  ISongService	
  _songService;
	
  	
  	
  	
  	
  	
  	
  public	
  string	
  SearchedText	
  {	
  get;	
  set;	
  }
	
  	
  	
  	
  	
  	
  	
  public	
  IList<track>	
  TrackList	
  {	
  get;	
  set;	
  }
	
  	
  	
  	
  	
  	
  	
  public	
  MainViewModel(ISongService	
  songService)
	
  	
  	
  	
  	
  	
  	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  _songService	
  =	
  songService;
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  TrackList=	
  new	
  List<track>();
	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  	
  	
  	
  public	
  async	
  Task	
  	
  Search()
	
  	
  	
  	
  	
  	
  	
  {
	
  	
  var	
  data	
  =	
  await	
  _songService.Query(SearchedText);
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  TrackList	
  =	
  data.tracks;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  OnPropertyChanged("TrackList");
	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  }
@piccoloaiutante - OrangeCodeMichele Capra
Logic Language - C#
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
Project Structure
Tuesday, May 14, 13
public class SongService : ISongService
{
string _baseUrl;
private RestClient _client;
public SongService()
{
_client = new RestClient();
_client.BaseUrl =
"http://ws.spotify.com/search/1/track.json?q=";
}
public Task<info> Query(string query)
{
var request = new RestRequest(query, Method.GET);
var response= await _client.ExecuteTaskAsync<info>(request);
return response.Data;
}
}
@piccoloaiutante - OrangeCodeMichele Capra
SongService
Tuesday, May 14, 13
public class SongService : ISongService
{
string _baseUrl;
private RestClient _client;
public SongService()
{
_client = new RestClient();
_client.BaseUrl =
"http://ws.spotify.com/search/1/track.json?q=";
}
public Task<info> Query(string query)
{
var request = new RestRequest(query, Method.GET);
var response= await _client.ExecuteTaskAsync<info>(request);
return response.Data;
}
}
@piccoloaiutante - OrangeCodeMichele Capra
SongService
Tuesday, May 14, 13
[TestClass]
public class SongServiceFixture
{
private SongService _service;
public SongServiceFixture()
{
_service = new SongService();
}
[TestMethod]
public async Task Query_Should_Return_Result_From_Spotify_Service()
{
var data = await _service.Query("Madonna");
Assert.IsTrue(data.tracks.Count!=0);
}
}
@piccoloaiutante - OrangeCodeMichele Capra
SongService Test
Tuesday, May 14, 13
[TestClass]
public class SongServiceFixture
{
private SongService _service;
public SongServiceFixture()
{
_service = new SongService();
}
[TestMethod]
public async Task Query_Should_Return_Result_From_Spotify_Service()
{
var data = await _service.Query("Madonna");
Assert.IsTrue(data.tracks.Count!=0);
}
}
@piccoloaiutante - OrangeCodeMichele Capra
SongService Test
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
MS Test Runner
Tuesday, May 14, 13
public class MainViewModel
{
private readonly ISongService _songService;
public string SearchedText { get; set; }
public IList<track> TrackList { get; set; }
public MainViewModel(ISongService songService)
{
_songService = songService;
TrackList= new List<track>();
}
public async Task Search()
{
TrackList = (await _songService.Query(SearchedText)).tracks;
}
}
@piccoloaiutante - OrangeCodeMichele Capra
ViewModel with service
Tuesday, May 14, 13
public class MainViewModel
{
private readonly ISongService _songService;
public string SearchedText { get; set; }
public IList<track> TrackList { get; set; }
public MainViewModel(ISongService songService)
{
_songService = songService;
TrackList= new List<track>();
}
public async Task Search()
{
TrackList = (await _songService.Query(SearchedText)).tracks;
}
}
@piccoloaiutante - OrangeCodeMichele Capra
ViewModel with service
Tuesday, May 14, 13
[TestMethod]
public void Search_Should_Get_Songs_From_Service()
{
var viewModel = new MainViewModel(
new SongSearchService());
viewModel.SearchedText = "Madonna";
await viewModel.Search();
Assert.IsNotNull(viewModel.TrackList);
Assert.IsTrue(viewModel.TrackList.Count >= 1);
}
@piccoloaiutante - OrangeCodeMichele Capra
Testing ViewModel with Service
Tuesday, May 14, 13
[TestMethod]
public void Search_Should_Get_Songs_From_Service()
{
var viewModel = new MainViewModel(
new SongSearchService());
viewModel.SearchedText = "Madonna";
await viewModel.Search();
Assert.IsNotNull(viewModel.TrackList);
Assert.IsTrue(viewModel.TrackList.Count >= 1);
}
@piccoloaiutante - OrangeCodeMichele Capra
Testing ViewModel with Service
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
MS Test Runner
Tuesday, May 14, 13
 	
  <StackPanel	
  x:Name="TitlePanel"	
  Grid.Row="0"	
  Margin="12,17,0,28">
	
  	
  	
  	
  	
  	
  <TextBlock	
  Text="OrangeCode"	
  	
  Margin="12,0"/>
	
  	
  	
  	
  	
  	
  <TextBlock	
  Text="Spotify	
  Viewer"	
  Margin="9,-­‐7,0,0"	
  />
	
  	
  </StackPanel>
	
  	
  <Grid	
  x:Name="ContentPanel"	
  Grid.Row="1"	
  Margin="12,0,12,0">
	
  	
  	
  	
  	
  	
  <Grid.RowDefinitions>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <RowDefinition	
  Height="80"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <RowDefinition	
  Height="*"/>
	
  	
  	
  	
  	
  	
  </Grid.RowDefinitions>
	
  	
  	
  	
  	
  	
  <Grid	
  >
	
  	
  	
  	
  	
  	
  	
  	
  	
  <Grid.ColumnDefinitions>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ColumnDefinition	
  Width="*"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ColumnDefinition	
  Width="150"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  </Grid.ColumnDefinitions>
	
  	
  	
  	
  	
  	
  	
  	
  	
  <TextBox	
  	
  Text="{Binding	
  SearchedText,Mode=TwoWay}"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  <Button	
  Content="search"	
  Command="{Binding	
  Search}"/>
	
  	
  	
  	
  	
  	
  </Grid>
	
  	
  	
  	
  	
  	
  <ScrollViewer	
  Grid.Row="1">
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ItemsControl	
  ItemsSource="{Binding	
  TrackList}">
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <ItemsControl.ItemTemplate>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <DataTemplate>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <TextBlock	
  Text="{Binding	
  name}"/>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </DataTemplate>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </ItemsControl.ItemTemplate>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </ItemsControl>
	
  	
  	
  	
  	
  	
  </ScrollViewer>
	
  	
  </Grid>
@piccoloaiutante - OrangeCodeMichele Capra
Manually test the UI
Tuesday, May 14, 13
Building High Performance and Reliable
Windows Phone 8 Apps
@piccoloaiutante - OrangeCodeMichele Capra
What are we going to see
Tuesday, May 14, 13
This subject involves different part of your
application.
• App startup
• UI Thread
• Images
@piccoloaiutante - OrangeCodeMichele Capra
Performance
Tuesday, May 14, 13
This subject involves different part of your
application.
• App startup
• UI Thread
• Images
@piccoloaiutante - OrangeCodeMichele Capra
Performance
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
Windows Phone 8 - Thread Architecture
UI
Thread
(touch,
XAML,
draw visual,
handler)
Compsition
Thread
( feed GPU,
texture,
handle
transform)
GPU
Your
App
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
Windows Phone 8 - Thread Architecture
UI
Thread
(touch,
XAML,
draw visual,
handler)
Compsition
Thread
( feed GPU,
texture,
handle
transform)
GPU
Your
App
Maintaining a lightweight UI
thread is the key to writing a
responsive app.
Tuesday, May 14, 13
UI thread: handles all input, which
includes touching, parsing and creating
objects from XAML, layout calculations,
data binding, drawing all visuals (at least
the first time they are drawn), rendering/
rastering, process per-frame callbacks and
executing other user code and event
handlers.
@piccoloaiutante - OrangeCodeMichele Capra
UI thread
Tuesday, May 14, 13
Composition/Render thread: feeds the
GPU with textures and handles transform
(scale, rotate, translate) animations and
plane projections.
@piccoloaiutante - OrangeCodeMichele Capra
Slice titile
Tuesday, May 14, 13
• Microsoft recommendation related to
performance issues http://bit.ly/10yuFRw
• Performance best practice http://bit.ly/
PiOzz9
@piccoloaiutante - OrangeCodeMichele Capra
General Bottleneck
Tuesday, May 14, 13
How users perceive your app performance:
• Startup time
• Responsiveness
@piccoloaiutante - OrangeCodeMichele Capra
Performance
Tuesday, May 14, 13
Visual Studio 2012 provides the Windows
Phone Application Analysis tool.
Main feature:
• App Monitoring
• Profiling
@piccoloaiutante - OrangeCodeMichele Capra
Performance tools
Tuesday, May 14, 13
App Monitoring: you can evaluate the most
important behaviors of your app that
contribute to a good user experience, such
as start time and responsiveness.
@piccoloaiutante - OrangeCodeMichele Capra
App monitoring
Tuesday, May 14, 13
Profiling: you can evaluate either
execution-related or memory-usage aspects
of your app.
@piccoloaiutante - OrangeCodeMichele Capra
Profiling
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
App Analysis example App
Demo application with heavy jpg images
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
Performance tools
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
Performance tool session
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
Performance tool session
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
Performance tool session
Tuesday, May 14, 13
@piccoloaiutante - OrangeCodeMichele Capra
Performance tool session
Tuesday, May 14, 13
Execution profiling graphs:
• External events
• Frame rate
• CPU usage %
• Application responsiveness
• Network data transfer MBps
• Battery consumption mAh
• Memory usage MB
• Storyboards
• Image loads
• GC events
@piccoloaiutante - OrangeCodeMichele Capra
Other session indicators
Memory profiling graphs:
• Memory usage MB
• Image loads
• GC events
Tuesday, May 14, 13
Visual Studio 2012 update 2, Windows
Phone 8 SDK
Unit testing:
• MS Test
• Moq as mocking framework
Profiling:
• Windows Phone Application Analysis tool
@piccoloaiutante - OrangeCodeMichele Capra
Quick recap
Tuesday, May 14, 13
Email: michele@orangecode.it
Twitter: @piccoloaiutante
Blog: orangecode.it/blog
GitHub: github.com/piccoloaiutante
Linkedin:it.linkedin.com/in/michelecapra
@piccoloaiutante - OrangeCodeMichele Capra
That’s all folks
Tuesday, May 14, 13

More Related Content

What's hot

Play framework training by Neelkanth Sachdeva @ Scala traits event , New Delh...
Play framework training by Neelkanth Sachdeva @ Scala traits event , New Delh...Play framework training by Neelkanth Sachdeva @ Scala traits event , New Delh...
Play framework training by Neelkanth Sachdeva @ Scala traits event , New Delh...Knoldus Inc.
 
Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]Sven Efftinge
 
Rapid Prototyping with Solr
Rapid Prototyping with SolrRapid Prototyping with Solr
Rapid Prototyping with SolrErik Hatcher
 
Rapid prototyping search applications with solr
Rapid prototyping search applications with solrRapid prototyping search applications with solr
Rapid prototyping search applications with solrLucidworks (Archived)
 
Everybody Loves AFNetworking ... and So Can you!
Everybody Loves AFNetworking ... and So Can you!Everybody Loves AFNetworking ... and So Can you!
Everybody Loves AFNetworking ... and So Can you!jeffsoto
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadDavid Gómez García
 
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!Ryosuke Uchitate
 
Advanced #2 networking
Advanced #2   networkingAdvanced #2   networking
Advanced #2 networkingVitali Pekelis
 
Dpilot Source Code With ScreenShots
Dpilot Source Code With ScreenShots Dpilot Source Code With ScreenShots
Dpilot Source Code With ScreenShots DeepAnshu Sharma
 
Source Code for Dpilot
Source Code for Dpilot Source Code for Dpilot
Source Code for Dpilot Nidhi Chauhan
 
Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackGaryCoady
 
Easy data-with-spring-data-jpa
Easy data-with-spring-data-jpaEasy data-with-spring-data-jpa
Easy data-with-spring-data-jpaStaples
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Ryosuke Uchitate
 
Lazy vs. Eager Loading Strategies in JPA 2.1
Lazy vs. Eager Loading Strategies in JPA 2.1Lazy vs. Eager Loading Strategies in JPA 2.1
Lazy vs. Eager Loading Strategies in JPA 2.1Patrycja Wegrzynowicz
 

What's hot (19)

Play framework training by Neelkanth Sachdeva @ Scala traits event , New Delh...
Play framework training by Neelkanth Sachdeva @ Scala traits event , New Delh...Play framework training by Neelkanth Sachdeva @ Scala traits event , New Delh...
Play framework training by Neelkanth Sachdeva @ Scala traits event , New Delh...
 
Rest in flask
Rest in flaskRest in flask
Rest in flask
 
Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]
 
Rapid Prototyping with Solr
Rapid Prototyping with SolrRapid Prototyping with Solr
Rapid Prototyping with Solr
 
Rapid prototyping search applications with solr
Rapid prototyping search applications with solrRapid prototyping search applications with solr
Rapid prototyping search applications with solr
 
Everybody Loves AFNetworking ... and So Can you!
Everybody Loves AFNetworking ... and So Can you!Everybody Loves AFNetworking ... and So Can you!
Everybody Loves AFNetworking ... and So Can you!
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidad
 
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
 
Advanced #2 networking
Advanced #2   networkingAdvanced #2   networking
Advanced #2 networking
 
Dpilot Source Code With ScreenShots
Dpilot Source Code With ScreenShots Dpilot Source Code With ScreenShots
Dpilot Source Code With ScreenShots
 
Source Code for Dpilot
Source Code for Dpilot Source Code for Dpilot
Source Code for Dpilot
 
Ad java prac sol set
Ad java prac sol setAd java prac sol set
Ad java prac sol set
 
Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web Stack
 
Xml parsers
Xml parsersXml parsers
Xml parsers
 
Easy data-with-spring-data-jpa
Easy data-with-spring-data-jpaEasy data-with-spring-data-jpa
Easy data-with-spring-data-jpa
 
Nancy + rest mow2012
Nancy + rest   mow2012Nancy + rest   mow2012
Nancy + rest mow2012
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
 
Lazy vs. Eager Loading Strategies in JPA 2.1
Lazy vs. Eager Loading Strategies in JPA 2.1Lazy vs. Eager Loading Strategies in JPA 2.1
Lazy vs. Eager Loading Strategies in JPA 2.1
 
Rails on Oracle 2011
Rails on Oracle 2011Rails on Oracle 2011
Rails on Oracle 2011
 

Viewers also liked

Mobile application
Mobile applicationMobile application
Mobile applicationenunmint
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.jsMichele Capra
 
Getting started with Windows Phone 7 and unit test
Getting started with Windows Phone 7 and unit testGetting started with Windows Phone 7 and unit test
Getting started with Windows Phone 7 and unit testMichele Capra
 
Mobile application
Mobile applicationMobile application
Mobile applicationenunmint
 
Biografia bryan mena 1 bachillerato b
Biografia bryan mena 1 bachillerato bBiografia bryan mena 1 bachillerato b
Biografia bryan mena 1 bachillerato bBryan100500
 
Biografia bryan mena 1 bachillerato b
Biografia bryan mena 1 bachillerato bBiografia bryan mena 1 bachillerato b
Biografia bryan mena 1 bachillerato bBryan100500
 

Viewers also liked (6)

Mobile application
Mobile applicationMobile application
Mobile application
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
Getting started with Windows Phone 7 and unit test
Getting started with Windows Phone 7 and unit testGetting started with Windows Phone 7 and unit test
Getting started with Windows Phone 7 and unit test
 
Mobile application
Mobile applicationMobile application
Mobile application
 
Biografia bryan mena 1 bachillerato b
Biografia bryan mena 1 bachillerato bBiografia bryan mena 1 bachillerato b
Biografia bryan mena 1 bachillerato b
 
Biografia bryan mena 1 bachillerato b
Biografia bryan mena 1 bachillerato bBiografia bryan mena 1 bachillerato b
Biografia bryan mena 1 bachillerato b
 

Similar to Building High Performance and Reliable Windows Phone 8 Apps

Jersey framework
Jersey frameworkJersey framework
Jersey frameworkknight1128
 
Lone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AngleLone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AnglePablo Godel
 
Drupal 8 configuration system for coders and site builders - Drupalaton 2013
Drupal 8 configuration system for coders and site builders - Drupalaton 2013Drupal 8 configuration system for coders and site builders - Drupalaton 2013
Drupal 8 configuration system for coders and site builders - Drupalaton 2013swentel
 
XML-Free Programming : Java Server and Client Development without &lt;>
XML-Free Programming : Java Server and Client Development without &lt;>XML-Free Programming : Java Server and Client Development without &lt;>
XML-Free Programming : Java Server and Client Development without &lt;>Arun Gupta
 
Multi Client Development with Spring - Josh Long
Multi Client Development with Spring - Josh Long Multi Client Development with Spring - Josh Long
Multi Client Development with Spring - Josh Long jaxconf
 
spring3.2 java config Servler3
spring3.2 java config Servler3spring3.2 java config Servler3
spring3.2 java config Servler3YongHyuk Lee
 
Elasticsearch in 15 minutes
Elasticsearch in 15 minutesElasticsearch in 15 minutes
Elasticsearch in 15 minutesDavid Pilato
 
CDI do básico ao avançado
CDI do básico ao avançadoCDI do básico ao avançado
CDI do básico ao avançadoAlberto Souza
 
Java Technology
Java TechnologyJava Technology
Java Technologyifnu bima
 
Keeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkKeeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkJeremy Kendall
 
Working Towards RESTful Web Servies
Working Towards RESTful Web ServiesWorking Towards RESTful Web Servies
Working Towards RESTful Web Serviesjzehavi
 
Tek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJSTek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJSPablo Godel
 
What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...Richard McIntyre
 
How to write better code: in-depth best practices for writing readable, simpl...
How to write better code: in-depth best practices for writing readable, simpl...How to write better code: in-depth best practices for writing readable, simpl...
How to write better code: in-depth best practices for writing readable, simpl...Oursky
 
How to write better code: in-depth best practices for writing readable, simpl...
How to write better code: in-depth best practices for writing readable, simpl...How to write better code: in-depth best practices for writing readable, simpl...
How to write better code: in-depth best practices for writing readable, simpl...Jane Chung
 
SAPS - Semantic AtomPub-based Services
SAPS - Semantic AtomPub-based ServicesSAPS - Semantic AtomPub-based Services
SAPS - Semantic AtomPub-based ServicesMarkus Lanthaler
 
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
実例で学ぶ、明日から使えるSpring Boot Tips #jsug実例で学ぶ、明日から使えるSpring Boot Tips #jsug
実例で学ぶ、明日から使えるSpring Boot Tips #jsugToshiaki Maki
 

Similar to Building High Performance and Reliable Windows Phone 8 Apps (20)

Jersey framework
Jersey frameworkJersey framework
Jersey framework
 
Lone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AngleLone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New Angle
 
Empezando con Twig
Empezando con TwigEmpezando con Twig
Empezando con Twig
 
Drupal 8 configuration system for coders and site builders - Drupalaton 2013
Drupal 8 configuration system for coders and site builders - Drupalaton 2013Drupal 8 configuration system for coders and site builders - Drupalaton 2013
Drupal 8 configuration system for coders and site builders - Drupalaton 2013
 
XML-Free Programming : Java Server and Client Development without &lt;>
XML-Free Programming : Java Server and Client Development without &lt;>XML-Free Programming : Java Server and Client Development without &lt;>
XML-Free Programming : Java Server and Client Development without &lt;>
 
Multi Client Development with Spring - Josh Long
Multi Client Development with Spring - Josh Long Multi Client Development with Spring - Josh Long
Multi Client Development with Spring - Josh Long
 
spring3.2 java config Servler3
spring3.2 java config Servler3spring3.2 java config Servler3
spring3.2 java config Servler3
 
Elasticsearch in 15 minutes
Elasticsearch in 15 minutesElasticsearch in 15 minutes
Elasticsearch in 15 minutes
 
CDI do básico ao avançado
CDI do básico ao avançadoCDI do básico ao avançado
CDI do básico ao avançado
 
Java Technology
Java TechnologyJava Technology
Java Technology
 
Keeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkKeeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro framework
 
Working Towards RESTful Web Servies
Working Towards RESTful Web ServiesWorking Towards RESTful Web Servies
Working Towards RESTful Web Servies
 
I motion
I motionI motion
I motion
 
Tek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJSTek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJS
 
What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...
 
TL; DR: iOS 9R
TL; DR: iOS 9RTL; DR: iOS 9R
TL; DR: iOS 9R
 
How to write better code: in-depth best practices for writing readable, simpl...
How to write better code: in-depth best practices for writing readable, simpl...How to write better code: in-depth best practices for writing readable, simpl...
How to write better code: in-depth best practices for writing readable, simpl...
 
How to write better code: in-depth best practices for writing readable, simpl...
How to write better code: in-depth best practices for writing readable, simpl...How to write better code: in-depth best practices for writing readable, simpl...
How to write better code: in-depth best practices for writing readable, simpl...
 
SAPS - Semantic AtomPub-based Services
SAPS - Semantic AtomPub-based ServicesSAPS - Semantic AtomPub-based Services
SAPS - Semantic AtomPub-based Services
 
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
実例で学ぶ、明日から使えるSpring Boot Tips #jsug実例で学ぶ、明日から使えるSpring Boot Tips #jsug
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
 

More from Michele Capra

Nodeschool italy at codemotion
Nodeschool italy at codemotionNodeschool italy at codemotion
Nodeschool italy at codemotionMichele Capra
 
Little bits & node.js IOT for beginner
Little bits & node.js IOT for beginnerLittle bits & node.js IOT for beginner
Little bits & node.js IOT for beginnerMichele Capra
 
Testing Windows Phone 8.1 app with unit test and Coded UI test
Testing Windows Phone 8.1 app with unit test and Coded UI testTesting Windows Phone 8.1 app with unit test and Coded UI test
Testing Windows Phone 8.1 app with unit test and Coded UI testMichele Capra
 
Porting business apps to Windows Phone
Porting business apps to Windows PhonePorting business apps to Windows Phone
Porting business apps to Windows PhoneMichele Capra
 
The magic of Dynamic in Nancy Fx
The magic of Dynamic in Nancy FxThe magic of Dynamic in Nancy Fx
The magic of Dynamic in Nancy FxMichele Capra
 
Windows Phone 7 Development
Windows Phone 7 DevelopmentWindows Phone 7 Development
Windows Phone 7 DevelopmentMichele Capra
 
My Final Dissertation
My Final DissertationMy Final Dissertation
My Final DissertationMichele Capra
 

More from Michele Capra (7)

Nodeschool italy at codemotion
Nodeschool italy at codemotionNodeschool italy at codemotion
Nodeschool italy at codemotion
 
Little bits & node.js IOT for beginner
Little bits & node.js IOT for beginnerLittle bits & node.js IOT for beginner
Little bits & node.js IOT for beginner
 
Testing Windows Phone 8.1 app with unit test and Coded UI test
Testing Windows Phone 8.1 app with unit test and Coded UI testTesting Windows Phone 8.1 app with unit test and Coded UI test
Testing Windows Phone 8.1 app with unit test and Coded UI test
 
Porting business apps to Windows Phone
Porting business apps to Windows PhonePorting business apps to Windows Phone
Porting business apps to Windows Phone
 
The magic of Dynamic in Nancy Fx
The magic of Dynamic in Nancy FxThe magic of Dynamic in Nancy Fx
The magic of Dynamic in Nancy Fx
 
Windows Phone 7 Development
Windows Phone 7 DevelopmentWindows Phone 7 Development
Windows Phone 7 Development
 
My Final Dissertation
My Final DissertationMy Final Dissertation
My Final Dissertation
 

Recently uploaded

Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxGenerative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxfnnc6jmgwh
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Nikki Chapple
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...itnewsafrica
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkPixlogix Infotech
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 

Recently uploaded (20)

Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxGenerative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App Framework
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 

Building High Performance and Reliable Windows Phone 8 Apps

  • 1. @piccoloaiutante - michele@orangecode.it OrangeCode Michele Capra Building High Performance and Reliable Windows Phone 8 Apps Tuesday, May 14, 13
  • 2. Software contractor : - C# Asp.net mvc, Wpf, Windows Phone.. - Python, Django - WebDeBs Founder @piccoloaiutante - OrangeCodeMichele Capra Who i am Tuesday, May 14, 13
  • 3. Building High Performance and Reliable Windows Phone 8 Apps @piccoloaiutante - OrangeCodeMichele Capra What are we going to see Tuesday, May 14, 13
  • 4. Building High Performance and Reliable Windows Phone 8 Apps @piccoloaiutante - OrangeCodeMichele Capra What are we going to see Tuesday, May 14, 13
  • 5. Building High Performance and Reliable Windows Phone 8 Apps @piccoloaiutante - OrangeCodeMichele Capra What are we going to see Tuesday, May 14, 13
  • 6. In general, reliability (systemic def.) is the ability of a person or system to perform and maintain its functions in routine circumstances, as well as hostile or unexpected circumstances. Wikipedia @piccoloaiutante - OrangeCodeMichele Capra Reliability Tuesday, May 14, 13
  • 7. @piccoloaiutante - OrangeCodeMichele Capra Reliability In general, reliability (systemic def.) is the ability of a person or system to perform and maintain its functions in routine circumstances, as well as hostile or unexpected circumstances. Wikipedia Tuesday, May 14, 13
  • 8. How can we achieve reliability? • Test your app @piccoloaiutante - OrangeCodeMichele Capra Reliability Tuesday, May 14, 13
  • 9. Use automatic tests while you’re building your app. Manually test your app at the end, especially when you’re integrating logic and UI. @piccoloaiutante - OrangeCodeMichele Capra Testing Tuesday, May 14, 13
  • 10. Use automatic tests while you’re building your app. Manually test your app at the end, especially when you’re integrating logic and UI. @piccoloaiutante - OrangeCodeMichele Capra Testing Tuesday, May 14, 13
  • 11. Basic application: - Query Spotify database - Show result @piccoloaiutante - OrangeCodeMichele Capra Sample App Tuesday, May 14, 13
  • 12. @piccoloaiutante - OrangeCodeMichele Capra Sample App Tuesday, May 14, 13
  • 13. @piccoloaiutante - OrangeCodeMichele Capra Sample App http://ws.spotify.com/service/version/ method[.format]?parameters Tuesday, May 14, 13
  • 14. Architectural Pattern: • Derived from Presentation Model pattern (Fowler) • Clear separation between UI and Logic Structure our code: • ViewModel (c#): Logic • View (Xaml): Presentation @piccoloaiutante - OrangeCodeMichele Capra Model-View-ViewModel in Windows Phone 8 Tuesday, May 14, 13
  • 15. @piccoloaiutante - OrangeCodeMichele Capra Model-View-ViewModel in Windows Phone 8 ViewModel View Property Binding Tuesday, May 14, 13
  • 16. We have to make a REST call to Spotify API. We are going to create a service (a class called SongService) that could support our ViewModel in this action. @piccoloaiutante - OrangeCodeMichele Capra Make a query to Spotify Tuesday, May 14, 13
  • 17. @piccoloaiutante - OrangeCodeMichele Capra Model-View-ViewModel in Windows Phone 8 ViewModelView Song Service Tuesday, May 14, 13
  • 18.    <StackPanel  x:Name="TitlePanel"  Grid.Row="0"  Margin="12,17,0,28">            <TextBlock  Text="OrangeCode"    Margin="12,0"/>            <TextBlock  Text="Spotify  Viewer"  Margin="9,-­‐7,0,0"  />    </StackPanel>    <Grid  x:Name="ContentPanel"  Grid.Row="1"  Margin="12,0,12,0">            <Grid.RowDefinitions>                    <RowDefinition  Height="80"/>                    <RowDefinition  Height="*"/>            </Grid.RowDefinitions>            <Grid  >                  <Grid.ColumnDefinitions>                        <ColumnDefinition  Width="*"/>                        <ColumnDefinition  Width="150"/>                  </Grid.ColumnDefinitions>                  <TextBox    Text="{Binding  SearchedText,Mode=TwoWay}"/>                  <Button  Content="search"  Command="{Binding  Search}"/>            </Grid>            <ScrollViewer  Grid.Row="1">                    <ItemsControl  ItemsSource="{Binding  TrackList}">                            <ItemsControl.ItemTemplate>                                    <DataTemplate>                                            <TextBlock  Text="{Binding  name}"/>                                    </DataTemplate>                            </ItemsControl.ItemTemplate>                    </ItemsControl>            </ScrollViewer>    </Grid> @piccoloaiutante - OrangeCodeMichele Capra UI Language - Xaml Tuesday, May 14, 13
  • 19.    <StackPanel  x:Name="TitlePanel"  Grid.Row="0"  Margin="12,17,0,28">            <TextBlock  Text="OrangeCode"    Margin="12,0"/>            <TextBlock  Text="Spotify  Viewer"  Margin="9,-­‐7,0,0"  />    </StackPanel>    <Grid  x:Name="ContentPanel"  Grid.Row="1"  Margin="12,0,12,0">            <Grid.RowDefinitions>                    <RowDefinition  Height="80"/>                    <RowDefinition  Height="*"/>            </Grid.RowDefinitions>            <Grid  >                  <Grid.ColumnDefinitions>                        <ColumnDefinition  Width="*"/>                        <ColumnDefinition  Width="150"/>                  </Grid.ColumnDefinitions>                  <TextBox    Text="{Binding  SearchedText,Mode=TwoWay}"/>                  <Button  Content="search"  Command="{Binding  Search}"/>            </Grid>            <ScrollViewer  Grid.Row="1">                    <ItemsControl  ItemsSource="{Binding  TrackList}">                            <ItemsControl.ItemTemplate>                                    <DataTemplate>                                            <TextBlock  Text="{Binding  name}"/>                                    </DataTemplate>                            </ItemsControl.ItemTemplate>                    </ItemsControl>            </ScrollViewer>    </Grid> @piccoloaiutante - OrangeCodeMichele Capra UI Language - Xaml Tuesday, May 14, 13
  • 20.      public  class  MainViewModel        {              private  readonly  ISongService  _songService;              public  string  SearchedText  {  get;  set;  }              public  IList<track>  TrackList  {  get;  set;  }              public  MainViewModel(ISongService  songService)              {                      _songService  =  songService;                      TrackList=  new  List<track>();              }              public  async  Task    Search()              {    var  data  =  await  _songService.Query(SearchedText);                      TrackList  =  data.tracks;                        OnPropertyChanged("TrackList");              }      } @piccoloaiutante - OrangeCodeMichele Capra Logic Language - C# Tuesday, May 14, 13
  • 21.      public  class  MainViewModel        {              private  readonly  ISongService  _songService;              public  string  SearchedText  {  get;  set;  }              public  IList<track>  TrackList  {  get;  set;  }              public  MainViewModel(ISongService  songService)              {                      _songService  =  songService;                      TrackList=  new  List<track>();              }              public  async  Task    Search()              {    var  data  =  await  _songService.Query(SearchedText);                      TrackList  =  data.tracks;                        OnPropertyChanged("TrackList");              }      } @piccoloaiutante - OrangeCodeMichele Capra Logic Language - C# Tuesday, May 14, 13
  • 22. @piccoloaiutante - OrangeCodeMichele Capra Project Structure Tuesday, May 14, 13
  • 23. public class SongService : ISongService { string _baseUrl; private RestClient _client; public SongService() { _client = new RestClient(); _client.BaseUrl = "http://ws.spotify.com/search/1/track.json?q="; } public Task<info> Query(string query) { var request = new RestRequest(query, Method.GET); var response= await _client.ExecuteTaskAsync<info>(request); return response.Data; } } @piccoloaiutante - OrangeCodeMichele Capra SongService Tuesday, May 14, 13
  • 24. public class SongService : ISongService { string _baseUrl; private RestClient _client; public SongService() { _client = new RestClient(); _client.BaseUrl = "http://ws.spotify.com/search/1/track.json?q="; } public Task<info> Query(string query) { var request = new RestRequest(query, Method.GET); var response= await _client.ExecuteTaskAsync<info>(request); return response.Data; } } @piccoloaiutante - OrangeCodeMichele Capra SongService Tuesday, May 14, 13
  • 25. [TestClass] public class SongServiceFixture { private SongService _service; public SongServiceFixture() { _service = new SongService(); } [TestMethod] public async Task Query_Should_Return_Result_From_Spotify_Service() { var data = await _service.Query("Madonna"); Assert.IsTrue(data.tracks.Count!=0); } } @piccoloaiutante - OrangeCodeMichele Capra SongService Test Tuesday, May 14, 13
  • 26. [TestClass] public class SongServiceFixture { private SongService _service; public SongServiceFixture() { _service = new SongService(); } [TestMethod] public async Task Query_Should_Return_Result_From_Spotify_Service() { var data = await _service.Query("Madonna"); Assert.IsTrue(data.tracks.Count!=0); } } @piccoloaiutante - OrangeCodeMichele Capra SongService Test Tuesday, May 14, 13
  • 27. @piccoloaiutante - OrangeCodeMichele Capra MS Test Runner Tuesday, May 14, 13
  • 28. public class MainViewModel { private readonly ISongService _songService; public string SearchedText { get; set; } public IList<track> TrackList { get; set; } public MainViewModel(ISongService songService) { _songService = songService; TrackList= new List<track>(); } public async Task Search() { TrackList = (await _songService.Query(SearchedText)).tracks; } } @piccoloaiutante - OrangeCodeMichele Capra ViewModel with service Tuesday, May 14, 13
  • 29. public class MainViewModel { private readonly ISongService _songService; public string SearchedText { get; set; } public IList<track> TrackList { get; set; } public MainViewModel(ISongService songService) { _songService = songService; TrackList= new List<track>(); } public async Task Search() { TrackList = (await _songService.Query(SearchedText)).tracks; } } @piccoloaiutante - OrangeCodeMichele Capra ViewModel with service Tuesday, May 14, 13
  • 30. [TestMethod] public void Search_Should_Get_Songs_From_Service() { var viewModel = new MainViewModel( new SongSearchService()); viewModel.SearchedText = "Madonna"; await viewModel.Search(); Assert.IsNotNull(viewModel.TrackList); Assert.IsTrue(viewModel.TrackList.Count >= 1); } @piccoloaiutante - OrangeCodeMichele Capra Testing ViewModel with Service Tuesday, May 14, 13
  • 31. [TestMethod] public void Search_Should_Get_Songs_From_Service() { var viewModel = new MainViewModel( new SongSearchService()); viewModel.SearchedText = "Madonna"; await viewModel.Search(); Assert.IsNotNull(viewModel.TrackList); Assert.IsTrue(viewModel.TrackList.Count >= 1); } @piccoloaiutante - OrangeCodeMichele Capra Testing ViewModel with Service Tuesday, May 14, 13
  • 32. @piccoloaiutante - OrangeCodeMichele Capra MS Test Runner Tuesday, May 14, 13
  • 33.    <StackPanel  x:Name="TitlePanel"  Grid.Row="0"  Margin="12,17,0,28">            <TextBlock  Text="OrangeCode"    Margin="12,0"/>            <TextBlock  Text="Spotify  Viewer"  Margin="9,-­‐7,0,0"  />    </StackPanel>    <Grid  x:Name="ContentPanel"  Grid.Row="1"  Margin="12,0,12,0">            <Grid.RowDefinitions>                    <RowDefinition  Height="80"/>                    <RowDefinition  Height="*"/>            </Grid.RowDefinitions>            <Grid  >                  <Grid.ColumnDefinitions>                        <ColumnDefinition  Width="*"/>                        <ColumnDefinition  Width="150"/>                  </Grid.ColumnDefinitions>                  <TextBox    Text="{Binding  SearchedText,Mode=TwoWay}"/>                  <Button  Content="search"  Command="{Binding  Search}"/>            </Grid>            <ScrollViewer  Grid.Row="1">                    <ItemsControl  ItemsSource="{Binding  TrackList}">                            <ItemsControl.ItemTemplate>                                    <DataTemplate>                                            <TextBlock  Text="{Binding  name}"/>                                    </DataTemplate>                            </ItemsControl.ItemTemplate>                    </ItemsControl>            </ScrollViewer>    </Grid> @piccoloaiutante - OrangeCodeMichele Capra Manually test the UI Tuesday, May 14, 13
  • 34. Building High Performance and Reliable Windows Phone 8 Apps @piccoloaiutante - OrangeCodeMichele Capra What are we going to see Tuesday, May 14, 13
  • 35. This subject involves different part of your application. • App startup • UI Thread • Images @piccoloaiutante - OrangeCodeMichele Capra Performance Tuesday, May 14, 13
  • 36. This subject involves different part of your application. • App startup • UI Thread • Images @piccoloaiutante - OrangeCodeMichele Capra Performance Tuesday, May 14, 13
  • 37. @piccoloaiutante - OrangeCodeMichele Capra Windows Phone 8 - Thread Architecture UI Thread (touch, XAML, draw visual, handler) Compsition Thread ( feed GPU, texture, handle transform) GPU Your App Tuesday, May 14, 13
  • 38. @piccoloaiutante - OrangeCodeMichele Capra Windows Phone 8 - Thread Architecture UI Thread (touch, XAML, draw visual, handler) Compsition Thread ( feed GPU, texture, handle transform) GPU Your App Maintaining a lightweight UI thread is the key to writing a responsive app. Tuesday, May 14, 13
  • 39. UI thread: handles all input, which includes touching, parsing and creating objects from XAML, layout calculations, data binding, drawing all visuals (at least the first time they are drawn), rendering/ rastering, process per-frame callbacks and executing other user code and event handlers. @piccoloaiutante - OrangeCodeMichele Capra UI thread Tuesday, May 14, 13
  • 40. Composition/Render thread: feeds the GPU with textures and handles transform (scale, rotate, translate) animations and plane projections. @piccoloaiutante - OrangeCodeMichele Capra Slice titile Tuesday, May 14, 13
  • 41. • Microsoft recommendation related to performance issues http://bit.ly/10yuFRw • Performance best practice http://bit.ly/ PiOzz9 @piccoloaiutante - OrangeCodeMichele Capra General Bottleneck Tuesday, May 14, 13
  • 42. How users perceive your app performance: • Startup time • Responsiveness @piccoloaiutante - OrangeCodeMichele Capra Performance Tuesday, May 14, 13
  • 43. Visual Studio 2012 provides the Windows Phone Application Analysis tool. Main feature: • App Monitoring • Profiling @piccoloaiutante - OrangeCodeMichele Capra Performance tools Tuesday, May 14, 13
  • 44. App Monitoring: you can evaluate the most important behaviors of your app that contribute to a good user experience, such as start time and responsiveness. @piccoloaiutante - OrangeCodeMichele Capra App monitoring Tuesday, May 14, 13
  • 45. Profiling: you can evaluate either execution-related or memory-usage aspects of your app. @piccoloaiutante - OrangeCodeMichele Capra Profiling Tuesday, May 14, 13
  • 46. @piccoloaiutante - OrangeCodeMichele Capra App Analysis example App Demo application with heavy jpg images Tuesday, May 14, 13
  • 47. @piccoloaiutante - OrangeCodeMichele Capra Performance tools Tuesday, May 14, 13
  • 48. @piccoloaiutante - OrangeCodeMichele Capra Performance tool session Tuesday, May 14, 13
  • 49. @piccoloaiutante - OrangeCodeMichele Capra Performance tool session Tuesday, May 14, 13
  • 50. @piccoloaiutante - OrangeCodeMichele Capra Performance tool session Tuesday, May 14, 13
  • 51. @piccoloaiutante - OrangeCodeMichele Capra Performance tool session Tuesday, May 14, 13
  • 52. Execution profiling graphs: • External events • Frame rate • CPU usage % • Application responsiveness • Network data transfer MBps • Battery consumption mAh • Memory usage MB • Storyboards • Image loads • GC events @piccoloaiutante - OrangeCodeMichele Capra Other session indicators Memory profiling graphs: • Memory usage MB • Image loads • GC events Tuesday, May 14, 13
  • 53. Visual Studio 2012 update 2, Windows Phone 8 SDK Unit testing: • MS Test • Moq as mocking framework Profiling: • Windows Phone Application Analysis tool @piccoloaiutante - OrangeCodeMichele Capra Quick recap Tuesday, May 14, 13
  • 54. Email: michele@orangecode.it Twitter: @piccoloaiutante Blog: orangecode.it/blog GitHub: github.com/piccoloaiutante Linkedin:it.linkedin.com/in/michelecapra @piccoloaiutante - OrangeCodeMichele Capra That’s all folks Tuesday, May 14, 13