Windows Mobile Support

  • Subscribe to our RSS feed.
  • Twitter
  • StumbleUpon
  • Reddit
  • Facebook
  • Digg

Tuesday, 30 April 2013

Event-Driven message consumtion (aka pump model) - Windows Azure Service Bus

Posted on 19:42 by Unknown
The new version of Windows Azure SDK was launched. I’m glad to see that new feature of Service Bus are available. For me, one of the most important features that was added to Service Bus is the one that give us the possibility to consume messages from a topic or queue using an event-driven model – “pump model”.
Until now, we had to have an infinite loop which check if a new message is available. This simple solution was good, but it was very primitive. In a real production application, a new message would trigger an event that would execute a specific code.
To be able to support something like this, the user would need to create an infinite loop, check if a new message is available and trigger a specific event. This infinite pooling creates a lot of problems, especially when something would go wrong – detecting an error and managing it.
while (true)
{
try
{
if (isNotStopped)
{
break;
}

BrokeredMessage message = null;
message = queueClient.Receive();

if (mesage == null)
{
// No message available;
continue;
}

Process(message);
message.Complete();
}
catch (Exception ex)
{
...
}
}
With the new SDK, we don’t need to do this anymore. We can remote the infinite loop from our code and switch to something more elegant.
OnMessageOptions messageOptions =new OnMessageOptions()
{
AutoComplete = true,
MaxConcurrentCalls = 7
}
messageOptions.ExceptionReceived += (sender, e) =>
{
...
}

QueueClient client = QueueClient.Create(...);
client.OnMessage(
(message)=>
{
... process message
},
messageOptions);
As we can see, we need to specify an event action that will be executing when a new message is available. The parameter or this event is the message itself – BrokeredMessage. This message can be process in any way we want.
In the code, beside the message arrived event I think that you notice the exception received event. This event will be called when an error occurs during the message processing. For example, if during the message arrive event an error occurs, the error will trigger the exception received event.
It is important to know that you should not catch errors in the message received event. Doing something like this will not notify the Windows Azure SDK that something went wrong during the message processing. Because of this, in the case we want to consume message in the peek and lock pattern (and not remove messages that could not be processed with success) we will end up with an expected behavior - removing the messages that were not processed with success. This behavior will appear because we catch all the exception in the message arrive event and the SDK will not know that the message processing went wrong.
OnMessageOption class is used to specify different options about consuming model. Using this class we can specify the level of concurrency (MaxConccurentCalls) and how we want to consume the messages (peek and lock or received and delete). When the AutoComplete flag is set to true, the peek and lock mechanism will be used. This mean that in the moment when the message received event will end, our message will be marked as consumed and removed from Service Bus.
If we want to control this behavior, we need to set this flag to false. Because of this the Complete() method of the BrokeredMessage will not be called automatically. In the message received event we will need to call this method manually. Without calling this method and setting the AutoComplete flag set to false, message will not be removed from Service Bus anymore – Service Bus will expect the success confirmation call.
OnMessageOptions messageOptions =new OnMessageOptions()
{
AutoComplete = false,
MaxConcurrentCalls = 7
}
messageOptions.ExceptionReceived += (sender, e) =>
{
...
}

QueueClient client = QueueClient.Create(...);
client.OnMessage(
(message)=>
{
... process message
message.Complete();
},
messageOptions);
These option class contains also an exception event that will be triggered in the moment when an error occurs. I recommend to always register to this event. Don’t forget – this event will be called when an exception occurs in the message received event.
This new feature of Service Bus will improve the user experience and our application code.
PS: Don't forget to use a a retry policy when you call the Complete() event.
Read More
Posted in Azure, Cloud, service bus, Windows Azure | No comments

Monday, 29 April 2013

[Post-Event] Windows Azure Boot Camp in Cluj-Napoca

Posted on 11:09 by Unknown
These Saturday all over the world Windows Azure Bootcamp took place. Of course we had to put Cluj-Napoca on the map – because of this we organize this event in Cluj also.
 All the people that participate had the opportunity to discover and use Windows Azure. At every session there where around 40 people.
There were 3 different sessions that explain how we can work with Service Bus, Mobile Services and how we can monitor our cloud applications.
At the end of the post you can find my session slides.

Read More
Posted in Azure, Cloud, Cluj, cluj-napoca, codecamp, eveniment, event, service bus, Windows Azure | No comments

[Post-Event] AISEC Cluj-Napoca, NoSQL

Posted on 00:28 by Unknown
Last weeks I was invited by AISEC Romania to talk about NoSQL at AISEC School. In the 3 hours session I tried to make students to understand why NoSQL can be an option for us. We need to think outside the box.
My presentations can be found here:
NoSQL from Radu Vunvulea
3 weeks ago I had another session at AISEC School where I talk about Windows Azure – link.
Read More
Posted in nosql | No comments

Thursday, 25 April 2013

Coding Stories III - JavaScript and Syntactic sugar

Posted on 05:50 by Unknown
Usually people tend to think that if a code has a low number of lines that it will be more easily to read and understand. A similar ideas is that a code that has a fewer number of lines will be faster.
In this post I will focus only on the first idea – code with a low number of line can be read and understand more easily.
JavaScript sample:
displayCustomValue: function (value) {
return value !== null ? value === 0 ? "ON" : "OFF" : "";
}
The cool thing is that it has only one line of code –one and powerful line of code. All of us know what a God class is. Based on this, we could say that our line of code from the method is a God line.
When I looked for the first time over this method I said something like: “Ouuhhh! What is the behavior of this method? … Ahhh, IF value is NULL then return an empty string. ELSE, IF the value is 0 then return ON, ELSE return OFF.
Good, now I understood this line of code. Even if the line looks cool, is not so simple to understand and can generate bugs very easily.
When you need to write something like this, don’t think that writing only one line of code will improve the code in one way or another.
value !== null ? value === 1 ? value === 2 ? "? ": "1" : "2" : "null"
I would retrieve our method to something like this:
displayCustomValue: function (value) {
if ( value === null )
{
return "";
}
if ( value === 0)
}
return "ON";
}
return "OFF";
}
Avoid using more than one “? :”  per line in any programming language. Writing code with a lot of “? :” will increase the Ouuhhh factor.

Read More
Posted in | No comments

Tuesday, 23 April 2013

Coding Stories || - John and Gigel

Posted on 23:24 by Unknown
Yesterday, I start looking over a web application. Unfortunately, I didn’t have the last version of the application. Why unfortunately? Because I was surprise to find something like this in the code:
public override string CssClass
{
get
{
if(ResourceManager.GetResourceAsString([someName])
{
return "gigel";
} else
{
return "john";
}

}
}
Remarks: Gigel is a name in Rumanian, like John, Tom. These two names are used in our language (Rumanian) especially in jokes and funny story.

Read More
Posted in | No comments

Monday, 22 April 2013

WCF and "Error in deserializing body of reply message for operation …" errors

Posted on 08:13 by Unknown
These days I had to update a component that is used in Microsoft Dynamic AX. I don’t know to work with AX, but some time ago I had to write a component in C# that calls a WCF service of a 3rd party and is used by an AX application.
The client proxy from C# component was update with the new client proxy; the code was also updated with the new logic. The unit-tests were updated also and we had a full green. Perfect, we send the component to AX team to update the reference to the component.
They come back to us with a big ugly error:
Error in deserializing body of reply message for operation …
WTF, we had the same endpoint. We had a client proxy that works on our unit-tests and a command line test application, but when AX make calls using our component we get this great error message. The oddest thing is that we receive this error even if the message that is returned from the endpoint has only 20 characters. Before updating the AX worked great with our component.
Looking over the internet we found we should need to increase the message size. We increased the size of the message like this:
<readerQuotas maxDepth="999990" maxStringContentLength="999990" maxArrayLength="999990" 
maxBytesPerRead="999990" maxNameTableCharCount="999990" />
This can be updated from code, if you have a custom binding that is set from code:
bindingElement.ReaderQuotas.MaxArrayLength = Int32.MaxValue;
bindingElement.ReaderQuotas.MaxBytesPerRead = Int32.MaxValue;
bindingElement.ReaderQuotas.MaxDepth = Int32.MaxValue;
bindingElement.ReaderQuotas.MaxNameTableCharCount = Int32.MaxValue;
bindingElement.ReaderQuotas.MaxStringContentLength = Int32.MaxValue;
Get what? The problem was solved, everything works as expected. The interesting thing is that even if the message from the servers was very small we still received the error message if we don’t set the reader quotas.
The error was pretty interesting, because we received this even if the message was extremely small.
Read More
Posted in WCF | No comments

Configuration files horror

Posted on 05:42 by Unknown
Nowadays, working with services is pretty simple. Almost anybody can create a WCF service and expose functionalists  The same thing is with WCF clients. .NET development environment can create the client proxy very easily.
When we are creating the client proxy, a part of the configuration will be added to the configuration file. In the configuration files we will find the URL of the service, which will be modified a lot of time during the development phase. We can have a testing service, a mock service, a development service and so on.
If the client and the service can be hosted on the same machine, than developers will be happy, but the configuration files will be a mess. They will forget that they change the URL address and they will make commits with this change. A part of them will use “localhost”, other part will use the machine name.
When you end up in a project with 40, 50 or almost 100 configuration files, changing the URL can become a time consuming process. Not only this, but you cannot use find and replace because each developer had a different machine name.
What we can do in this case? The simplest solution is to try to use different configuration file. From some time ago, Visual Studio support to have different configuration files for debug, release and we can even define custom versions. Each developer can have a version of the configuration file that will not end up on the source control.
To help developers, we can create a script that will generate the local configuration files for developers. In this way they will not have any kind of excuse that they change the configuration files.
How to do this http://vunvulearadu.blogspot.ro/2012/10/custom-configuration-files-for-each.html?showComment=1349791023842
Read More
Posted in | No comments

Sunday, 21 April 2013

Steam.CopyTo - Performance problems

Posted on 12:00 by Unknown
This week I heard about an interesting performance problem, that I want to share with you.
There is a desktop application that is used to import data from files to database. These files were in different formats, from XML to binary. Everything was fine, the application work great in the development and first phase of testing. All the code was double check, each stream was dispose when it was no longer used.
During the testing phase, the application started to have an odd behavior, the RAM memory started to go crazy. Normally, the application use around 200MB during an import, but there were times when more than 1500MB of ram were consumed. Not only this, but “Out of memory” exception appeared a lot of time during different imports. All this started too appeared at the testing phase.
With the same setup, developers manage to reproduce the problem and using the memory profiles that comes with Visual Studio the problem was spotted.
Stream stream1 = …
Stream stream2 = …
stream2.CopyTo(stream1);
The problem was with CopyTo method. Because this method was called a lot of time in a short period of time, the GC didn’t had time to dispose all the resources used during the copy process. This can become a big problem when the size of stream is pretty big. This method was introduce in .NET 4.0 and the scope of it is to copy the content of one stream to another. This is done by reading to a buffer of bytes (default buffer size is 4096) chunks from the stream and write them to the second stream. 
It is very similar with what we usually do in .NET 3.5 when we had to copy one stream to another:
public void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[size];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write (buffer, 0, read);
}
}
The problem is with the buffer that is represented as an array of bytes. If we call the CopyTo method from time to time with small streams will not have any kind of problem. But when we use big streams intensive, calling this method very often can create huge problems. Each time when we make new calls to this method, a new part of our memory will be allocated for the buffer. GC will not have time to clean the memory and we can end up with a lot of memory that is not disposed.
The solution for this problem was pretty simple. The CopyTo method was replaced with a BinaryReader that was used to copy the content of stream to an array of bytes. This array of bytes was later used to create the MemoryStream. In this way, the stream that was used for read data is disposed immediately (BinaryReader) and the array of bytes that is used as a buffer is used directly in the memory stream.
byte[] bytes;
using( BinaryReader reader = new BinaryReader(inputStream))
{
bytes = reader.ReadBytes((int)inputStream.Length);
}
outputStream = new MemoryStream(bytes, 0, bytes.Count());
Using this solution, the problem with the memory leak disappeared. It seems that not all time, the new API is the best solution when we need performance.
Read More
Posted in stream | No comments

Wednesday, 17 April 2013

Asynchronous Master Class, May 18-19, Cluj-Napoca

Posted on 12:39 by Unknown

In May we will have a great master class in Cluj-Napoca. Codecamp will bring Andrew Clymer and Richard Blewett to Cluj-Napoca. They will talk about asynchronous programming.

Registration link: http://codecamp-cluj-mai2013.eventbrite.com/

Toata lumea stie ca lucrul cu thread-uri nu este usor. Exista multe lucruri care pot sa mearga prost - problemele de concurenta sau de thread safe sunt la ordinea zilei. Codecamp doreste sa vina in ajutorul dezvoltatorilor din Cluj-Napoca cu un master class – Asynchronous Master Class. Acest master este in totalitate gratuit.
When: 18-19 Mai (full day’s event)
Where: Hotel Golden Tulip (Cluj-Napoca)
Cost: None
Master Class Title: Asynchronous Master Class
Trainers: Andrew Clymer and Richard Blewett
Abstract: The goal of the two days is to take people at various levels of asynchronous programming and show them a variety of programming styles, techniques to deliver modern asynchronous applications.
Topics: Tasks, Thread Safety, Concurrent Data Structures, Parallel Programming, Async and Await, Debugging asynchronous applications, Reactive framework

Toate persoanele care vor fi selectate pentru acest master class vor fi anuntate pe data de 14 Mai. Fiecare participant trebuie sa aibe asupra lui mailul de confirmare (printat). Accesul la acest master class se face pe baza acestuia.
Costurile acestui master class sunt suportate in totalitate de catre sponsorul acestui eveniment: iQuest

Registration link: http://codecamp-cluj-mai2013.eventbrite.com/
Read More
Posted in cluj-napoca, codecamp, eveniment, event | No comments

Monday, 15 April 2013

(Part 4) Testing the limits of Windows Azure Service Bus

Posted on 03:04 by Unknown

In the last post related to this subject we discover how we can process millions of messages over a network using Windows Azure Service Bus Topic. For the problem that we want to resolve we find out that 4 worker roles of Medium size is the perfect configuration for our case.
In this post we will talk about costs. We will see what the costs to process 10.000.000 messages are. We assume that messages are send to Service Bus from our on-premise servers. If the messages are send from our the same data center, the cost related to bandwidth would be 0.
Sending messages to Service Bus

  • Sending messages: 10$
  • Bandwidth cost: 27.46$ 

Receive messages from Service Bus

  • Receiving messages: 10$
  • Bandwidth cost: 0$ (we are in the same data center)

Worker role costs:

  • 4 medium worker roles: 8.64$

Remarks: From our results, we need 8h and 40 minutes to process 10.000.000 messages from Service Bus. In this time we included the warm up of each instance – 20 minutes. We calculate the cost of running 4 instances for 9 hours.
Windows Azure Table Storage:

  • Storage: 5$ (cost per month)
  •         Transactions:  2$

Remarks: In the transaction cost is included the cost of reading other data from Table Storage. Otherwise the cost of transaction to Table Storage would be maximum 1$ - because of batch support this value can be smaller.
The final cost of processing 10.000.000 messages and store them to Table Storage for 1 month is:

  • 63.1$ (when messages are send from on-premise servers)
  • 35.64$ (when messages are send from the same data center)

In theory, using this configuration, the price of each message processing would be 0.0003564$. What do you think about this cost? I would say that this is a pretty good price.
If we would need to process 10.000.000 every day, during a month, our final cost would be:

  • 924.2$ (when messages are send from the same data center)

In this post we saw what the costs of processing 10.000.000 messages are. Even if the costs look pretty good, I still have one thing that I don’t like - the time processing of all messages is pretty high – over than 1 hour and a half. In the next post we will see what we can do decrease the time processing.
Read More
Posted in Azure, service bus, Windows Azure | No comments

Friday, 12 April 2013

[Post-Event] AISEC Cluj-Napoca, Cloud and Windows Azure workshop

Posted on 07:30 by Unknown

This week I had the opportunity to be one of the trainers of AISEC Academy - http://academy.myaiesec.ro/despre/
I had 3 hours to talk about Cloud Computing and Windows Azure. My main scope was to make students understand what does cloud means from a software engineering perspective. In the second part of the workshop I tried to cover the most important features that are offered by Windows Azure.
I hope that students enjoyed these 3 hours and they will come in April 24, at my next workshop where I will talk about NoSQL.
The slides from my last session can be found here:
Cloud and Windows Azure from Radu Vunvulea
Read More
Posted in Azure, Cloud, eveniment, event, Windows Azure | No comments

Thursday, 11 April 2013

How to NOT do Web Services versioning (WCF)

Posted on 07:27 by Unknown
On the internet, there are a lot of companies that sell information or different functionalities that are exposed like as web-services. This week I had the “opportunity” to update a client application that use remote services from a 3rd part provider.
And now the story begins.
In the last 12 months, there were more than 9 new versions of the service that were roll out by the 3rd part. Not all the clients use the last version of the services of course, because of this they had to support also the old versions of the services.
What was their solution for this? To create for each version a new method exposed in the same endpoint and service. Because of this for an operation like GetDriver we had the following possible calls:
GetDriver(), GetDriver_V2(), GetDriver_V3(), 
GetDriver_V4(),GetDriver_V5(), GetDriver_V6(),
GetDriver_V7(), GetDriver_V8(),GetDriver_V9()
Imagine that this is happening for a lot of operations that are exposed. Beside this, not all the operations were updated, because of this, a part of operations have 9 versions, and other ones have 3 versions and so on.
GetDistance(), GetDistance_V2(), GetDistance_V3()

GetDriver(), GetDriver_V2(), GetDriver_V3(),
GetDriver_V4(),GetDriver_V5(), GetDriver_V6(),
GetDriver_V7(), GetDriver_V8(),GetDriver_V9()

UpdateCar(), UpdateCar_V2(), UpdateCar_V3(),
UpdateCar_V4(), UpdateCar_V5()
This is not the end of the story yet. Each operation has a response and a request. If we are working with GetDriver_V9 operation we may expect to have GetDriverRequest_V9 and GetDriverResponse_V9. The version of each request and response don’t have the same version as the operation that we use. Because of this we can have operation that would look something like this:
public GetDriverResponse GetDriver(GetDriverRequest request)
public GetDriverResponse GetDriver_V2(GetDriverRequest request)
public GetDriverResponse GetDriver_V3(GetDriverRequest_V2 request)
public GetDriverResponse GetDriver_V4(GetDriverRequest_V2 request)
public GetDriverResponse GetDriver_V5(GetDriverRequest_V3 request)
public GetDriverResponse_V1 GetDriver_V6(GetDriverRequest_V3 request)
public GetDriverResponse_V2 GetDriver_V7(GetDriverRequest_V3 request)
public GetDriverResponse_V1 GetDriver_V8(GetDriverRequest_V4 request)
public GetDriverResponse_V2 GetDriver_V9(GetDriverRequest_V4 request)
Working with a service like this can be a nightmare. I don’t want to imagine what will happen after 12 months, when they will have another 10 new versions.
In this moment the client proxy that is generated with svcutil.exe has almost 2MB and around 90k lines of codes (of course we can remove the unused services and operation). This can be a little funny, when the client application itself had no more than 2k lines of code.
When you need a versioning system, I would recommend thinking twice before starting implementing it. Not all the time, the simple solution is the best solution.
The first mistake was that we have only one service defined - we have operations with different functionalities under the same service. For example the same service offer different functionalities like:
  • Resolve addresses
  • Calculate distance
  • Track trucks
  • Manipulate trucks (CRUD operations)
  • Manipulate drivers (CRUD operations) 
  • Manipulate routes (CRUD operations)
  • Refuel history
  • Generate different reports 
I would expect to group each of operations under different services. We have different functionalities that don’t need to overlap.
When we would have a new version of the service we should offer a different endpoint for it. Another solution is to have under the same endpoint different versions of our service.
ww.myService.com/Services/v1/RoutesService
www.myService.com/Services/v1/RefuelService
www.myService.com/Services/v1/AddressResolverService
www.myService.com/Services/v2/RoutesService
www.myService.com/Services/v3/RoutesService
Also we can imagine different solution for this problem.
Another problem is how we can make obsolete the old versions of ours services.
In time we can have 100 clients that user V7, 8 clients that use V1, V2, V3, V4, V5, V6 and only 4 clients that use version V8 and V9. If we want to scale up with a specific version, than we need to have on all the servers that are behind the load balancer all the versions installed. We cannot have 10 servers with version V7 and 1 server that have the rest of the version.
I’m happy that tomorrow id Friday.
Read More
Posted in WCF | No comments

Tuesday, 9 April 2013

ITCamp 2013, May 23-24

Posted on 11:24 by Unknown

You should book in your calendar May 23st and May 24st. Why? There will be the 3th edition of ITCamp in Cluj-Napoca. This is the largest premium conference that is focused on Microsoft technologies in Romania.
During these two days there will be 3 different tracks: Private & Public Cloud, Development & Mobile and Architecture & Best Practices. You will find extremely interesting subject on every track. I already have problems to select at what sessions I want to participate.
If you want to participate at this event you can register at the following link http://itcamp.ro. There is a great Early Bird discount until April 21st.
At this conference I will have a session that is dedicate to messaging patterns over cloud infrastructure. If you will attend to my session you will discover different way to exchange messaging between enterprise applications.
See you in May at ITCamp.


Read More
Posted in Cluj, cluj-napoca, codecamp, eveniment, event, ITCamp, itspark | No comments

How to write unit-tests for async methods

Posted on 06:53 by Unknown

All developer that works with .NET heard about Task, async, await – Task Parallel Library (TPL). Great library when we need to write code that runs in parallel.
With TPL, writing code that run in parallel is pretty simple. This is great, but of course, all code that run in parallel need to be tested also – unit tests. Do you know how you need to write unit tests for async calls?
I so pretty strange way of unit tests for async methods. Some of them were ugly and complicated. Why? Because the unit test method is a sync one and there we try to run and wait a response from an async call. This is why we can end up with something like this:
        [TestMethod]
public void MoveFile_ExistingFile_ResultsFileMovedAndOriginalFileDeleted()
{
StorageFolder destinationFolder = null;

Task.Run(() => destinationFolder =
CreateFolderAsync(_originalFolder).Result)
.Wait();

var fileToMove = StorageHelper.CreateFile(_originalFolder,FileName);

Task.Run(() => _fileManipulator.MoveFileAsync(fileToMove, destinationFolder))
.Wait();

Assert.IsTrue(_fileManipulator.Exist(destinationFolder, FileName));
Assert.IsFalse(_fileManipulator.Exist(_originalFolder, FileName));
}
or
        private void SaveContent(byte[] originalContent)
{
Task saveTask = Task.Run(() => _applicationFileManager
.SaveAsync(FileName, originalContent));
saveTask.Wait();

}
What do you thing? Do you like to have in the unit tests calls to Task.Run(). Personal I don’t like this and for me is a big smell. Something we are doing wrong, we are missing something.
What we are missing is the way we are writing the unit test method. By default, when we are wring a unit test we define the unit test method in this way:
[TestMethod]
public void SomeTest() { }
This is okay for testing a sync call. But when testing async call we have more option. It would be nice to be able to have our test method as an async method. In this way we don’t need to call Task.Run().
The reality is that we can define a test method like this:
[TestMethod]
public async Task SomeTest() { }
Doing this we can call our async method as a normal method and test accordingly.
        [TestMethod]
public async Task MoveFile_ExistingFile_ResultsFileMovedAndOriginalFileDeleted()
{
StorageFolder destinationFolder = null;

destinationFolder = await CreateFolderAsync(_originalFolder)

var fileToMove = StorageHelper.CreateFile(_originalFolder,FileName);

await _fileManipulator.MoveFileAsync(fileToMove, destinationFolder);

Assert.IsTrue(_fileManipulator.Exist(destinationFolder, FileName));
Assert.IsFalse(_fileManipulator.Exist(_originalFolder, FileName));
}
This feature works only on Visual Studio 2012.
On Visual Studio 2010 we need to install a NuGet package called AsyncUnitTests-MSTest. This will allow us to use async and await in our unit test. We will need to replace the TestClass attribute with AsyncTestClass. This attribute is able to run normal tests also.

In this post we saw how easily we can run unit tests for async code, without having to hack our calls.

Read More
Posted in async, multitasking, test, unit test | No comments

Friday, 5 April 2013

Windows Azure Bootcamp at Cluj-Napoca, 27 April 2013

Posted on 05:08 by Unknown
Registration link

Codecamp is organizing in Cluj-Napoca the Windows Azure Bootcamp. This free event is part of the Global Windows Azure Bootcamp. The materials that will be used are based on Windows Azure Training Kit (each speaker may customize the training kits).
This one day deep dive class will get you up to speed on developing for Windows Azure. The class includes a trainer with deep real world experience with Windows Azure, as well as a series of labs so you can practice what you just learned.

Awesome. How much does it cost?
This event is FREE to the attendees.

What do I need to bring?
You will need to bring your own laptop and have it preloaded with Visual Studio 2010 or Visual Studio 2012 and the last Windows Azure SDK. Please do the installation upfront as there will be no time to troubleshoot installations during the day.

Is this for beginners?
Yes and no. The local trainers will use the Windows Azure Training Kit to guide you to the basics. We’ll also be running a massive scalability experiment that may bring one of the Windows Azure datacenters down!

Registration link

Agenda:
08:45 - 09:00 Registration

09:00 - 10:30  Hands-on Windows Azure Service Bus, Radu Vunvulea
Durring this hands-on lab we will discover how to manage topics and subscriptions on Service Bus. Working with messages, filters and death letters will be practice in details.

10:30 - 12:00 Operations and maintenance of Windows Azure applications, Mihai Tătăran
A short hands-on training with some of the tasks needed to be covered by the support team of an Azure application. Automatic deployments, updates, backups / recovery tasks, etc.

12:00 - 13:30 Building Windows 8 Applications using Windows Mobile Services, Mihai Dan Nadăș
In this hands-on lab you will learn how to combine the fluency of Windows 8 applications with the power of Windows Azure: From a Windows 8 Style UI application, you will consume an ASP.NET MVC 4 Web API service published in Windows Azure Web Sites, and store your data in a Windows Azure SQL Database. In addition, you will learn how to configure the Windows Push Notification Services (WNS) in your app to send toast notifications from your service to all the registered clients.

Registration link

Sponsors:








For any kind of information related to this event please contact Radu Vunvulea - vunvuleargmail.com

Read More
Posted in Azure, eveniment, event, Windows Azure | No comments

Coding Stories

Posted on 00:29 by Unknown
Parameter names
public void class Person 
{
…
public bool IsSimilar(Person person2) { … }
}
What do you think about the name of parameter name ‘person2’. Names of parameters, fields like xxx1, xxx2, xxx3 are not the best choice. In this case maybe a better name would be ‘otherPerson’.
Magic numbers
public void ValidatePhone(string phoneNumber)
{
… phoneNumber.Contains(“40”);
}
The “40” don’t’ say nothing to a reader. What this value represent, why is used and so on. If this value is used in only one place you should at least extract a constant in the body of method. In the case the same value is used in different places of the application, you should put this constraints in a common place.

Property names and enums
public class InvitesFilter
{
public bool SendByLetter { get; set; }
public bool SendBySms { get; set; }
public bool SendByMail { get; set; }
…
}
First of all, do we really need the ‘SendBy’ prefix? We already know that it is in invitation filter. You cannot send an invitation by receiving it.
Also, if we look closely, this should not be a class. This is clear an enum. If you need to support more than one value set, than you should use the ‘Flag’ attribute.
[Flag]
public void InvitesFilter
{
Letter = 1,
Sms = 2,
Mail = 4
}
Don’t forget to set numeric values to enum items that are power of 2.
Common component (assembly)
It is great to have a common component. But try to not mix the common items from UI with the rest of the classes that are common. For example we don’t want to have in this component all the classes plus some XAML. Even if the XAML is something that is used in 2,3 components, you should create a different component for this (xxx.UI.Common).

Property name
xxxCallbackArgs.IsUserCancel – this property is set to true in the moment when the given action was canceled by the user. The name of the property doesn’t transmit the same thing. If I don’t know the implementation, I would say that this property would tell me if the user was canceled. A better name would be HasCancelledByUser or IsCancelledByUser.

Singleton and static properties
There are a lot of places where I usually see something like this:
public class Foo
{
private Foo _instance;

public static Foo Instance
{
if ( _instance == null )
{
_instance = new Foo();
}
}
}
If we are in a multi-thread application, there can be a situation when two threads could be in the same time in the IF. A lock should be used after the IF check and another check need to be made – because during the period when we wait the lock another thread can create a new instance.
public class Foo
{
private Foo _instance;
private object _padLock = new Object();

public static Foo Instance
{
if ( _instance == null )
{
lock( _padLock )
{
if ( _instance == null )
{
_instance = new Foo();
}
}
}
}
}


Single Responsibility Principle
The User class has a property field. This property need to be encrypted, so the class ends up with two private methods used to encrypt and decrypt the password. Do you thing that we should have the implementation of this class defined in the User class?
I would say NO. We should have a different class that can encrypt and decrypt. Not only will the User class manage only the user information, but the encryption algorithm will be easier to test.

Read More
Posted in clean code | No comments

Thursday, 4 April 2013

(Part 3) Testing the limits of Windows Azure Service Bus

Posted on 05:03 by Unknown
In the latest post series about the limits of Windows Azure Service Bus, we saw that is the maximum number of messages that we can process through a single topic (1.000.000 messages every 30 minutes) and what kind of worker role we should use to process this messages in the optimum way (Medium size).
In this post I will try to respond to another question that is normal to appear when we are using a cloud solution.
Can I scale the number of instances that consume messages from the topic?
Environment:
Each message that was added to Service Bus was pretty small. We had around 100 characters in UTF7 and 3 properties added to each BrokeredMessage.
We run the tests with one; two and three subscribers with different filter rules and the result were similar.
Each message that is received from Service Bus required a custom action to be executed. This action is pretty complicated and consumes CPU power. Also the logic requires to access remote services (that are stored in the same data-center).
For all this tests we used a medium size worker role.
Action:
In the first phase we pushed on the topic 100.000 messages and measure how long it takes to process all the available messages. We tried to identify what is the best number of instances that we can have in parallel from the perspective of costs and time.
The next phase was to see detect what is the optimum number of messages that can be processed using the given number of instances that we found in the first phase.
Results:
Phase 1: We tried to process 100.000 of messages with different number of worker roles instances. The size of all instances was Medium. The results of these tests were:
  • 1 instance – 18 minutes and 10 seconds
  • 2 instance – 11 minutes and 40 seconds
  • 3 instance – 7 minutes and 15 seconds
  • 4 instance – 4 minutes and 15 seconds
  • 5 instance – 3 minutes and 20 seconds
  • 6 instance – 2 minutes and 59 seconds
  • 7 instance – 2 minutes and 27 seconds
  • 8 instance – 2 minutes and 5 seconds
We can observe that at while scaling up, the time decrease with around 30% percent until we reach 4-5 instances, when the time start to decrease more slowly. This happens because when a topic is intensive used, the response time increase. Don’t expect to have the same latency when the topic is hit 10 times per seconds or 1000 per seconds.
When calculating the price, we should take into account to different prices. The first price represents the cost of running N instances for the period of time when messages from topic are processed. The second price is the obsolete price, which represents the cost of running N instances for the minimum period of time – in the case of Windows Azure the smallest time unit is hour.
Taking all this things into account, we observed that 4 instance of medium size can process our messages in the shortest period of time with the best costs.
Having this “magic” number of instances and the size of them we made the next step. We measure how long it takes for our application that is deployed on 4 worker roles with medium size to process different number of messages. The results of this test were:
  • 100.000 messages – 4 minutes
  • 200.000 messages – 8 minutes
  • 300.000 messages – 11 minutes
  • 500.000 messages – 19 minutes
  • 1.000.000 messages – 34 minutes
  • 3.000.000 messages – 2 hours and 32 minutes
The results were pretty interesting. The performance is also the same until we reach a critical point. Do you remember the first post when I mentioned that we observe that 1.000.000 messages per 30 minutes seems to be the maximum number of messages that we can process in an optimum way?
This is the point when the performance starts to go down. We can observe that the difference between processing 1.000.000 messages and 3.000.000 messages is pretty big. From the time perspective the last test requested almost 4.5x more time.
At the end of the tests we decided to use only one worker role of medium size to see how long it takes to process different number of messages. The time results were:
  • 100.000 messages – 18 minutes
  • 200.000 messages – 32 minutes
  • 300.000 messages – 51 minutes
  • 500.000 messages – 1 hour and 31 minutes
  • 1.000.000 messages – 2 hour and 58 minutes
What I liked at this result it was how the duration increased. The duration time increases almost like the number of messages.
Conclusion
For our business problems we observed that having 4 worker roles of medium size of the same topic is the best configuration that we can have from time and costs perspective. This result is extremely important because we know where is the point when we need to scale in a different way.
In the next post related to this topic we will talked about costs.
Remarks: Usually all the duration values are rounded to minutes (without seconds and milliseconds). This does not mean that we don’t have these values.

Part 4
Read More
Posted in Azure, service bus, Windows Azure | No comments
Newer Posts Older Posts Home
Subscribe to: Comments (Atom)

Popular Posts

  • Service Bus Topic - Automatic forward messages from a subscription to a topic
    Windows Azure Service Bus Topic is a service that enables us to distribute the same messages to different consumers without having to know e...
  • CDN is not the only solution to improve the page speed - Reverse Caching Proxy
    I heard more and more often think like this: “If your website is to slow, you should use a CDN.” Great, CDN is THE solution for any kind of ...
  • Content Types - Level 6: Rich Media
    Level 6: Rich Media NOTE: This is part 7 of 7 and the conclusion of this continuing series; please see earlier posts for more background inf...
  • Publishing our CellCast Widget for iPad
    The rush has been on this week as our development team worked to design a new version of our CellCast Widget specifically for Apple's up...
  • Patterns in Windows Azure Service Bus - Message Splitter Pattern
    In one of my post about Service Bus Topics from Windows Azure I told you that I will write about a post that describe how we can design an a...
  • E-Learning Vendors Attempt to Morph Mobile
    The sign should read: " Don't touch! Wet Paint !" I had a good chuckle today after receiving my latest emailed copy of the eLe...
  • SQL - UNION and UNION ALL
    I think that all of us used until now UNION in a SQLstatement. Using this operator we can combine the result of 2 queries. For example we wa...
  • Cum sa salvezi un stream direct intr-un fisier
    Cred ca este a 2-a oara când întâlnesc aceasta cerința in decurs de câteva săptămâni. Se da un stream și o locație unde trebuie salvat, se c...
  • Task.Yield(...), Task.Delay(...)
    I think that a lot of person already heard about these new methods. In this post I want to clarify some things about these new methods that ...
  • Content Types - Level 4: Reference
    Level 4: Reference Materials & Static Content NOTE: This is part 5 of 7 in a continuing series; please see earlier posts for more backgr...

Categories

  • .NET
  • .NET nice to have
  • #if DEBUG
  • 15 iunie 2011
  • 15 octombrie 2011
  • 2011
  • abstracta
  • action
  • adaugare
  • ajax
  • Amsterdam
  • Android
  • aplicatii
  • App Fabric
  • Apple iSlate
  • array
  • as
  • ASP.NET
  • AsReadOnly
  • Assembly comun
  • async
  • Asynchronous programming
  • asyncron
  • Autofac
  • AutoMapper
  • az
  • Azure
  • Azure AppFabric Cache
  • Azure backup solution
  • Azure Storage Explorer
  • azure. cloud
  • backup
  • BCP utility
  • bing maps v7
  • BitArray
  • BlackBerry
  • blob
  • BlobContainerPublicAccessType
  • breakpoint
  • bucuresti
  • C#
  • cache
  • CallerMemberName
  • CellCast
  • Certificate
  • CES
  • change
  • ChannelFactory
  • clasa
  • classinitialize
  • clean code
  • click event
  • close
  • Cloud
  • Cluj
  • cluj-napoca
  • Code contracts
  • code retrat
  • codecamp
  • CollectionAssert
  • Compact Edition
  • compara
  • Comparer T .Default
  • CompareTo
  • comparison
  • comunitate
  • concurs
  • Conditional attribute
  • configurare
  • connection string
  • container
  • content type
  • control
  • Convert
  • convertAll
  • convertor
  • cross platform
  • CRUD
  • css
  • custom properties
  • custom request
  • DACPAC
  • Daniel Andres
  • data sync service
  • database
  • date time
  • datetime
  • debug
  • default
  • delegate
  • dependency injection
  • deploy
  • DeploymentItem
  • design patterns
  • Dev de Amsterdam
  • development stoage
  • dictionary
  • diferente
  • digging
  • director
  • Directory.Exist
  • disable
  • dispatcher
  • dispose
  • dropdown
  • dynamic
  • EF
  • email
  • encoding
  • entity framework
  • enum
  • enumerable
  • Environment.NewLine
  • error
  • error 404
  • error handling
  • eveniment
  • event
  • ews
  • excel
  • exception
  • exchange
  • exita
  • explicit
  • export
  • extension
  • field
  • File.Exist
  • finalize
  • fire and forget
  • Fluent interface pattern
  • format
  • func
  • GC.SuppressFinalize
  • generic
  • getdirectoryname
  • globalization
  • gmail
  • hackathon
  • Hadoop
  • handle
  • HTML
  • html 5
  • Html.ActionLink
  • http://www.blogger.com/img/blank.gif
  • HttpModule
  • IComparable
  • IE
  • ienumerable
  • IIS
  • image
  • implicit
  • import
  • int
  • internationalization
  • Internet Explorer
  • interop
  • Ioc
  • IP Filter
  • iPhone
  • iQuest
  • IStructuralEquatable
  • ITCamp
  • itspark
  • java script
  • javascript
  • July 2012
  • KeyedByTypeCollection
  • KeyNotFoundException
  • Kinect SDK
  • lambda expression
  • LightSwitch Microsoft Silverlight
  • linq
  • list
  • lista
  • lista servicii
  • liste
  • Live Connect
  • Live ID
  • load
  • localization
  • lock
  • m-learning
  • MAC
  • Mango
  • map
  • mapare
  • mapare propietati
  • messagequeue
  • meta properties
  • method
  • MethodImpl
  • Metro App
  • Microsoft
  • Microsoft Sync Framework
  • mlearning
  • mlearning devices
  • Mobile Apps
  • mobile in the cloud
  • mobile learning
  • mobile services
  • Mobile Web
  • mongoDb
  • monitorizare
  • msmq
  • multitasking
  • MVC
  • MVC 3
  • MVVM
  • namespace
  • nextpartitionkey
  • nextrowkey
  • Ninject
  • nivel acces
  • no result
  • normalize
  • nosql
  • null expcetion
  • null object pattern
  • NullReferenceException
  • OAuth API
  • office
  • offline
  • Open ID
  • openhackeu2011
  • operations
  • operator
  • optimization
  • option
  • outputcache
  • OutputCacheProvider
  • override
  • paginare
  • pagination
  • path
  • persistare
  • Portable Library tool
  • Post event – CodeCamp Cluj-Napoca
  • predicate
  • predictions
  • prezentare
  • process
  • proiect
  • property
  • propietati
  • query
  • ReadOnlyCollection
  • ReadOnlyDictionary
  • referinta
  • reflection
  • remote
  • reply command
  • request
  • request response
  • resouce
  • REST
  • REST Client
  • RESTSharp
  • ronua
  • rss
  • rulare
  • salvare in fisier
  • sc
  • schimbare timp
  • select
  • select nodes
  • send
  • serializare
  • serialization
  • Server.Transfer. Resposen.Redirect
  • service bus
  • ServiceBase
  • servicecontroller
  • sesiune
  • session
  • Session_End
  • Session_Start
  • setup
  • Sibiu
  • signalR
  • Silverlight
  • sincronizare
  • Single Responsibility Principle
  • SkyDrive
  • skype
  • smartphones
  • smtp
  • Snapguide
  • sniffer
  • socket
  • solid
  • spec#
  • sql
  • Sql Azure
  • SQL CE
  • sql server 2008 RC
  • SRP
  • startuptype
  • stateful
  • stateless
  • static
  • stergere
  • store
  • store procedure
  • stream
  • string
  • string.join
  • struct
  • StructuralEqualityComparer
  • submit
  • switch
  • Symbian
  • Synchronized
  • system
  • tabele
  • table
  • techEd 2012
  • tempdata
  • test
  • testcleanup
  • testinitialize
  • testmethod
  • thread
  • timer
  • ToLower
  • tool
  • tostring
  • Total Cost Calculator
  • trace ASP.NET
  • transcoding
  • tuplu
  • tutorial
  • TWmLearning
  • type
  • unit test
  • unittest
  • UrlParameter.Optional
  • Validate
  • validation
  • verificare
  • video
  • view
  • ViewBag
  • virtual
  • visual studio
  • VM role
  • Vunvulea Radu
  • wallpaper
  • WCF
  • WebBrower
  • WebRequest
  • where clause
  • Windows
  • windows 8
  • Windows Azure
  • Windows Azure Service Management CmdLets
  • windows live messenger
  • Windows Mobile
  • Windows Phone
  • windows service
  • windows store application
  • Windows Task
  • WinRT
  • word
  • workaround
  • XBox
  • xml
  • xmlns
  • XNA
  • xpath
  • YMesseger
  • Yonder
  • Zip

Blog Archive

  • ▼  2013 (139)
    • ►  November (17)
    • ►  October (12)
    • ►  September (10)
    • ►  August (7)
    • ►  July (8)
    • ►  June (15)
    • ►  May (12)
    • ▼  April (17)
      • Event-Driven message consumtion (aka pump model) ...
      • [Post-Event] Windows Azure Boot Camp in Cluj-Napoca
      • [Post-Event] AISEC Cluj-Napoca, NoSQL
      • Coding Stories III - JavaScript and Syntactic sugar
      • Coding Stories || - John and Gigel
      • WCF and "Error in deserializing body of reply mes...
      • Configuration files horror
      • Steam.CopyTo - Performance problems
      • Asynchronous Master Class, May 18-19, Cluj-Napoca
      • (Part 4) Testing the limits of Windows Azure Servi...
      • [Post-Event] AISEC Cluj-Napoca, Cloud and Windows ...
      • How to NOT do Web Services versioning (WCF)
      • ITCamp 2013, May 23-24
      • How to write unit-tests for async methods
      • Windows Azure Bootcamp at Cluj-Napoca, 27 April 2013
      • Coding Stories
      • (Part 3) Testing the limits of Windows Azure Servi...
    • ►  March (16)
    • ►  February (9)
    • ►  January (16)
  • ►  2012 (251)
    • ►  December (9)
    • ►  November (19)
    • ►  October (26)
    • ►  September (13)
    • ►  August (35)
    • ►  July (28)
    • ►  June (27)
    • ►  May (24)
    • ►  April (18)
    • ►  March (17)
    • ►  February (20)
    • ►  January (15)
  • ►  2011 (127)
    • ►  December (11)
    • ►  November (20)
    • ►  October (8)
    • ►  September (8)
    • ►  August (8)
    • ►  July (10)
    • ►  June (5)
    • ►  May (8)
    • ►  April (9)
    • ►  March (14)
    • ►  February (20)
    • ►  January (6)
  • ►  2010 (26)
    • ►  December (1)
    • ►  November (1)
    • ►  October (1)
    • ►  June (2)
    • ►  May (1)
    • ►  April (4)
    • ►  March (1)
    • ►  February (1)
    • ►  January (14)
Powered by Blogger.

About Me

Unknown
View my complete profile